Backup des bigmems
Pour rappel, les machines ne sont pas sauvegardées (!), c'est à vous de le faire, en fonction de vos espaces de stockage (si vous en avez...) !
Cette documentation se penche donc sur un cas d'utilisation où vous auriez acheté du stockage ISDM en mode SFTP.
Admettons que le stockage conséquent à sauvegarder soit dans /bigvol/<user>/backup
. En effet, les home sont conservées à cet endroit sur la plupart de ces machines.
On crée par exemple un fichier test.txt
dans notre sous-dossier backup pour nos tests :
mkdir /bigvol/<user>/backup
echo -e "test test test\n ok ok ok" > /bigvol/<user>/backup
Restic
Pour faire nos sauvegardes, nous allons utiliser restic
.
Ce dernier est très puissant (compatible S3, avec compression, déduplication, ...) et assez simple d'utilisation.
La documentation est basé essentiellement sur ces 2 ressources :
- https://ressources.labomedia.org/restic_utilitaire_de_sauvegarde
- https://www.ivonne-y-will.fr/articles/restic-bases/
Installation et initialisation
Nous allons faire tout ce qui suit en root, même s'il est possible et même recommandé de créer un utilisateur dédié.
L'installation se fait simplement, en utilisant les dépôts officiels de la distribution :
apt install -y restic
Pour l'initialisation, c'est également assez simple. On va d'abord s'assurer qu'on peut se connecter sur le système de stockage distant, sans mot de passe (les valeurs entre chevrons sont à remplacer) :
# si vous n'avez pas encore de clé publique sur la bigmem
ssh-keygen -t ed25519
# puis on copie la clé sur le système distant
ssh-copy-id <user>@<host>
Pensez à remplacer ici et dans la suite de cette documentation les valeurs entre chevrons (symboles inférieurs/supérieurs :
<
valeur-à-remplacer>
)
On se crée ensuite un fichier ssh_config sur la bigmem, s'il n'existe pas encore :
cat <<EOF >>~/.ssh/config
Host isdmbckp
Hostname <host>
User <user>
ServerAliveInterval 60
ServerAliveCountMax 240
EOF
On crée un sous-dossier ~/workdir/restic
sur la machine distante, puis :
restic --repo sftp:<user>@isdmbckp:~/workdir/restic init
On choisit avec un soin un mot de passe, qu'on conserve méticuleusement.
Premiers backups et configuration
export RESTIC_PASSWORD=RESTIC_PASSWORD
restic -r sftp:isdmbckp:workdir/restic --verbose backup --tag firstcommit /bigvol/<user>/backup/
On parcourt nos snapshots :
# on liste les snapshots
restic snapshots -r sftp:isdmbckp:workdir/restic
# on liste le contenu du snapshot
restic ls <snapshot_ID> -r sftp:isdmbckp:workdir/restic
On teste la restauration :
# on tente un montage du snapshot en local
mkdir /mnt/restic
restic mount -r sftp:isdmbckp:workdir/restic /mnt/restic
# dans un autre terminal / tmux ...
ls /mnt/restic/snapshots/<date>
# on peut ensuite copier/ récupérer ce qu'on veut
# puis Ctrl+C sur premier terminal lorsque opération de récupération terminée
# restauration (attention à l'espace utilisé localement)
restic restore <snapshot_ID> -r sftp:isdmbckp:workdir/restic --target /tmp
# pour filtrer le contenu à restaurer, on utilisera le flag `--include` combiné au `--restore`,
# ou bien directement `--dump` sur un snapshot afin d'afficher directement le contenu d'un fichier
# exemple d'un dump après création et sauvegarde d'un fichier test.txt à la racine du sous-dossier backup
restic dump <snapshot_ID> -r sftp:isdmbckp:workdir/restic /bigvol/<user>/backup/test.txt
Plus d'informations sur la restauration sur la documentation officielle.
Si ok, on va pouvoir scripter ça et le mettre en cron.
Dans le script suivant, j'ai configuré une rétention des 3 derniers backups hebdomadaires + 3 derniers backups mensuels.
echo '#!/bin/bash
# nécessaire si appelé depuis un envionnement cron
export PATH=$PATH:/usr/bin/:/usr/sbin:/usr/local/bin:/usr/local/sbin
REPOSITORY="sftp:isdmbckp:workdir/restic"
DATE=$(date +"%Y%m%d")
export RESTIC_PASSWORD=<votre mot de passe>
if [ ! -d /var/log/restic/ ]; then
mkdir /var/log/restic/
fi
LOG=/var/log/restic/${DATE}.log
for d in /bigvol/*/backup; do
if [ -d ${d} ]; then
restic --verbose forget --path ${d} -r ${REPOSITORY} --keep-weekly 3 --keep-monthly 3 --prune >> ${LOG}
restic --verbose backup --tag ${DATE}_${HOSTNAME}_$(dirname ${d:8}) -r ${REPOSITORY} ${d} >> ${LOG}
fi
done
restic stats -r ${REPOSITORY} >> ${LOG}' > /usr/local/sbin/isdmbckp.sh
chmod 750 /usr/local/sbin/isdmbckp.sh
On a créé un script qui nous permet de taguer chaque snapshot de la machine avec la date du jour, le hostname de la machine + le nom du sous-dossier de l'utilisateur. On a donc un snapshot par utilisateur, suivi d'un nettoyage puis un affichage des statistiques. Le résultat étant consultable dans un fichier de log à la date du jour, dans /var/log/restic
.
Pensez néanmoins à remplacer <votre mot de passe>
et le chemin vers votre dépôt distant (valeur REPOSITORY
dans le script).
Puis, on crée un crontab :
contab -e
# on rajoute
# @weekly /usr/local/sbin/isdmbckp.sh
Configuration avancée
Optimisation, tuning
Selon le nombre de fichiers à sauvegarder, ça peut valoir le coup de modifier certains paramêtres
Resticprofile
resticprofile
vous permet de gérer vos configurations restic
de façon simple dans un fichier de configuration.
NB : Pour ceux qui sont familiers de
borgbackup
, c'est un peu l'équivalent deborgmatic
Tout ce qui a été vu précédemment est pris en charge et ce dernier permet aussi :
- de s'assurer qu'il y a suffisamment de RAM disponible pour que le backup fonctionne.
- de modifier la priorité du processus de sauvegarde (nice)
- de faire appel à des hooks (http / commandes), avant ou après la sauvegarde,
- d'empêcher le système de rentrer en sommeil.
- etc...
Securité
Comme mentionné au départ, il peut être utile de faire tourner restic avec un utilisateur dédié non-root
Pour se prémunir de problèmes liés à des ransomware, il faut utiliser un mode append-only
; pour faire cela, sur du SFTP, il faudra passer par rclone. C'est beaucoup plus simple sur S3, par le verrouillage des objets (WORM) (à associer également au versionning S3).
Quelques lectures intéressantes à ce sujet :
Avec cette méthode, attention donc à la suppression des anciens snapshots.
rclone
est disponible sous forme de module sur le cluster Muse (installé à /nfs/work/agap_id-bin/img/rclone/1.54.1/rclone
).
Alerting
Maintenant, ça serait bien d'être informé si les sauvegardes se sont mal déroulées et connaître les statistiques d'utilisation disque par les snapshots.
Pour vérifer l'état d'un dépôt :
restic -r sftp:isdmbckp:workdir/restic check
On rajoutera donc cette commande à notre script, avec la sortie qui ira aussi vers nos logs.
Courriel
Le mail est l'option la plus simple pour être averti, mais il en existe de nombreuses autres (webhooks, push, etc) (voir par exemple ce petit code python que j'ai développé).
Il faut d'abord s'assurer que le hostname est défini correctement, sinon le serveur relais refusera de router le mail :
hostname
La commande hostname doit renvoyer le nom complet de la machine avec un nom de domaine valide (chez nous *.mbb.cnrs.fr
).
Si ce n'est pas le cas :
hostnamectl hostname <bigmemX>.mbb.cnrs.fr
apt install -y postfix mailutils
On laisse les options de configuration par défaut, puis on modifie le fichier /etc/postfix/main.cf
pour utiliser notre serveur de relais (à demander à l'équipe ISI).
sed -i "s/relayhost = /relayhost = [<fqdn.du.hostname.relais>]/" /etc/postfix/main.cf
Ensuite, on modifie le fichier /etc/aliases
afin que notre adresse mail soit associée à l'utilisateur root
, en rajoutant par exemple la ligne :
root: moi@exemple.fr
Puis, pour que nos changements soient pris en compte :
newaliases
postfix reload
Vous pouvez ensuite vérifier que l'envoi de mail est fonctionnel :
echo "test test test" |mail -s "ceci est un test" root
En cas de soucis, il faut vérifier la sortie de /var/log/mail.log
.
Modification du script pour prise en charge de la vérification et le courriel
echo '#!/bin/bash
# nécessaire si appelé depuis un envionnement cron
export PATH=$PATH:/usr/bin/:/usr/sbin:/usr/local/bin:/usr/local/sbin
REPOSITORY="sftp:isdmbckp:workdir/restic"
DATE=$(date +"%Y%m%d")
export RESTIC_PASSWORD=<votre mot de passe>
if [ ! -d /var/log/restic/ ]; then
mkdir /var/log/restic/
fi
LOG=/var/log/restic/${DATE}.log
for d in /bigvol/*/backup; do
if [ -d ${d} ]; then
restic --verbose forget --path ${d} -r ${REPOSITORY} --keep-weekly 3 --keep-monthly 3 --prune >> ${LOG}
restic --verbose backup --tag ${DATE}_${HOSTNAME}_$(dirname ${d:8}) -r ${REPOSITORY} ${d} >> ${LOG}
fi
done
restic stats -r ${REPOSITORY} >> ${LOG}
restic -r sftp:isdmbckp:workdir/restic check >> ${LOG}
cat ${LOG} | mail -s "Votre rapport hebdomadaire de sauvegarde pour ${HOSTNAME}" root' > /usr/local/sbin/isdmbckp.sh
chmod 750 /usr/local/sbin/isdmbckp.sh
A nouveau, pensez à ajuster dans le sxcript le mot de passe et l'adresse de votre dépôt.