Self-host
Run the open-source core on your own server. AGPL-3.0, free, no time limit.
Run it
git clone https://github.com/upcontrol-io/upcontrolcd upcontrol/infra./install.sh
- Docker with Compose v2.
- 1 GB of RAM. 512 MB plus swap is the minimum; the installer stops below it.
- 10 GB of free disk.
The installer asks four questions (internet-facing? domain? SMTP? Telegram?), writes .env, pulls the images and waits until the app is healthy. --from-source builds the images from your checkout; --update pulls and restarts.
Configure
- Auth:
UC_AUTH=noneby default, which means one owner account and no sign-in. Fine for a private box. Internet-facing? SetUC_AUTH=magic-link, or anyone who reaches the app is the owner. - Without SMTP, sign-in codes go to the log:
docker compose logs ucapi | grep "sign-in code". - TLS: set
UC_DOMAINfor a real certificate. Without it, Caddy signs with its own CA, andPOST /ialso answers on plain HTTP so the SDK works anyway. - Project name, ingest key, Telegram bot and SMTP relay live under Settings in the app. No restart needed.
What you get
- Website checks every minute, heartbeats, log ingest, incidents with their log lines, alerts to Telegram and your SMTP, public status pages.
- Not included: billing, hosted email and the multi-region probe fleet. Your instance checks from one probe on your box and never phones home.
- The SDK and CLI are MIT, so they are safe to ship inside your app.
Keep it running
- Logs live in daily partitions and are dropped after your widest window plus 24 hours, so disk stays bounded. Events (deploys, webhooks,
track()) are kept with no limit; they are small. - Backups:
docker compose exec postgres pg_dump -U upcontrol upcontrol > upcontrol.sql, plus a copy ofsecrets/. Withoutsecret_key_hex, the encrypted columns can't be read.
Don't run it on the server it watches
When that server goes down, so do your monitor and your status page. Point one free hosted check at your instance.