Skip to main content

Backup et recovery

Backup et recovery

Dernière mise à jour : 2026-05-10

⚠️ À COMPLÉTER

Aucune stratégie de backup applicative n'est implémentée dans le code (pas de script scripts/backup.sh, pas de cron dans src/cron/, pas de doc dans ARCHITECTURE.md / CONTRIBUTING.md).

La protection des données dépend actuellement entièrement de la stratégie Unraid native (RAID + parity + snapshots ZFS si activé sur le pool appdata).

À clarifier / décider :

  • Pool storage : appdata est-il sur cache SSD ZFS avec snapshots, ou sur array (parity + array disks) ?
  • Snapshots ZFS : si oui, fréquence ? Rétention ?
  • Backup off-site : il y a-t-il un backup vers un autre Unraid / cloud ?
  • Périodicité testée : as-tu déjà testé un restore ? Quand ?

Données à protéger

Quoi Volume Critique ?
SQLite (database.db) /mnt/user/appdata/boardgame-referee/data/database.db ~10-50 MB Élevé : users, jeux, questions, feedbacks
PDFs uploadés /mnt/user/appdata/boardgame-referee/pdfs/*.pdf 100 MB - quelques GB Élevé : irrécupérables si perdus (à moins d'avoir l'original)
PNG rendus /mnt/user/appdata/boardgame-referee/pdfs/images/ Quelques GB Faible : régénérables via pdftoppm
Caches JSON /mnt/user/appdata/boardgame-referee/data/{ocr,contexts,conflicts}-*-<slug>.json Quelques MB Moyen : régénérables via Claude (mais cher en quota)
Data sources cartes /mnt/user/appdata/boardgame-referee/data/{magic,lorcana,terraforming-mars,ark-nova}-cards/ Quelques GB Moyen : re-téléchargeables sauf TM/Ark Nova qui sont locaux statiques
Card image cache /mnt/user/appdata/boardgame-referee/data/card-images-cache/ Quelques GB Faible : régénérable sharp depuis CDN
Qdrant collections /mnt/user/appdata/boardgame-referee/qdrant/storage/ Quelques GB Élevé : ré-ingestion = qq heures + quota Claude
Clé SSH oracle /mnt/user/appdata/boardgame-referee/ssh/id_ed25519 <1 KB Critique : sans elle, plus d'oracle SSH
NPM config /mnt/user/appdata/nginx-proxy-manager/ Quelques MB Élevé : recréer manuellement long

Recommandations (à valider)

Niveau minimum

  1. SQLite : sqlite3 .backup quotidien vers un autre disque ou cloud
  2. PDFs : rsync vers un autre disque ou cloud (ils sont irrécupérables)
  3. Clé SSH oracle : copie sur un support sécurisé (Bitwarden chiffré ou USB)

Niveau confortable

  1. Qdrant snapshots : pris au moment des grosses ré-ingestions (cf. deploiement/rollback.md pour les commandes)
  2. Caches JSON : optionnel, ils valent juste ce qu'ils ont coûté en quota Claude
  3. NPM config : backup database.sqlite NPM quotidien

Snapshots Qdrant

Manuel pour l'instant :

# Snapshot d'une collection
curl -X POST http://192.168.10.100:6333/collections/<collection>/snapshots
# Renvoie un nom de snapshot

# Liste les snapshots
curl http://192.168.10.100:6333/collections/<collection>/snapshots

# Télécharger un snapshot pour archive
curl -O http://192.168.10.100:6333/collections/<collection>/snapshots/<snapshot-name>

Restore SQLite

# Stop le container
docker compose -f /mnt/user/appdata/boardgame-referee/docker-compose.yml stop app

# Restore depuis backup
cp /backup/path/database.db.bak /mnt/user/appdata/boardgame-referee/data/database.db
# Ou si WAL : restore aussi .db-wal et .db-shm

# Restart
docker compose -f /mnt/user/appdata/boardgame-referee/docker-compose.yml up -d app

Restore Qdrant

# Re-create la collection depuis le snapshot
curl -X PUT http://192.168.10.100:6333/collections/<collection>/snapshots/recover \
  -H "Content-Type: application/json" \
  -d '{"location": "<snapshot-url>"}'

Test de restore

⚠️ Une procédure de restore non testée n'existe pas. Quand tu as une stratégie de backup en place, force-toi à tester un restore au moins une fois par trimestre :

  1. Sur un container test sur Unraid avec un volume vide
  2. Restore SQLite + Qdrant
  3. Vérifier qu'on peut login + voir les jeux + reposer une question

Questions à toi (Thymon)

  • Quel est ton workflow Unraid actuel pour appdata ? (RAID? Snapshots? Off-site?)
  • As-tu déjà perdu un fichier sur ce projet ? (incident antérieur qui a forcé un fix)
  • Veux-tu qu'on ajoute un script de backup applicatif (sqlite3 .backup + rsync PDFs) en cron sur Unraid ?