Files
nas-runbooks/common/watchdog-tailscale-bridge-faux-timeout-restart-20260916.md
T

3.0 KiB

Watchdog tailscale-nyora-bridge : fausse alerte "echec apres redemarrage" (16/09/2026)

Contexte

tailscale-bridge-watchdog (cree le 05/09/2026, ticket infra-2026-09-019, jamais documente ni versionne depuis) surveille en continu SOCKS5/HTTP/SSH du pont tailscale-nyora-bridge. Sur 3 echecs consecutifs, il declenche une remediation automatique (docker restart bridge + stub bifrost), puis alerte Telegram si la remediation echoue.

Incident

Nuit du 15 au 16/09/2026 : SSH_RELAY timeouts intermittents (01h06, puis 01h16-01h18) -> seuil critique atteint -> 1er docker restart tailscale-nyora-bridge execute, mais NAS sous forte charge (load average ~8, swap 5.0Gi/13Gi utilise) -> le restart a depasse le timeout de 20s code en dur dans le script, tue avant confirmation -> health-check suivant echoue avec SOCKS5: [Errno -2] Name does not resolve (DNS Docker indisponible pendant la fenetre de redemarrage) -> alerte Telegram envoyee ("Echec apres redemarrage automatique"). Un 2e cycle de remediation automatique, 2 minutes plus tard, a reussi (restart en 13s cette fois) et le pont est reste sain en continu depuis. Aucune intervention manuelle n'etait donc necessaire sur le fond -- seulement une fausse alerte.

Cause racine

Le timeout de la commande docker restart tailscale-nyora-bridge dans bridge_watchdog.py (fonction sh(), defaut 20s) est trop serre pour ce conteneur (tailscaled + socat co-processes) des que le NAS est sous pression memoire/IO -- deja signale le 30/08 (swap 4.1Gi/13Gi), en aggravation le 16/09 (5.0Gi/13Gi, load 8.08).

Fix applique

  • watchdog/bridge_watchdog.py : sh("docker restart tailscale-nyora-bridge") -> timeout=45 explicite (au lieu du defaut 20s)
  • Attente post-remediation avant re-test : time.sleep(15) -> time.sleep(20)
  • Image rebuild + redeploiement, verifie healthy immediatement apres (check #1 OK)

Piege operationnel decouvert pendant le fix

docker compose up -d tailscale-bridge-watchdog (cible un seul service du compose) a recree tailscale-nyora-bridge (dependance depends_on) SANS le redemarrer, le laissant en etat Created (donc hors service, pont NAS<->VPS coupe brievement) pendant que le watchdog echouait a demarrer (conflit de nom sur l'ancien conteneur). Correction : docker start explicite du bridge, docker rm -f de l'ancien watchdog, puis docker compose up -d SANS filtre de service pour recreer proprement les deux dans l'ordre. A eviter a l'avenir : toujours faire un up -d complet du compose (pas cible sur un service ayant des dependances) quand un depends_on est en jeu.

A signaler

Le TS_AUTHKEY est en clair dans docker-compose.yml, desormais commite dans bolbol/tailscale-nyora-bridge (repo prive, pas de rotation faite -- a evaluer si ca merite un passage en .env/.secrets-staging comme les autres credentials).

Non traite (hors perimetre de ce fix)

Pression memoire/swap du NAS en aggravation (5.0Gi/13Gi de swap, load average 8.08 au moment de l'incident) -- cause racine plus large deja notee le 30/08/2026, necessite un audit dedie des conteneurs consommateurs.