Second Brain documentation

Sauvegardes et export

Ne rien perdre, et pouvoir tout reprendre ailleurs.

La procédure complète, avec tous les cas, est dans docs/sauvegardes.md du dépôt. Cette page en donne l’essentiel.

Sauvegardes planifiées

Un service Docker backup prend un instantané par jour (03:00, fuseau Europe/Brussels par défaut), plus un au premier démarrage :

  • db.dump : la base (pg_dump) ;
  • files/ : les fichiers, en liens physiques avec l’instantané précédent (seuls les nouveaux prennent de la place) ;
  • config/ en clair ;
  • blobs.tsv, backup.json, SHA256SUMS pour la vérification.

L’instantané est écrit sous un nom temporaire puis renommé : un instantané visible est toujours complet. Rotation par défaut : 7 quotidiens, 4 hebdomadaires, 6 mensuels. Un test de restauration automatique tourne chaque semaine dans une base jetable.

Activer :

# image complète : le service backup démarre avec l'application
docker compose --profile app up -d

# développement (backend sur l'hôte, fichiers dans ./data)
BACKUP_DATA_SOURCE=./data docker compose --profile backup up -d backup
Variable Défaut Rôle
BACKUP_PATH ./backups dossier des instantanés
BACKUP_TIME, BACKUP_TZ 03:00, Europe/Brussels créneau quotidien
BACKUP_KEEP_DAILY / _WEEKLY / _MONTHLY 7 / 4 / 6 rotation
BACKUP_RESTORE_TEST_DAYS 7 période du test de restauration (0 = jamais)

Restaurer

La restauration refuse une base ou un dossier de fichiers non vides. En résumé :

  1. sauvegarder l’état actuel si possible : docker compose run --rm backup backup.sh ;
  2. arrêter l’application, supprimer les volumes de la base et des fichiers (geste explicite) ;
  3. recréer une base vide : docker compose up -d db, sans démarrer l’application ;
  4. docker compose run --rm restore latest (ou le nom d’un instantané) : vérification, restauration en une transaction, copie des fichiers, contrôle des empreintes ;
  5. comparer config/ avec ./config.restauree, puis redémarrer.

Un instantané plus ancien que l’application se restaure : les migrations manquantes sont jouées au démarrage.

Export complet

Depuis la page Données, ou GET /api/export : une archive ZIP avec un Markdown à en-tête YAML par nœud, les fichiers d’origine, links.json, une copie de config/ et export.json (format 2 : liste des fichiers de chaque nœud). L’export lit un instantané cohérent de la base ; un seul export à la fois. C’est le format de sortie « sans verrouillage » : tout se relit dans un éditeur de texte.