Runbook — Base de données tenant corrompue¶
Sévérité : Critique (perte de données potentielle)
Temps de résolution attendu : 30 à 90 min
Symptômes¶
- Logs backend :
ERROR: relation "X" does not existoudatabase is corrupt - GlitchTip : pics d'erreurs Prisma sur un tenant précis
- Cavaliers/concours qui disparaissent inexplicablement
Diagnostic¶
```bash
Identifier le tenant¶
ssh -p 2222 lcdm@192.168.1.41 sudo docker logs cm-backend-{slug} --tail 100
Vérifier la santé Postgres¶
sudo docker exec cm-db-{slug} pg_isready sudo docker exec cm-db-{slug} psql -U {user} -d {dbname} -c "SELECT count(*) FROM \"User\";" ```
Procédure de restauration¶
1. Identifier le dernier backup sain¶
bash
ssh lcdm@192.168.1.45
export RESTIC_PASSWORD_FILE=/home/lcdm/cavalbackup/restic-password
export RESTIC_REPOSITORY=/mnt/backups/serveur1 # ou 2/3/4 selon serveur
restic snapshots --tag {slug} | tail -5
2. Restaurer le dump¶
```bash
restic restore
Récupère le dump dans /tmp/restore/backups/...¶
```
3. Stopper le tenant + import¶
```bash
Sur .41 (ou serveur du tenant)¶
sudo docker compose -f /opt/cavalmanager/clients/{slug}/docker-compose.yml stop backend
Drop + recréer la DB¶
sudo docker exec -it cm-db-{slug} psql -U postgres -c "DROP DATABASE {dbname};" sudo docker exec -it cm-db-{slug} psql -U postgres -c "CREATE DATABASE {dbname} OWNER {user};"
Restore via scp depuis .45¶
scp lcdm@192.168.1.45:/tmp/restore/backups/{slug}-YYYY-MM-DD.sql.gz /tmp/ gunzip -c /tmp/{slug}-YYYY-MM-DD.sql.gz | sudo docker exec -i cm-db-{slug} psql -U {user} -d {dbname}
Redémarrer¶
sudo docker compose -f /opt/cavalmanager/clients/{slug}/docker-compose.yml up -d ```
4. Vérifier¶
bash
sudo docker logs cm-backend-{slug} --tail 30
curl https://{slug}.cavalmanager.fr/api/healthz
Communication client¶
Email type à envoyer immédiatement :
Bonjour, Un incident technique nous a contraint à restaurer votre base de données au dernier backup sain (du JJ/MM HH:MM). Les modifications saisies après cette heure peuvent avoir été perdues — merci de vérifier et nous contacter pour toute question. Toutes nos excuses, l'équipe CavalManager.
Prévention¶
- Vérifier que le test restore mensuel passe vert (cron
0 3 1 * *sur .45) - Si la corruption récurrente : envisager Postgres streaming replication pour le tenant concerné