Skip to content

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

  1. Přistup na https://100.112.158.91 (Tailscale) nebo http://127.0.0.1:3001
  2. Vytvoř admin účet
  3. 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 — 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.