Runbook: Uptime Kuma — Status Page
Přehled
Uptime Kuma (status.studio60.cz) poskytuje jednoduchý status monitoring pro weby a služby. Veřejná status page pro klienty + alerting při výpadku.
Infrastruktura
- URL: https://status.studio60.cz (čeká na DNS fix → 178.104.40.167)
- Tailscale: https://100.112.158.91 (funguje hned)
- Server: sentinel (178.104.40.167)
- Port: 127.0.0.1:3001 (nginx proxy)
- Docker: /opt/uptime-kuma/docker-compose.yml
- Data: /opt/uptime-kuma/data/ (SQLite, zálohovat!)
- SSL: Zatím sentinel cert (Tailscale), po DNS fix vlastní cert
Správa
# Stav
cd /opt/uptime-kuma && docker compose ps
curl -s http://127.0.0.1:3001/
# Restart
cd /opt/uptime-kuma && docker compose restart
# Logy
docker logs s60-uptime-kuma --tail 50
# Upgrade
cd /opt/uptime-kuma && docker compose pull && docker compose up -d
# Backup dat
cp -r /opt/uptime-kuma/data/ /var/backups/uptime-kuma-$(date +%Y%m%d)/
Změna existujícího monitoru (URL, accepted codes)
Socket.io API je na edity nespolehlivé → jde se přes SQLite. Kuma drží monitory v paměti, takže se musí zapisovat do zastaveného kontejneru a pak nastartovat.
# 1. zastavit (restart: unless-stopped → docker start ho pak vrátí)
docker stop s60-uptime-kuma
# 2. změna v transakci; sqlite3 na hostu NENÍ, ale v image ANO → jednorázový kontejner
docker run --rm -i -v /opt/uptime-kuma/data:/data \
--entrypoint sqlite3 louislam/uptime-kuma:1 /data/kuma.db <<'SQL'
.bail on
BEGIN;
UPDATE monitor SET url='https://neco.cz/health' WHERE id=93;
COMMIT;
SELECT id, name, url FROM monitor WHERE id=93;
SQL
# 3. nastartovat
docker start s60-uptime-kuma
⚠️ Dot-příkazy (.bail, .mode) nejdou předat jako argument sqlite3 db "..." — skončí to
Error: near ".": syntax error. Musí jít na stdin (heredoc + docker run -i).
⚠️ Restart odpálí dávku notifikací. resendInterval=0 ⇒ Kuma posílá jen při změně stavu; restart
resetuje stav v paměti, takže všechny dlouhodobě rozbité monitory pošlou alert naráz. Není to výpadek.
Kvůli tomu se vyplatí změny dávkovat do jednoho restartu.
Dávka nepřijde hned: opravené monitory ohlásí UP do ~1 min, ale rozbité musí nejdřív vyčerpat
maxretries=3, takže DOWN alerty dorazí až za ~6 minut po startu. Měřeno 1. 8.: restart 05:28 →
4× UP v 05:28:56–05:29:35, pak 9× DOWN naráz v 05:34:58–05:35:14. Kdo to nevyčká, uzavře to
předčasně jako „dávka nepřišla".
⚠️ status v heartbeat: 0=DOWN, 1=UP, 2=PENDING, 3=MAINTENANCE. Po restartu jdou rozbité monitory
nejdřív do PENDING (dobíhají maxretries), takže WHERE status=0 hlásí falešnou nulu červených.
Vždy počítat status <> 1:
docker exec s60-uptime-kuma sqlite3 -header -column /app/data/kuma.db "
SELECT m.id, m.name, m.url FROM monitor m WHERE m.active=1
AND (SELECT h.status FROM heartbeat h WHERE h.monitor_id=m.id ORDER BY h.time DESC LIMIT 1) <> 1;"
⚠️ kuma.db má ~1,5 GB (bloat tabulky heartbeat) a v data/ leží další 2,3 GB starých .bak.
Plná kopie kvůli změně pár polí je nepoměr — pro malé zásahy psát rollback SQL se starými hodnotami
(vzor: rollback-kuma-monitors-20260801.sql).
Initial setup
- Přistup na https://100.112.158.91 (Tailscale) nebo http://127.0.0.1:3001
- Vytvoř admin účet
- Přidej monitory pro služby:
Doporučené monitory
| Služba | URL | Typ | Interval |
|---|---|---|---|
| S60Auth | https://auth.studio60.cz/api/health | HTTP | 60s |
| Pulse | https://pulselab.cz/health | HTTP | 60s |
| BillIt API | https://billit.cz/api/health | HTTP | 60s |
| Venom | https://venom.studio60.cz | HTTP | 60s |
| GlitchTip | https://errors.studio60.cz/_health/ | HTTP | 60s |
| N8N | https://n8n.studio60.cz | HTTP | 120s |
DNS
POTŘEBA: Změnit DNS status.studio60.cz z 49.13.168.234 (vypnutý starý sentinel — migrace 2026-08-27) → 178.104.40.167.
Po DNS fix: certbot certonly --webroot -w /root/projects/sentinel/certbot-webroot -d status.studio60.cz
⚠️ nginx.conf už public listen má — při migraci se v něm přepsalo všech 8 listen direktiv ze staré IP na novou (bez toho se sentinel-web cyklil na bind() … Address not available). Zbývá tedy jen DNS a cert.