Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
autohebergement:sauvegardes [2019/12/21 12:36] eorn créée |
autohebergement:sauvegardes [2021/08/16 14:13] (Version actuelle) |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
===== Sauvegardes ===== | ===== Sauvegardes ===== | ||
+ | **Une version plus à jour, avec des sauvegardes vraiment distantes, est disponible ici :[[autohebergement:sauvegardes_chez_les_copain_e_s|Sauvegardes chez les copain·e·s]].** | ||
+ | |||
J'utilise BorgBackup et Borgmatic pour m'occuper de mes sauvegardes. | J'utilise BorgBackup et Borgmatic pour m'occuper de mes sauvegardes. | ||
+ | ==== Approche manuelle ==== | ||
+ | Pour faire des sauvegardes manuellement, on peut utiliser ''borg''. | ||
+ | |||
+ | === Création d'un dépôt de sauvegarde === | ||
+ | Première étape, créer un dépôt de sauvegarde, par exemple après avoir monté un disque dur externe, vierge sur ''/backup'' : | ||
+ | |||
+ | <code> | ||
+ | borg init --encryption=none /backup | ||
+ | </code> | ||
+ | |||
+ | On peut évidemment chiffrer comme on veut; voir la doc pour ça. | ||
+ | |||
+ | |||
+ | === Ajout d'une sauvegarde === | ||
+ | On utilise la commande ''borg create'' pour ça : | ||
+ | |||
+ | <code> | ||
+ | [sudo] borg create --progress --stats [--rsh "ssh -p 2222" eorn@backup.goe.land:]/backup::masauvegarde-2020-03-20 /dossier/à/sauvegarder | ||
+ | </code> | ||
+ | |||
+ | 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. | ||
+ | |||
+ | |||
+ | === Accès à la sauvegarde === | ||
+ | Infos : | ||
+ | <code> | ||
+ | [sudo] borg infos /backup | ||
+ | </code> | ||
+ | |||
+ | Liste des sauvardes dans le dépôt : | ||
+ | <code> | ||
+ | [sudo borg list /backup | ||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | ==== Automatiser les sauvegardes ==== | ||
+ | === Fichier de configuration === | ||
+ | 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'') : | ||
+ | |||
+ | <file> | ||
+ | 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 | ||
+ | </file> | ||
+ | |||
+ | |||
+ | 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''). | ||
+ | |||
+ | === Commandes === | ||
+ | Pour avoir les info et liste des sauvegardes : | ||
+ | <code> | ||
+ | [sudo] borgmatic info -c /srv/config/borg/config.yaml | ||
+ | [sudo] borgmatic list -c /srv/config/borg/config.yaml | ||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | === Correctement sauvegarder des bases de données === | ||
+ | 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. | ||
+ | |||
+ | <file> | ||
+ | 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 | ||
... | ... | ||
+ | </file> | ||
+ | |||
+ | Et le script ''dump_database.sh'' : | ||
+ | <file> | ||
+ | #!/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 | ||
+ | </file> | ||
+ | |||
+ | |||
+ | === Vérifier que tout se passe bien === | ||
+ | |||
+ | |||
+ | |||
+ | === Tester les sauvegardes ! === | ||
+ | |||
+ | |||
+ |