sauvegarde les bases d'OpenStack et teste leur restauration chaque semaine

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Adam Belkacemi 2026-10-12 18:01:50 +02:00
parent 7b0a8583eb
commit b054888f5a
6 changed files with 136 additions and 5 deletions

View file

@ -9,7 +9,7 @@ déclenche `sauvegarde-dedibackup.service`, qui exécute
Le script :
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.
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. Depuis le 2026-10-12, les **bases d'OpenStack** aussi : export `mariadb-dump --single-transaction` de toutes les bases de Kolla sauf `mysql` (`openstack.sql`, ≈ 30 Mo avant compression ; mot de passe lu dans `/etc/kolla/passwords.yml`, passé par l'entrée standard).
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.
@ -78,7 +78,7 @@ lftp -u "$DEDIBACKUP_USER,$DEDIBACKUP_PASS" "$DEDIBACKUP_HOST" \
'
```
## Test de restauration du portail (automatique, chaque lundi 04:30)
## Test de restauration du portail et d'OpenStack (automatique, chaque lundi 04:30)
`/usr/local/sbin/syllabus-test-restauration` (rôle `sauvegardes`, minuteur
`syllabus-test-restauration.timer`) télécharge la dernière quotidienne, la
@ -97,6 +97,12 @@ ssh paillasse "journalctl -u syllabus-test-restauration --no-pager | tail -40"
Des écarts de comptage sont normaux si la production a changé depuis la
sauvegarde ; une table absente de la copie fait échouer le test.
Étape 6 du test (depuis le 2026-10-12) : `openstack.sql` est restauré dans un
second conteneur jetable (`mariadb:11.4`, même version que Kolla). Le test
échoue si une base ou un nombre de tables diffère de la production, ou si les
tables stables (`keystone.project`, `keystone.user`, `glance.images`,
`nova_api.flavors`) n'ont pas le même nombre de lignes.
## 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`.
@ -104,6 +110,34 @@ sauvegarde ; une table absente de la copie fait échouer le test.
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.
## Restaurer réellement OpenStack (sinistre)
Procédure écrite, **jamais jouée en vrai** (il faudrait un second serveur) ;
seule la restauration des bases dans un conteneur est testée chaque semaine.
1. Serveur reconstruit : playbooks `durcissement`, `reseau-openstack`, puis
remettre `/etc/kolla/` depuis l'archive (**`passwords.yml` identique**,
sinon les mots de passe en base ne correspondent plus) avant `kolla.yml`.
2. `kolla-ansible deploy` crée des bases vides et les comptes MariaDB.
3. Arrêter les services qui écrivent (`docker stop` des conteneurs `nova_*`,
`neutron_*`, `heat_*`, `glance_api`, `keystone*`, `placement_api`), puis
importer (le mot de passe ne passe ni en argument ni à l'écran) :
```
sudo docker cp openstack.sql mariadb:/tmp/openstack.sql
printf '[client]\nuser=root\npassword="%s"\nhost=10.10.0.1\n' \
"$(sudo awk '/^database_password:/{print $2}' /etc/kolla/passwords.yml)" \
| sudo docker exec -i mariadb sh -c 'umask 077; cat > /tmp/r.cnf;
mariadb --defaults-extra-file=/tmp/r.cnf < /tmp/openstack.sql;
rm -f /tmp/r.cnf /tmp/openstack.sql'
```
Redémarrer les conteneurs arrêtés.
4. Les **fichiers** des images Glance ne sont pas sauvegardés (seulement leur
fiche) : reconstruire `paillasse-debian` (`docs/runbooks/images.md`) et
supprimer l'ancienne fiche.
5. Les VM d'élèves n'existent plus sur le nouvel hôte : supprimer toutes les
stacks restantes (`openstack stack list`, puis `stack delete`) ; le stock
chaud se reconstitue seul.
## Restaurer un fichier (procédure testée le 2026-10-07)
```