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 documenté 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".
Le silence est l'état normal ici. Ce qui le rend acceptable n'est pas la doctrine mais
la preuve qu'aucune panne n'est passée dessous : c'est l'objet du
registre de mesure, qui compte le rapport signal/bruit et les
pannes vues avant toute alerte. Tout contrôle silencié ci-dessous doit figurer dans son
tableau ΔC — un bruit qui baisse parce qu'on a coupé une sonde n'est pas un progrès.
Principe
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-notify.sh | "Lynis: penny score X/100" pour score >= 70 | Silent (notifie uniquement si échec ou score < 70) — remplace lynis-weekly.sh, retiré le 2026-08-03 |
homelab_monitor clear_alert() | "Homelab Resolved : X is back to normal" | Silent (state file disparaît, logge dans $LOGFILE) |
| 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
- Sucre DOWN (canary Tailscale via
homelab_monitor.check_sucre_service) - Sucre drafter PR créé sur signal réel inconnu
- CT log nouveau sous-domaine (potentiel takeover)
digest-drift-check: l'amont a dépassé un digest épinglé (mensuel, informatif — aucune mise à jour n'est appliquée)
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.
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 :echo 'https://hc-ping.com/<UUID>' > /etc/homelab/healthchecks-urlchmod 0600 /etc/homelab/healthchecks-url
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
Un seul topic, depuis l'arrêt de sucre
Relevé le 2026-09-25 (docker exec ntfy ntfy access) : il n'y a qu'un topic, homelab.
Cette section en annonçait deux. C'était vrai tant que sucre tournait : le second portait ses propositions avec les rappels Approve/Deny, le premier le « boring critical », et le téléphone s'abonnait aux deux pour n'avoir qu'une boîte. Sucre est arrêté depuis le 2026-08-25 et le second topic est parti avec lui.
| Utilisateur | Accès sur homelab |
|---|---|
publisher | lecture-écriture — ce que les sondes utilisent |
phone | lecture seule — l'application iOS |
admin | rôle admin, tous topics |
fish | écriture seule — vestige de sucre, voir ci-dessous |
L'utilisateur fish — le nom de sucre avant son renommage du 2026-07-06 — existe
toujours, avec un jeton fish-lxc105 qui n'expire jamais et un accès en écriture sur
homelab. Dernier usage : le 2026-08-25, le jour de l'arrêt.
Un service décommissionné laisse donc derrière lui une capacité d'écriture valide sur le
canal d'alerte du homelab. Rien ne l'a signalé, parce qu'un jeton inutilisé ne fait
pas de bruit — le miroir exact de ce que surveille guardrail-liveness, qui ne sait
repérer que ce qui se tait alors qu'il devrait parler.
docker exec ntfy ntfy token list fish # constater
docker exec ntfy ntfy user del fish # après avoir verifie que rien ne l'utilise
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.