Monitoring¶
What we watch¶
| Layer | Tool | Where |
|---|---|---|
| Public endpoints | Uptime Kuma (36 monitors) | joaoluisbrazao.cloud/uptime/ via SSH tunnel |
| Container health | Docker healthchecks | docker ps shows (healthy) |
| Runtime security | Falco | container logs + Telegram |
| Antivirus | ClamAV | scheduled scans, results to Telegram |
| LLM spend | LiteLLM proxy | litellm dashboard, cost cap enforced |
| Skill execution | command_runs table |
joaoluisbrazao.cloud/admin/runs |
| Disk/RAM/CPU | Telegram hourly health report | @DownRabbitbot |
| Brain ingestion | Brain Q&A panel | brain.joaoluisbrazao.com |
Alert routing¶
Everything actionable goes to Telegram chat @DownRabbitbot (CHAT_ID 1827458013).
- Silent = OK (no news is good news)
- A message means something happened that a human should look at
- Daily health summary lands at 08:00 UTC every day
- Hourly heartbeat from
infra-telegram-webhook
SLO targets¶
Informal — no formal SLOs are signed off yet.
| Service | Target | Reality |
|---|---|---|
| Brain Q&A | 99% during business hours | currently met |
| Vikunja | 99.5% always | currently met |
| Gamine public site | 99% | known issue: gamine-app was restart-looping on 2026-05-11 |
| Forgejo | 99.5% | currently met |
Runbook integration¶
When Uptime Kuma trips a monitor, the alert text should link to a runbook in runbooks/. If the runbook does not exist yet, the on-call should write one after resolving the incident.
What we do not monitor (yet)¶
- Application-level error rates (no APM in place — Sentry deferred)
- Database query latency
- nginx 5xx rates
- TLS cert expiry beyond the 60-day automatic renewal cycle (Telegram alert is set for 7 days before expiry)