10f249a2ae2fb208af27186f243fca082daa0d5e
Screenshots capture 4 views: monitors dashboard (hero), detail panel, alerts tab, and logs tab. Includes VHS tape, demo seed config, and setup script for reproducible captures. Also fixes latencySparkline to color DOWN checks red instead of green — previously failed checks with 0ms latency rendered as green bars.
uptop
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.
Built on the foundation of RDGames/go-upkeep.
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:
/metricsendpoint 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/uptop/main.go
ssh -p 23234 localhost
Seed some demo data to see it in action:
go run cmd/uptop/main.go -demo
Install
From source
go install gitea.lerkolabs.com/lerko/uptop/cmd/uptop@latest
Docker
docker pull lerko/uptop:latest
docker run -p 23234:23234 -p 8080:8080 -v ./data:/data lerko/uptop
Binary
Download from Releases.
Config as code
Export your current monitors:
uptop export -o monitors.yaml
Apply a config file:
uptop apply -f monitors.yaml
uptop apply -f monitors.yaml --dry-run # see what would change
uptop 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:
- UPTOP_DB_TYPE=sqlite
- UPTOP_DB_DSN=/data/uptop.db
- UPTOP_STATUS_ENABLED=true
- UPTOP_CLUSTER_SECRET=change-me
First run: attach to the container (docker attach uptop), 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 |
|---|---|---|
UPTOP_PORT |
23234 |
SSH server port |
UPTOP_HTTP_PORT |
8080 |
HTTP server port (status page, push, metrics) |
UPTOP_DB_TYPE |
sqlite |
sqlite or postgres |
UPTOP_DB_DSN |
uptop.db |
Database path or connection string |
UPTOP_STATUS_ENABLED |
false |
Enable public status page |
UPTOP_STATUS_TITLE |
System Status |
Status page title |
UPTOP_CLUSTER_MODE |
leader |
leader or follower |
UPTOP_PEER_URL |
Leader URL for follower nodes | |
UPTOP_CLUSTER_SECRET |
Shared key for cluster + API auth | |
UPTOP_INSECURE_SKIP_VERIFY |
false |
Skip TLS verification for checks |
Migrating from Uptime Kuma
Export your Kuma backup JSON, then:
curl -X POST http://localhost:8080/api/import/kuma \
-H "X-Upkeep-Secret: your-secret" \
-H "Content-Type: application/json" \
-d @kuma-backup.json
License
MIT — see LICENSE.