Ceci est une ancienne révision du document !
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