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 Où 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}-*-.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 SQLite : sqlite3 .backup quotidien vers un autre disque ou cloud PDFs : rsync vers un autre disque ou cloud (ils sont irrécupérables) Clé SSH oracle : copie sur un support sécurisé (Bitwarden chiffré ou USB) Niveau confortable Qdrant snapshots : pris au moment des grosses ré-ingestions (cf. deploiement/rollback.md pour les commandes) Caches JSON : optionnel, ils valent juste ce qu'ils ont coûté en quota Claude 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//snapshots # Renvoie un nom de snapshot # Liste les snapshots curl http://192.168.10.100:6333/collections//snapshots # Télécharger un snapshot pour archive curl -O http://192.168.10.100:6333/collections//snapshots/ 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//snapshots/recover \ -H "Content-Type: application/json" \ -d '{"location": ""}' 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 : Sur un container test sur Unraid avec un volume vide Restore SQLite + Qdrant 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 ?