# Sauvegarde & restauration — VraiDocs (SEC-25)

> La valeur de la plateforme repose sur ses **clés de signature**. Ce document
> est aussi important que le code. À lire **avant** la mise en production.

## Ce qui doit être sauvegardé

| Élément | Contenu | Sans lui… |
|---|---|---|
| **Base de données** (MySQL) | documents, signatures, **clés publiques**, comptes, audit | tout est perdu |
| **`storage/app/`** | **clés privées chiffrées** (`.../keys/`), photos et justificatifs chiffrés | on ne peut plus **signer** de nouveaux documents ; photos/justificatifs illisibles |
| **Secrets** : `APP_KEY`, `DOCUMENT_KEY_SECRET` | déchiffrent respectivement les fichiers/sessions et les clés privées | la BD + `storage/` deviennent **indéchiffrables** |

> Architecture : la **clé publique** (vérification) est en base ; la **clé privée**
> (signature) est un **fichier chiffré** dans `storage/app/.../keys/`, déchiffré par
> `DOCUMENT_KEY_SECRET`. Vérifier un document existant ne dépend que de la clé
> publique ; **signer** de nouveaux documents dépend de la clé privée + du secret.

## Règles d'or
1. **Séparer les secrets des données.** Stockez `APP_KEY`/`DOCUMENT_KEY_SECRET` dans un
   coffre (gestionnaire de secrets, ou papier en coffre-fort), **jamais** dans le même
   emplacement que les sauvegardes BD/`storage`. Une fuite de la seule BD ne doit rien compromettre.
2. **Chiffrer les sauvegardes** au repos et en transit.
3. **Conserver hors-site** (règle 3-2-1 : 3 copies, 2 supports, 1 hors-site).
4. **Tester la restauration** régulièrement — une sauvegarde non testée n'existe pas.

## Sauvegarde quotidienne (exemple)
```bash
DATE=$(date +%F)
DEST=/backups/vraidocs/$DATE
mkdir -p "$DEST"

# 1) Base de données
mysqldump --single-transaction --routines vraidocs \
  | gzip > "$DEST/db.sql.gz"

# 2) Fichiers privés (clés privées, photos, justificatifs)
tar czf "$DEST/storage-app.tar.gz" -C /var/www/vraidocs storage/app

# 3) Chiffrer l'archive (GPG) puis pousser hors-site
gpg --encrypt --recipient sauvegarde@votre-org "$DEST/db.sql.gz"
gpg --encrypt --recipient sauvegarde@votre-org "$DEST/storage-app.tar.gz"
# rsync/rclone "$DEST"/*.gpg vers le stockage hors-site
```
> Les secrets (`APP_KEY`, `DOCUMENT_KEY_SECRET`) ne sont **pas** dans ce script :
> ils sont sauvegardés séparément, une seule fois, dans un coffre.

## Restauration (procédure testée)
```bash
# 0) Même version applicative + le .env contenant APP_KEY et DOCUMENT_KEY_SECRET d'origine
# 1) Base
gunzip < db.sql.gz | mysql vraidocs
# 2) Fichiers
tar xzf storage-app.tar.gz -C /var/www/vraidocs
# 3) Vérifs
php artisan migrate --force            # aligne le schéma si besoin
php artisan config:clear
```
### Test de validation (à faire après chaque test de restauration)
- [ ] Connexion super-admin OK.
- [ ] Vérification d'un **document existant** → « authentique » (clé publique OK).
- [ ] **Émission d'un nouveau document** pour un émetteur existant → réussit
      (clé privée déchiffrée via `DOCUMENT_KEY_SECRET` — prouve que secret + `storage/` sont cohérents).
- [ ] Affichage d'une **photo** de titulaire → déchiffrée (prouve `APP_KEY` cohérent).

## En cas de compromission suspectée d'une clé
- Révoquer/roter la clé de l'émetteur concerné : `php artisan cles:roter {emetteur}`.
- Les documents déjà émis avec l'ancienne clé restent vérifiables (clé publique conservée, statut « retirée »).
