# 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}-*-<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

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

## Snapshots Qdrant

Manuel pour l'instant :

```bash
# 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

```bash
# 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

```bash
# 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 ?