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. Ajout d'un dépôt dans le gestionnaire de paquets de DSM. 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

Script de sauvegarde avec Borg

#!/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=<clef privée pour sauvegarder sur le serveur distant>
# export BORG_REPO='borgserver:/borgrepo'
export BORG_REPO='borgserver:borgrepo'
export BORG_CACHE_DIR='<emplacement du cache de Borg>'

# 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.