Notification hygiene — mode "uniquement quand ne va pas"¶
Pas un sujet glamour mais critique : un homelab qui bipe trop = un homelab dont les vrais signaux passent inaperçus. Au bout d'un mois de "Backup OK" quotidien, tu silences le ntfy et tu rates le vrai "Backup FAILED".
Cette page documente le mode opérationnel actuel (depuis 2026-05-04) : silence sur les success, signal uniquement sur les pannes, avec un canary externe pour distinguer "tout va bien" de "penny est mort".
Principe¶
Mode normal (penny + tout green) → 0 notif
Quelque chose casse → 🚨 notif sur le phone
Penny meurt → healthchecks.io te bipe externe
Ce qui est silencié (mode "boring runs silent")¶
| Source | Avant | Maintenant |
|---|---|---|
homelab_monitor.sh heartbeat / 6h |
"penny heartbeat alive..." | Silent (file /var/lib/homelab_monitor/heartbeat update local) |
homelab_backup.sh |
"Backup OK Snapshot: X GiB" | Silent (lisible dans restic snapshots latest) |
vault-backup.sh (LXC 102) |
"Vault backup OK" | Silent |
logs-backup.sh (LXC 101) |
"logs backup OK" | Silent |
dnsfailover-backup.sh (LXC 100) |
"dns-failover backup OK" | Silent |
restic-check-monthly.sh |
"Restic check OK" mensuel | Silent |
restic-drill-monthly.sh |
"DR drill OK" mensuel | Silent |
lynis-weekly.sh |
"Lynis: penny score X/100" pour score >= 70 | Silent (notifie uniquement si échec ou score < 70) |
homelab_monitor clear_alert() |
"Homelab Resolved : X is back to normal" | Silent (state file disparaît, logge dans $LOGFILE) |
| Watchtower | "Maj auto OK : autoheal" quotidien | Silent (level=warn, template sans .Updated) |
| AdGuard 02:00 desync (faux positif PBS backup window) | "AdGuard desync → Resolved 1 min plus tard" | Silent (whitelist 02:00-02:05) |
| Loki/Grafana 02:30 | "DOWN → Resolved" pareil | Silent (whitelist 02:30-02:35) |
| CT log monitor | "134 new cert(s)" hebdo | Silent sauf nouveau sous-domaine jamais vu |
Ce qui reste — vrai signal¶
- Backup FAILED (main, vault, logs, dns-failover, restic-check, DR-drill)
- Lynis échec ou score < 70
- Containers DOWN (hors window backup PBS)
- SSD disconnect / recovery
- fail2ban bans IP
- AdGuard desync hors window backup
- Fish DOWN (canary Tailscale via
homelab_monitor.check_fish_service) - Fish drafter PR créé sur signal réel inconnu
- CT log nouveau sous-domaine (potentiel takeover)
- Watchtower échec maj OU container marqué
monitor-onlyavec nouvelle version
Healthchecks.io — le canary externe¶
Le silence des success crée un trade-off : silence côté ntfy = penny vivant OK… ou penny mort. Indistinguable côté phone.
Solution : ping externe.
homelab_monitor.sh (cron 1 min) ──► healthchecks.io ping
│
si penny ping pas pendant grace period
▼
healthchecks fire ntfy externe
▼
phone bipe
Setup one-shot¶
- Créer un compte free sur https://healthchecks.io (free tier 20 checks)
- New check :
- Period 5 min
- Grace 10 min
- Notification : ntfy webhook ou email
- Copier l'URL du check (
https://hc-ping.com/<UUID>) sur penny :
homelab_monitor.sh ping silencieusement à chaque tick (1 min). Si fichier absent → ping skipped sans erreur (no-op safe).
Alerte¶
Quand penny stoppe de pinger > 10 min : - healthchecks.io passe le check de "up" → "down" - Notification fire (email + ntfy webhook configurable) - Tu sais que penny est mort, pas juste que "rien à signaler"
Logs persistents (post-DietPi RAMlog fix)¶
DietPi a INDEX_LOGGING=-1 qui truncate /var/log/* chaque heure xx:17 via /etc/cron.hourly/dietpi. Sur SSD c'est inutile, et ça empêche le forensic post-incident.
Fix appliqué 2026-05-04 : les logs des scripts homelab pointent maintenant vers /mnt/ssd/log-homelab/ (SSD persistent, hors tmpfs DietPi) :
| Script | Log file persistent |
|---|---|
homelab_monitor.sh |
/mnt/ssd/log-homelab/homelab_monitor.log |
homelab_backup.sh |
/mnt/ssd/log-homelab/homelab_backup.log |
ct-log-monitor.sh |
/mnt/ssd/log-homelab/ct-monitor.log |
lynis-weekly.sh |
copie /var/log/lynis* vers /mnt/ssd/log-homelab/ post-run |
/var/log/* reste tmpfs DietPi (intentionnel pour les services système). Seuls les logs homelab sont dur-disque.
Vérification rapide¶
# Penny vivant + heartbeat récent ?
ls -la /var/lib/homelab_monitor/heartbeat
date -d @"$(cat /var/lib/homelab_monitor/heartbeat)"
# Healthchecks pinged récemment ?
grep -c "homelab_monitor.sh" /var/log/syslog 2>/dev/null
# Logs persistents OK ?
ls -la /mnt/ssd/log-homelab/
# Dernière notif fail2ban / monitor (si elle a fired) ?
tail -50 /mnt/ssd/log-homelab/homelab_monitor.log | grep ALERT
Pourquoi 2 topics ntfy¶
Voir Fish observability — c'est lié au callback flow Approve/Deny du drafter fish. Topic 1 = boring critical, Topic 2 = fish proposals avec callbacks. Phone subscribe les 2 = un seul inbox unifié pour le user.
Réactiver une notification¶
Si tu trouves qu'un silence va trop loin (e.g., tu veux "Lynis OK score X/100" pour le rassurance hebdo), il suffit de retirer le SHOULD_NOTIFY=false ou la garde dans le script concerné. Tous les changements sont commités sur homelab-config, easy revert.