lerko ca5a42314f feat(cluster): add probe execution mode, check extraction, and result aggregation
Phase 2 of distributed probing:
- Extract check logic into standalone RunCheck() for use by probes
- Add probe cluster mode: stateless nodes that fetch assignments, execute
  checks, and report results to the leader
- Add multi-node result aggregation with configurable strategy
  (any-down, majority-down, all-down)
- Leader ingests probe results into engine live state and triggers alerts
- New env vars: UPKEEP_NODE_ID, UPKEEP_NODE_NAME, UPKEEP_NODE_REGION,
  UPKEEP_AGG_STRATEGY
- Example docker-compose.probe.yml with leader + 2 regional probes
2026-05-16 11:19:57 -04:00

Go-Upkeep

Self-hosted uptime monitor with a TUI you can access over SSH. No browser, no install on the client — just ssh -p 23234 your-server.

Originally forked from RDGames/go-upkeep. This is an independent fork with significant additions.

What it does

  • 6 check types: HTTP, Push (heartbeat), Ping, Port, DNS, Groups
  • 9 alert providers: Discord, Slack, Email, Ntfy, Webhook, Telegram, PagerDuty, Pushover, Gotify
  • Config as code: define monitors in YAML, apply declaratively, version control your setup
  • HA clustering: leader/follower with automatic failover
  • Prometheus metrics: /metrics endpoint for Grafana dashboards
  • Public status page: HTML + JSON, toggle with an env var
  • SQLite or Postgres: SQLite for single-node, Postgres for production
  • Uptime Kuma import: migrate from Kuma with one command

Quick start

go run cmd/goupkeep/main.go
ssh -p 23234 localhost

Seed some demo data to see it in action:

go run cmd/goupkeep/main.go -demo

Config as code

Export your current monitors:

goupkeep export -o monitors.yaml

Apply a config file:

goupkeep apply -f monitors.yaml
goupkeep apply -f monitors.yaml --dry-run   # see what would change
goupkeep apply -f monitors.yaml --prune     # delete anything not in the YAML

See docs/config-as-code.md for the full reference.

Docker

services:
  monitor:
    build: .
    restart: unless-stopped
    stdin_open: true
    tty: true
    ports:
      - "23234:23234"
      - "8080:8080"
    volumes:
      - ./data:/data
      - ./ssh_keys:/app/.ssh
    environment:
      - UPKEEP_DB_TYPE=sqlite
      - UPKEEP_DB_DSN=/data/upkeep.db
      - UPKEEP_STATUS_ENABLED=true
      - UPKEEP_CLUSTER_SECRET=change-me

First run: attach to the container (docker attach go-upkeep), go to the Users tab, add your SSH public key. Then detach with Ctrl+P, Ctrl+Q and connect normally over SSH.

Environment variables

Variable Default What it does
UPKEEP_PORT 23234 SSH server port
UPKEEP_HTTP_PORT 8080 HTTP server port (status page, push, metrics)
UPKEEP_DB_TYPE sqlite sqlite or postgres
UPKEEP_DB_DSN upkeep.db Database path or connection string
UPKEEP_STATUS_ENABLED false Enable public status page
UPKEEP_STATUS_TITLE System Status Status page title
UPKEEP_CLUSTER_MODE leader leader or follower
UPKEEP_PEER_URL Leader URL for follower nodes
UPKEEP_CLUSTER_SECRET Shared key for cluster + API auth
UPKEEP_INSECURE_SKIP_VERIFY false Skip TLS verification for checks

License

MIT — see LICENSE.

S
Description
Live uptime monitoring dashboard for your terminal. SSH-accessible. HTTP, ping, TCP, DNS, push checks with alerts, clustering, and Prometheus metrics.
Readme MIT 2.2 MiB
2026.05.6 Latest
2026-05-30 23:34:56 +00:00
Languages
Go 99.7%
Dockerfile 0.3%