Documentation Index
Fetch the complete documentation index at: https://docs.snakysec.com/llms.txt
Use this file to discover all available pages before exploring further.
Test de restore E2E — runbook mensuel
Pourquoi ce test
Les backups Postgres (pgbackrest) + Vault (raft snapshot via restic) + artifacts (restic) tournent quotidien. Sans test régulier de restore, on ne sait pas s’ils sont restorables. Le RTO et RPO documentés dansdocs/dr/03-backup-strategy.md sont théoriques tant que personne n’a vérifié.
Le test E2E mensuel :
- Spin up des cibles éphémères (Postgres + Vault containers, volumes tmpfs, jamais persistés)
- Restore le dernier backup de chaque asset depuis OVH (fallback Scaleway si OVH down)
- Smoke test : compte les tables Postgres, vérifie que le snapshot Vault est intact, sample les artifacts
- Mesure le RTO réel + le RPO du backup utilisé
- Écrit un rapport markdown horodaté dans
docs/dr/test-restore-reports/YYYY-MM-DD.md
Cibles documentées
| Asset | RTO target | RPO target |
|---|---|---|
| Postgres | ≤ 4h | ≤ 24h (full quotidien + diff hourly post-V2) |
| Vault | ≤ 30min | ≤ 24h (snapshot quotidien) |
| Artifacts | ≤ 2h | ≤ 24h (restic quotidien) |
Quand le lancer
V1 — Manuel mensuel par l’opérateur (le 1er du mois, après les backups Sentinel).- Host cron (Linux/macOS) : ajouter à
/etc/cron.monthly/: - Windows Task Scheduler : tâche déclenchée le 1er du mois 06:00, action =
bash.exe scripts/dr/restore/test-full-restore.sh. - Ofelia : décommenter le job dans
platform/docker/ofelia/config.iniaprès avoir ajouté undr-test-runnerimage avec docker CLI + accès au docker.sock via socket-proxy.
Pré-requis
Avant de lancer le test :- Le stack pré-prod doit tourner :
make preprod. Au minimummssp-vaultetmssp-dr-runnerdoivent être up. - DR_BACKUPS_ENABLED=true au moins une fois dans le passé pour qu’il y ait des backups dans les buckets. Sinon le test détecte « no snapshot found » et exit en SKIP.
- Les credentials DR sont peuplés dans
mssp/dr/*(pas REPLACE_ME). Vérifier :Tous les fields doivent être set (pas REPLACE_ME, pas vides). - Les ports 5444 + 8244 doivent être libres sur l’host (utilisés par les containers éphémères du test).
Lecture d’un rapport
Formatdocs/dr/test-restore-reports/YYYY-MM-DD.md :
Overall status = OK+RTO < 4h+RPO < 24h→ Tout va bien, garde le rapport pour audit.Overall status = FAIL→ Au moins un asset n’a pas pu être restoré → §Troubleshooting.Status = SKIP→ Un asset n’avait pas de backup à restorer (typique en pré-prod si DR_BACKUPS_ENABLED a toujours été off).
Troubleshooting
”DR secret ‘mssp/dr/X’ is missing or REPLACE_ME”
Les credentials DR ne sont pas tous renseignés dans Vault. Lance :“Ephemeral Postgres did not become ready within 60s”
Soit l’imagepostgres:16-alpine n’est pas dispo, soit le port 5444 est occupé. Vérifier :
“Postgres restore appears empty (0 tables)”
Le restore pgbackrest ne s’est pas appliqué correctement. Causes courantes :- pgbackrest n’est pas pré-installé dans l’image
postgres:16-alpineéphémère utilisée pour le test (le script tenteapk addmais ça échoue offline). Mitigation V2 : utiliser l’image custommssp-postgres:16-pgbackrestqui a déjà pgbackrest baked in. - Le cipher pass diverge entre Vault et le backup (rotation accidentelle = backup illisible). Crisis : tu ne peux pas récupérer les backups antérieurs à la rotation.
“No restic snapshot found for vault”
Pas de snapshot Vault dans le bucket OVH. Vérifier :vault-snapshot.sh n’a jamais tourné avec succès. Force un run :
“RTO > 6h sur Postgres”
Le restore est lent. Causes possibles :- Le bucket OVH est congestionné ou la liaison Internet de l’host est limitée.
- Trop de WAL à rejouer depuis le full (post-Day 80 le WAL accumulé peut être volumineux).
- Le test tourne pendant que d’autres backups poussent en parallèle.
Sentry monitor dr-test-restore rouge
Le script appelle sentry_check_in dr-test-restore <status> à la fin (lecture du SENTRY_DSN dans le secret partagé). Si le monitor passe en rouge :
- Lire le rapport markdown du jour
- Reproduire en local :
bash scripts/dr/restore/test-full-restore.shà la main - Si rouge persistant > 2 mois consécutifs → escalation : la promesse de DR est cassée, faut reconstruire la chaîne de backup (full sync + verify).
Rétention des rapports
Les rapports sont versionnés dans Git (docs/dr/test-restore-reports/). Pas de purge — c’est notre piste d’audit pour les certifications futures (NIS2, ISO 27001 §A.17 plan de continuité). Coût stockage = négligeable (~5 KB par rapport, 12 par an).
L’index docs/dr/test-restore-reports/index.md peut être généré périodiquement :
Éviter les pièges
- Ne jamais lancer le test pendant un backup réel (collision OVH/Scaleway list operations). Le test est volontairement programmé après dr-verify (06:30 UTC) pour éviter le créneau full backup (02:00).
- Ne jamais ALTER les buckets OVH/Scaleway depuis le test. Read-only seulement. Si le test fait écrire = bug à fixer immédiatement.
- Le test ne valide PAS la chaîne de Shamir keyholders Vault — c’est un autre runbook (
docs/dr/01-keyholders.md) avec un test annuel manuel séparé.
Décisions historiques
| Date | Décision | Raison |
|---|---|---|
| 2026-05-02 | V1 = manual run, V2 = Ofelia integration via dr-test-runner image | Simplicité initiale, éviter docker-socket-proxy dans le scope V1 |
| 2026-05-02 | Vault restore = check intégrité du snapshot file (restic restore OK), pas apply complet dans ephemeral Vault | Apply nécessite Shamir unseal complexe, hors scope V1 |