Une version plus à jour, avec des sauvegardes vraiment distantes, est disponible ici :Sauvegardes chez les copain·e·s.
J'utilise BorgBackup et Borgmatic pour m'occuper de mes sauvegardes.
Pour faire des sauvegardes manuellement, on peut utiliser borg
.
Première étape, créer un dépôt de sauvegarde, par exemple après avoir monté un disque dur externe, vierge sur /backup
:
borg init --encryption=none /backup
On peut évidemment chiffrer comme on veut; voir la doc pour ça.
On utilise la commande borg create
pour ça :
[sudo] borg create --progress --stats [--rsh "ssh -p 2222" eorn@backup.goe.land:]/backup::masauvegarde-2020-03-20 /dossier/à/sauvegarder
Les parties [entre crochets]
sont optionnels. En l'occurrence, l'option –rsh
et les informations de connexion (eorn@backup.goe.land:
) ne sont utiles que si on veut faire une sauvegarde sur un serveur distant.
Infos :
[sudo] borg infos /backup
Liste des sauvardes dans le dépôt :
[sudo borg list /backup
Il existe une surcouche à borg
pour l'automatisation : borgmatic
, qui a besoin d'un fichier de configuration dont voilà un exemple (rangé, chez moi, dans /srv/config/borg/config.yaml
) :
location: source_directories: - /srv/apps/ repositories: - borg@backup.goe.land:/backup #exclude_patterns: #- "*/*/db" storage: encryption_passcommand: "cat /srv/config/borg/passphrase" compression: lz4 ssh_command: ssh -p 2222 -i /srv/config/borg/id_rsa retention: # Keep all archives within this time interval. keep_within: 24H # Number of daily archives to keep. keep_daily: 7 # Number of weekly archives to keep. keep_weekly: 4 # Number of monthly archives to keep. keep_monthly: 6 consistency: checks: - disabled # - repository # - archives
Pour que cela fonctionne, j'ai créé un utilisateur borg
sur ma machine de backup. Les informations pour la connexion ssh
sont importantes, notamment la clé de connexion (id_rsa
).
Pour avoir les info et liste des sauvegardes :
[sudo] borgmatic info -c /srv/config/borg/config.yaml [sudo] borgmatic list -c /srv/config/borg/config.yaml
Il faut pour cela utiliser les hooks
dans le fichier de configuration.
J'ai écrit un petit script qui va *dumper* les bases de données, je donne un exemple plus bas.
hooks: before_backup: - echo "Starting a backup." - /srv/config/borg/scripts/dump_database.sh -t postgres -s etherpad -c dbetherpad - /srv/config/borg/scripts/dump_database.sh -t postgres -s freshrss -c dbfreshrss ...
Et le script dump_database.sh
:
#!/bin/bash # Default values TYPE="postgres" SERVICE="" CONTAINER="" while getopts "t:s:c:" opt do case "$opt" in t) TYPE="$OPTARG";; s) SERVICE="$OPTARG";; c) CONTAINER="$OPTARG";; esac done ### # Preparation FILENAME="${SERVICE}_$(date +"%Y%m%d-%H%M").sql" mkdir -p /srv/apps/$SERVICE/dump # Load env file (user, db name) source /srv/apps/$SERVICE/.env cd /srv/apps/$SERVICE/ # Dump (within the container) if [ $TYPE == "postgres" ] then docker-compose \ -f /srv/apps/$SERVICE/docker-compose.yml\ exec $CONTAINER\ pg_dump -U $POSTGRES_USER -d $POSTGRES_DB -f /$FILENAME elif [ $TYPE == "mysql" ] then docker-compose \ -f /srv/apps/$SERVICE/docker-compose.yml\ exec $CONTAINER\ mysqldump -u $MYSQL_USER --databases $MYSQL_DATABASE -p${MYSQL_PASSWORD} -r /$FILENAME fi # Copy the dump file to host docker cp ${SERVICE}_${CONTAINER}_1:/$FILENAME /srv/apps/$SERVICE/dump # Remove the dump file in the container docker-compose \ -f /srv/apps/$SERVICE/docker-compose.yml\ exec $CONTAINER rm /$FILENAME