Aller au contenu

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 exist ou database 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 --target /tmp/restore --include "/backups/{slug}*.sql.gz"

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é