Second Brain documentation

ADR 0081 – État des sauvegardes dans la barre d'état

Accepté (2026-10-16, mode autonome)

← Toutes les décisions

ADR 0081 – État des sauvegardes dans la barre d’état

Statut : Accepté (2026-10-16, mode autonome)

Idée de la vague 3 du document d’idées, reportée par l’ADR 0019 (« état des sauvegardes dans l’application ») : voir sans ouvrir un terminal que la dernière sauvegarde est récente et bonne.

Décision

  • Le service backup écrit déjà status.json (ADR 0019). Il en publie désormais une copie lisible par tous (chmod 644, écriture par fichier temporaire puis renommage) à chaque écriture de l’état et au démarrage du planificateur (un volume neuf ne reste pas vide), dans le dossier donné par BACKUP_STATUS_PUBLIC_DIR (volume nommé backup-status, monté en lecture seule dans l’application). Sans cette variable, rien ne change. Un échec de la copie ne fait jamais échouer une sauvegarde.
  • Le dossier des sauvegardes lui-même (umask 077, contient tous les documents en clair) n’est pas monté dans l’application : elle ne voit que cette copie.
  • GET /api/backup/status (lecture seule) lit ce fichier (app.backup.status-path, APP_BACKUP_STATUS_PATH ; vide en développement : configured: false, aucune pastille). Santé résumée, avec les mêmes règles que le healthcheck du service : seuls les états ok et running sont sains (failed : FAILED, warning : WARNING, autre : UNKNOWN) ; NEVER sans réussite ; STALE si la dernière réussite dépasse BACKUP_MAX_AGE_HOURS (26 h, comparé à la seconde) ; WARNING si le dernier test de restauration a échoué ou si une copie hors site existe dans l’état et que sa dernière réussite est absente ou plus vieille que BACKUP_OFFSITE_MAX_AGE_HOURS (50 h) ; sinon OK (une sauvegarde en cours garde la santé de la dernière réussite). Fichier absent : NEVER (« pas encore publié ») ; illisible, de plus de 64 Ko ou chemin qui est un dossier : UNKNOWN. Le détail (message, instantané, test de restauration, copie hors site) est renvoyé tel que le service l’a écrit.
  • La barre d’état affiche une pastille : « Sauvegarde il y a 3 h » discrète quand tout va bien, en gras avec un point d’alerte sinon (« Sauvegarde en échec », « Sauvegarde ancienne (il y a 2 j) », « Aucune sauvegarde »…), le détail en infobulle et au clic sur la pastille (clavier et toucher compris), dates en heure locale. Lecture au démarrage, au retour sur l’onglet et toutes les 15 minutes quand l’onglet est visible.

Alternatives écartées

  • Monter /backups dans l’application : donnerait à l’application (et à une faille de l’application) la lecture de toutes les sauvegardes en clair.
  • Sonde HTTP du service backup vers l’application (ou inverse) : un port et un secret de plus pour un fichier de quelques centaines d’octets.
  • Actuator health : la santé des sauvegardes ne doit pas rendre l’application « non prête » ni être publique.
  • Page dédiée : la pastille suffit tant que tout va bien ; le détail reste dans docs/sauvegardes.md.

Limites connues

  • Sans le volume partagé (backend lancé sur l’hôte en développement), la pastille est absente.
  • Aucune notification : la pastille se lit, elle ne prévient pas (l’alerte reste au déploiement, ADR 0019).
  • Hors ligne, l’âge affiché (« il y a 3 h ») ne bouge plus jusqu’à la relecture suivante.