Aller au contenu principal

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".

Ce mode se mesure, il ne se décrète pas

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​

Schéma agrandi
100 %

Ce qui est silencié (mode "boring runs silent")​

SourceAvantMaintenant
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" mensuelSilent
restic-drill-monthly.sh"DR drill OK" mensuelSilent
lynis-notify.sh"Lynis: penny score X/100" pour score >= 70Silent (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" pareilSilent (whitelist 02:30-02:35)
CT log monitor"134 new cert(s)" hebdoSilent 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.

Schéma agrandi
100 %

Setup one-shot​

  1. Créer un compte free sur https://healthchecks.io (free tier 20 checks)
  2. New check :
    • Period 5 min
    • Grace 10 min
    • Notification : ntfy webhook ou email
  3. Copier l'URL du check (https://hc-ping.com/<UUID>) sur penny :
    echo 'https://hc-ping.com/<UUID>' > /etc/homelab/healthchecks-url
    chmod 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) :

ScriptLog 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.shcopie /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.

UtilisateurAccès sur homelab
publisherlecture-écriture — ce que les sondes utilisent
phonelecture seule — l'application iOS
adminrôle admin, tous topics
fishécriture seule — vestige de sucre, voir ci-dessous
Un jeton d'écriture survit au service qui l'utilisait

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.