Idées en vrac

Qu'est-ce que tu veux que je te dise ? C'est ton opinion, mec.

Jeff Lebowski

Sauvegardez !

Ça fait un bout de temps que je n’ai pas écrit d’article, corrigeons ça par le thème d’aujourd’hui : les sauvegardes.

Quelle stratégie adopter ?

Une des règle que j’aime bien suivre et qui me semble pertinente est celle du « 3 2 1 » :

Faut pas essayer d’être trop à cheval sur cette règle. Dans mon cas, le problème principal quand j’ai commencé à avoir beaucoup de données et que je ne voulais pas dépenser trop d’argent, c’est la copie sur un autre endroit physique. Il y a encore 3 ans, ma copie hors site était un disque USB portable que je synchronisais presque tous les mois et qui était stocké dans la maison d’un parent. Évidemment, ça a fonctionné quelques temps puis, avec le temps, c’était un échec : je n’avais plus de sauvegarde hors site avec les données des derniers mois.

Solution hors site

Afin d’éviter les difficultés et contraintes des allers retours du disque, j’avais besoin d’un logiciel simple qui fasse de la réplication. Et c’est là qu’arrive la solution Syncthing, un superbe petit logiciel libre. Il faut trouver un collègue, copain ou parent bien connecté : avec de la fibre optique ou du xDSL à la maison, et de l’espace disque sur une machine relativement disponible (un NAS est parfait par exemple). Tu l’aides à installer Syncthing sur la machine, tu appaires les deux et c’est prêt.

En fonction du niveau de confiance sur la sécurité de l’équipement distant, il est possible de configurer les partages Syncthing local et distant, en tant que envoi uniquement et réception uniquement, respectivement. Plus de détails disponibles dans la documentation. On peut même aller plus loin et demander à Syncthing de chiffrer les données sur la copie distante (mais au moment de l’écriture de cet article, c’est encore en beta).

Zoom sur la sauvegarde

Souvent, quand j’entends parler de sauvegardes, les gens pensent à des copies des données. Pour moi, une solution de sauvegarde, c’est plus que juste une copie. J’ai envie de me prémunir des incidents de type suppression à tort et de pouvoir revenir dans le temps. Dès qu’on ajoute ces contraintes, ça peut devenir compliqué. J’ai pu utiliser pas mal de solutions techniques différentes pour gérer des sauvegardes : rsnapshot, des rsync dans des scripts compliqués, duplcity (et son cousin deja-dup) ou encore Bacula.

Mais, dans mon cas et pour simplifier, j’ai choisi restic. Je ne vais pas faire une énumération des fonctionnalités, je sais bien que ce n’est pas le plus performant, mais il me semble fiable et me convient. Jusqu’à maintenant, je n’ai pas encore eu de mauvaise surprise.

Mise à disposition du dépôt

Je n’utilise qu’un seul dépôt Restic dans un répertoire partagé par NFS, qui est également le partage source Syncthing. Pour que ce montage NFS soit disponible sur les machines à sauvegarder, j’utilise deux unités systemd.

D’abord, le montage par l’unité backup.mount :

[Unit]
Description=Backup shared file system mount point

[Mount]
Where=/mnt/local-dir
What=192.168.0.5:/my-syncthing-folder
Type=nfs

Et voici l’unité d’auto-montage backup.automount :

[Unit]
Description=Automounting for backups NFS

[Install]
WantedBy=multi-user.target

[Automount]
TimeoutIdleSec=10min

Ces deux fichiers sont à placer dans /etc/systemd/system. Ça va permettre à chaque système utilisant ces fichiers d’accéder au dépôt et de ne pas rester monté quand inutilisé.

Éléments pour la sauvegarde d’un hôte

Pour un hôte standard, voici l’unité systemd pour la tâche de sauvegarde (backup.service) :

[Unit]
Description=Backup with restic
Wants=backup.mount

[Service]
Environment="RESTIC_REPOSITORY=<path to your restic repo>" \
            "RESTIC_PASSWORD_FILE=/etc/restic-pass"
ExecStart=/usr/bin/restic backup \
  --cleanup-cache --cache-dir="%C/restic" \
  --exclude='/home/**/.cache' \
  --exclude='/home/**/.local/share/Trash' \
  --exclude='/home/**/.vagrant.d' \
  --exclude='/home/**/cache' \
  --exclude='/home/*/Nextcloud' \
  --exclude='/home/*/Videos' \
  --exclude='/home/*/VirtualBox*' \
  /etc /home
SuccessExitStatus=3

Et voici le timer associé pour un passage hebdomadaire (backup.timer) :

[Unit]
Description=Launch a backup weekly

[Install]
WantedBy=timers.target

[Timer]
OnCalendar=Fri *-*-1..31 23:34:12
Persistent=true
RandomizedDelaySec=180

Script principal avec purge

Parmi mes hôtes à sauvegarder, il y en a un en particulier qui est plus complexe que les autres. Dans ce cas, j’utilise un script différent qui gère des instantanées (BTRFS), exports (MariaDB) et également de la mise en maintenance de site. C’est également dans ce script que je mets les tâches de maintenance sur le dépôt Restic : les vérifications de cohérence et l’application de la politique de rétention.

Voici la partie concernant l’application de la politique de rétention :

restic forget --prune --quiet \
  --keep-hourly=0 \
  --keep-daily=4 \
  --keep-weekly=3 \
  --keep-monthly=3 \
  --keep-yearly=1

Conclusion

Et voici donc quelques astuces et éléments que j’utilise pour avoir des sauvegardes sur lesquelles je peux dépendre. C’est trop compliqué et en opposition à une règle que j’aime suivre : garder les choses simples pour que les restaurations soient les plus fluides possibles. Justement, pour faciliter ces cas d’urgence, je garde un fichier texte avec les commandes pour une restauration la plus rapide possible.

Prochaine étape : piloter la restauration des données et des composants logiciels avec Ansible. Mais c’est pour une autre fois…