--- title: "Sauvegarde externalisée grâce à Borg Backup" authors: - JF date: 2020-12-04 --- # La sauvegarde de savanecloud.fr J'ai découvert "Borg" lors du stage concluant ma formation de reconversion professionnelle. L'outil est simple, efficace, disponible sur Synology DSM et il existe des fournisseurs de services spécialisés chez lesquels, on peut externaliser nos sauvegardes. Mais me direz-vous pourquoi externaliser des sauvegardes ? Beh ouais, avec un NAS en RAID 1 j'ai peu de risque de perdre mes données. Effectivement. Mais le risque existe. Matérialisé par un cambriolage ou une destruction malencontreuse dudit NAS. Bref. Un jour j'ai eu peur et j'ai pris au sérieux la sauvegarde en dehors du cadre professionnel. Et bien entendu, laisser faire le boulot par Google, Dropbox, feu Hubic ou Microsoft ne me plaisais pas beaucoup. * Borg backup : https://github.com/borgbackup/borg/ * BorgBase : https://www.borgbase.com ## Installation de Borg sur le Synology ### Le dépot de Synocommunity Le paquet n'est pas disponible par défaut dans le dépôt ("repository", dire "ripo" pour les franglophones) de DSM. Pour l'obtenir, il faut ajouter un dépôt depuis les paramètres du gestionnaire de paquets de DSM. Le dépôt que j'utilise est celui de [SynoCommunity](https://synocommunity.com/). ![Ajout d'un dépôt dans le gestionnaire de paquets de DSM.](borg_synocommunity.png) Ensuite il suffit de raffraîchir la liste des paquets disponibles et Borg Apparaît. Vous noterez en bas que Borg nécessite Python 3.11, cette dépendance est aussi à installer depuis le dépôt de SynoCommunity. ![Fiche descriptive du paquet Borg](borg_package.png) ## Script de sauvegarde avec Borg ```bash #!/bin/bash # borg init --encryption=keyfile-blake2 /volume1/Backup/borgrepolzma/ #Formatage et mise en page stars='***************************************************************************' # Pour le calcul d'exécutoin du script start_time=$(date +%s) log_file='/volume1/Backup/logs/'$(date +%Y-%m-%d--%Hh%M)'_borgbase.log' echo $(date +%d\ %b\ %Y\ %H:%M:%S) 2>&1 | tee -a $log_file # Définition des variables d'environnement pour simplifier les commandes # export BORG_RSH= # export BORG_REPO='borgserver:/borgrepo' export BORG_REPO='borgserver:borgrepo' export BORG_CACHE_DIR='' # Cron n'a pas de $HOME export HOME=/root # Suite l'erreur "Attempting to access a previously unknown unencrypted repository!" # Apparue le 28/05/2020 export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes printf '\n%s\n%s\n%s\n' $stars "Début de la sauvegarde " $stars 2>&1 | tee -a $log_file # Préparation de la sauvegarde du nextcloud docker exec -tiu www-data nextcloud_app_1 php occ maintenance:mode --on 2>&1 | tee -a $log_file sleep 1m 2>&1 | tee -a $log_file # Dump de la base de données Postgres docker exec -i nextcloud_db_1 /usr/bin/pg_dump -U nextcloud nextcloud | gzip -9 > /volume1/nextcloud/db_dump.sql.gz 2>&1 | tee -a $log_file # Restaurer la BDD # docker exec nextcloud_db_1 pg_restore -U postgres -d nexcloud /backups/db_dump.sql /usr/local/bin/borg create \ --one-file-system \ --stats \ --compression lz4 \ ::{now:%Y-%m-%d--%Hh%M} \ /volume1/dir1 \ /volume1/dir2 \ /volume1/nextcloud \ --exclude /volume1/nextcloud/db \ 2>&1 | tee -a $log_file # ne pas sauvegarder les fichiers du conteneur postgres #--exclude /volume1/nextcloud/db \ # Fin de la sauvegarde docker exec -tiu www-data nextcloud_app_1 php occ maintenance:mode --off 2>&1 | tee -a $log_file printf '\n%s\n%s\n%s\n' $stars "PRUNE" $stars 2>&1 | tee -a $log_file # Keep 31 end of day, 0 additional end of week archives, and 0 end of month archive /usr/local/bin/borg prune -v --list --stats --keep-daily=31 --keep-weekly=0 --keep-monthly=0 2>&1 | tee -a $log_file printf '\n%s\n' '--- Fin de la sauvegarde ---' 2>&1 | tee -a $log_file printf '\n%s\n%s\n%s\n' $stars "borg info" $stars >> $log_file # Pour le mail envoyé en fin par le Task Scheduler Synology /usr/local/bin/borg info borgserver:borgrepo >> $log_file printf '\n%s\n%s\n%s\n' $stars "...Suppression des logs de plus de 200 jours..." $stars 2>&1 | tee -a $log_file find /volume1/Backup/logs -mtime +60 -exec rm -f {} \; 2>&1 | tee -a $log_file timestamp=$(date +%s) TZ='Europe/Paris' printf '%s\nNous sommes le %(%d %b %Y)T et il est %(%H:%M:%S)T.\n%s\n' $stars $timestamp $timestamp $stars 2>&1 | tee -a $log_file # Calcul du temps d'exécution du script end_time=$(date +%s) exec_time=$(($end_time - $start_time)) printf '\n%s\n' $stars TZ='Europe/Paris' printf "L'exécution du script a duré %(%Hh%Mm%Ss)T\n" $exec_time 2>&1 | tee -a $log_file ``` Le service qui me permet d'externaliser facilement les sauvegardes, est [BorgBase](https://borgbase.com).