Monta /app/log sul disco video, sposta i cron log sullo stesso path, esclude log/ dal sync rsync e aggiunge pulizia volumi Docker obsoleti. Co-authored-by: Cursor <cursoragent@cursor.com>
4.5 KiB
4.5 KiB
Monitoraggio ops — Match Live TV
Sistema integrato per health check continui, analisi log, dashboard incidenti e notifiche push.
Componenti
| Componente | Ruolo |
|---|---|
Ops::HealthMonitorJob |
Sidekiq — health check ogni ~3 min |
Ops::HealthChecks |
Disco, DB, Redis, MediaMTX, Garage, Sidekiq, HTTP pubblico |
Ops::LogScanner |
Pattern regex su log Docker (cron ogni 10 min) |
Ops::Incident |
DB — incidenti con deduplicazione |
Ops::Notifier |
Push ntfy + email opzionale |
/admin/ops |
Dashboard incidenti |
GET /up/deep |
Health check esteso (JSON) |
Setup notifiche ntfy self-hosted (telefono)
Le push ops (disco pieno, Sidekiq, servizi giù) non passano da Firebase: Rails invia un POST al server ntfy incluso in docker-compose.prod.yml.
1. Server (Docker)
cd /opt/matchlivetv/infra
docker compose -f docker-compose.prod.yml --env-file .env up -d ntfy
Servizio in ascolto su LAN http://192.168.1.146:8090 (non esporre 8090 su Internet).
2. HTTPS (Nginx Proxy Manager)
Crea un Proxy Host (consigliato sottodominio dedicato):
| Campo | Valore |
|---|---|
| Domain | ntfy.matchlivetv.it |
| Forward | http://192.168.1.146:8090 |
| WebSockets | ON |
| SSL | Let's Encrypt |
In infra/.env:
NTFY_PUBLIC_URL=https://ntfy.matchlivetv.it
OPS_NTFY_TOPIC=matchlivetv-ops-eminux-a8f3b2 # topic segreto, a piacere
OPS_NTFY_URL=http://ntfy:80/matchlivetv-ops-eminux-a8f3b2
OPS_NOTIFY_SEVERITIES=critical,warning
OPS_NOTIFY_COOLDOWN_MINUTES=30
OPS_NTFY_URL usa il nome Docker ntfy (rete interna). Il telefono usa invece NTFY_PUBLIC_URL.
3. App sul telefono
- Installa ntfy (Android/iOS)
- Impostazioni → Default server (o «Usa altro server») →
https://ntfy.matchlivetv.it
In casa, in alternativa:http://192.168.1.146:8090 - + → iscriviti al topic
OPS_NTFY_TOPIC(es.matchlivetv-ops-eminux-a8f3b2) - Abilita notifiche per quel topic
4. Test
docker compose -f docker-compose.prod.yml exec -T rails bundle exec rails ops:test_notify
Dovresti ricevere una push «Test notifica ops» sul telefono.
Sicurezza
- Il topic è la «password»: usa un nome lungo e casuale, non pubblicarlo
- Opzionale: abilita auth su ntfy (
OPS_NTFY_TOKEN+ utente inuser.db) per topic protetti
Variabili ambiente
Vedi infra/.env.production.example.
| Variabile | Default | Descrizione |
|---|---|---|
OPS_NTFY_URL |
— | URL POST ntfy |
OPS_NTFY_TOKEN |
— | Bearer token (topic protetto) |
OPS_ALERT_EMAIL |
— | Fallback email |
OPS_HEALTH_INTERVAL_SECS |
180 | Intervallo health job |
OPS_HEALTH_TOKEN |
— | Token per /up/deep |
OPS_DISK_CRIT_PERCENT |
90 | Soglia critical disco |
OPS_LOG_SUBSCRIBER |
false | Cattura 500 in-process |
Cron produzione
cd /opt/matchlivetv/infra && bash scripts/install_production_cron.sh
| Schedule | Task |
|---|---|
| ogni 3 min (Sidekiq) | Ops::HealthMonitorJob |
*/10 * * * * |
scan_ops_logs.sh → ops:ingest_logs |
Uptime Kuma (consigliato)
Watchdog esterno se Rails è completamente giù:
- HTTP:
https://www.matchlivetv.it/up - HTTP deep:
https://www.matchlivetv.it/up/deep(headerX-Ops-Token) - TCP: porta 1935 (RTMP)
- Notifica: stesso topic ntfy
Workflow rilascio
cd backend && bundle exec rspec- Ciclo patch/test fino a 0 failure
git commit→git pushbash scripts/deploy/sync_to_server.sh- Rebuild:
docker compose -f docker-compose.prod.yml up -d --build rails sidekiq - Migrate:
docker compose exec -T rails bundle exec rails db:migrate - Cron:
bash scripts/install_production_cron.sh - (Opzionale)
bash scripts/cleanup_obsolete_volumes.sh— rimuove volumi Docker migrati - Smoke test:
curl -sf https://www.matchlivetv.it/upbundle exec rails ops:health_check(nel container)- Apri
/admin/ops
Sentry (opzionale)
Imposta SENTRY_DSN dopo bundle install. Gli errori creano anche incidenti ops.
Troubleshooting
| Problema | Azione |
|---|---|
| Nessuna push | Verifica OPS_NTFY_URL, test con ops:test_notify |
| Troppi alert | Aumenta OPS_NOTIFY_COOLDOWN_MINUTES, usa Mute 24h in admin |
| Sidekiq stale | Verifica container sidekiq e log Sidekiq |
| Log scanner vuoto | Controlla ${MATCHLIVETV_VIDEOS_ROOT}/log/cron-ops.log (es. /media/videos/matchlivetv/log/cron-ops.log) |