1. Archive `/etc`, `/home`, `/root` en `tar.zst` (streaming, sans fichier intermédiaire en clair), plus, depuis l'étape 13, le **portail** : export `mariadb-dump --single-transaction` de sa base (`portail.sql`, à la racine de l'archive), `/var/www/portail/.env` (APP_KEY) et `/var/www/portail/storage/app`. Avant le 2026-10-09, la base du portail n'était **pas** sauvegardée.
2. Chiffre le flux avec **age**, avec la clé publique du serveur (`/root/.age/cle-sauvegardes.txt`).
3. Envoie l'archive chiffrée en FTP vers Dedibackup (`dedibackup-dc3.online.net`, joignable uniquement depuis ce serveur).
4. Le dimanche (jour 7), duplique aussi l'archive du jour comme hebdomadaire.
5. Applique la rotation : garde les 7 quotidiennes et 4 hebdomadaires les plus récentes, supprime le reste sur Dedibackup (qui est limité à 1000 fichiers).
Le FTP de Dedibackup n'est pas chiffré en transport, mais le contenu de
l'archive l'est déjà (age) avant l'envoi : une interception du transfert ne
- Clé privée age : `/root/.age/cle-sauvegardes.txt`, permissions `600`. Elle ne quitte le serveur que pour la copie de secours d'Adam (ci-dessous), jamais vers Git ni ailleurs.
Des écarts de comptage sont normaux si la production a changé depuis la
sauvegarde ; une table absente de la copie fait échouer le test.
## Restaurer réellement le portail (sinistre)
1. Extraire l'archive dans un dossier temporaire (voir plus bas), puis `portail.sql` et `var/www/portail/.env`.
2. Redéployer le portail (`ansible-playbook portail.yml`) sur le serveur reconstruit ; remettre le `.env` restauré **avant** (APP_KEY identique, sinon sessions et données chiffrées perdues).
3. Importer la base : `docker exec -i portail_mariadb sh -c 'MYSQL_PWD="$MARIADB_ROOT_PASSWORD" exec mariadb -uroot' < portail.sql` (écrase la base `portail`).
4.`php artisan migrate --force`, puis vérifier une connexion prof.