Aller au contenu

Commandes

phil/backup-bundle

phil:backup:create

bin/console phil:backup:create
bin/console phil:backup:create --label=before-migration --no-media
OptionEffet
--label=LABELNomme le jeu <database>-<time>-<label> et le tient à l'écart de la rotation ; lettres minuscules, chiffres et -
--no-mediaSauvegarde la base de données seule
--no-rotateNe supprime aucun jeu expiré cette fois-ci

Elle écrit un nouveau jeu dans le répertoire — le fichier de base de données et, s'il y a des répertoires de médias, l'archive des médias, chacun chiffré lorsqu'une clé est configurée —, puis supprime les jeux que la rotation a fait expirer :

The postgresql database shop on db.internal is backed up in /srv/shop/var/backup/shop-20261107-031500.dump.enc.
The media files are archived in /srv/shop/var/backup/shop-20261107-031500.media.tar.enc.
The expired backup shop-20261031-031500 is removed.

Un échec — un outil absent, une base de données qui refuse la connexion, un répertoire où l'on ne peut pas écrire — est affiché, et la commande se termine avec 1 ; aucun fichier du jeu raté ne reste.

phil:backup:restore

bin/console phil:backup:restore --confirm
bin/console phil:backup:restore var/backup/shop-20261107-031500.dump.enc --confirm --database=shop
Argument ou optionEffet
fileLe fichier de base de données du jeu ; par défaut, le jeu sans étiquette le plus récent du répertoire
--confirmRestaure ; sans cette option, la commande dit seulement ce qu'elle remplacerait et par quoi
--database=NAMELe nom de la base de données saisi de nouveau ; demandé lorsque la console est interactive
--no-mediaRestaure la base de données seule
--pruneSupprime les fichiers médias que le jeu ne contient pas, une fois ses fichiers écrits ; désactivé par défaut

La protection des restaurations s'exécute d'abord ; chaque refus se termine avec 2 et ne change rien. Ensuite :

The current content is backed up in /srv/shop/var/backup/shop-20261107-104512-before-restore.dump.enc first.
The postgresql database shop on db.internal is restored from var/backup/shop-20261107-031500.dump.enc.
1284 media file(s) are restored from var/backup/shop-20261107-031500.media.tar.enc.

Avec --prune, les répertoires de médias sont ensuite laissés tels qu'ils ont été sauvegardés — les fichiers téléversés depuis sont supprimés, et se retrouvent dans le jeu fait d'abord :

12 media file(s) the backup does not hold are removed.

Une fois la restauration réussie, les jeux étiquetés before-restore sont supprimés, sauf les plus récents, au nombre de restore.keep_before_restore, trois par défaut. Chacun est nommé :

The older backup shop-20261101-091500-before-restore is removed.

Un échec après la garde se termine avec 1. Un échec de la sauvegarde faite d'abord arrête la commande avant la restauration.

phil:backup:verify

bin/console phil:backup:verify
bin/console phil:backup:verify var/backup/shop-20261107-031500.dump.enc

Elle teste un jeu — le fichier donné, ou le jeu sans étiquette le plus récent — sans toucher à la base de données :

The files of shop-20261107-031500 decrypt and authenticate.
The database of shop-20261107-031500 restores: it was restored into the postgresql database shop_restore_test on db.internal and checked.
The media archive of shop-20261107-031500 reads whole: 1284 file(s).

Une sauvegarde SQLite est restaurée dans un fichier temporaire et passe PRAGMA integrity_check. La sauvegarde d'un serveur est restaurée dans verify.database ; sans cette base, la commande le signale et teste le reste. Un échec se termine avec 1. Voir les tests de restauration de phil/backup (doc/restore-tests.md de ce paquet).

Planification

Le bundle ne planifie rien. Avec Symfony Scheduler, ou avec cron :

15 3 * * *  cd /srv/shop && bin/console phil:backup:create --quiet && bin/console phil:backup:verify --quiet

Copiez le répertoire hors de la machine après chaque sauvegarde — les jeux sont chiffrés, la clé reste sur place — et déclenchez une alerte sur un code de sortie non nul.

Une copie de la production pour travailler

bin/console phil:backup:create                                                 # in production
# copy the set to the other machine, then there:
bin/console phil:backup:restore /tmp/shop-20261107-031500.dump.enc --confirm --database=shop_dev

Le contenu local est sauvegardé d'abord, comme partout. Une copie qui contient des données de personnes est anonymisée avant d'être partagée ; phil/privacy-bundle s'en charge, et sa documentation donne la séquence complète.