ARTICLES
Faites des backups avec Duplicity dans le Cloud
By Valentin Bremond
Les backups, c’est chiant
Surtout avec mes critères :
- Chiffrement des données au repos
- Stockage en France (au moins en Europe)
- Pas d’intermédiaire Américain ou Chinois
- Pas cher (et surtout : pas de frais “caché”, genre tarification des requêtes / tarification des données entrantes ou sortantes…)
- Disponibles partout et tout le temps
- Incrémentiels (pas la peine de recopier 100 GB tous les jours pour rien)
- Possibilité de configurer la rétention et l’historique
- De préférence, vendor-agnostic et open-source
- Simples à configurer et simple à reconfigurer sur un PC neuf (si c’est impossible de restaurer ses backups sur un PC neuf, on perd tout l’intérêt des backups…)
- Pas de maintenance à assurer sur ce qui va les héberger
Filtrons donc
On va éliminer ce qui ne rentre pas dans nos critères, c’est à dire :
- S3 / GCS / Azure : c’est cher et c’est Américain
- Un dédié / une VM avec un truc du style OwnCloud : il faut la maintenir au risque que plus rien ne marche le jour où on en a besoin (ou qu’un gentil hacker ait fait n’imp avec nos données)
- Un NAS à la maison (même si monter un RAID en ZFS sur un Raspberry Pi me tentait bien)
- Un rsync sur un hébergeur quelconque : pas d’historique, pas de chiffrement
- Les softs d’entreprises dédiées à ça (type Blackbaze ou Dropbox)
Bon ben quoi alors ?
On fait très simple : un bucket OpenStack Swift (object storage open source, chez OVH par exemple), un Duplicity par dessus et systemd pour gérer le scheduling (ou autre chose si vous n’aimez pas Lennart, mais va falloir vous débrouiller alors pour cette partie).
Ça remplit tous nos critères et c’est vraiment pas cher. Par exemple, j’ai environ 100 GB de données sur mon PC que je backupe tous les jours et je paye ~0.09 € par mois. Je pense qu’on peut se permettre 9 centimes par mois pour sauvegarder notre vie numérique.
J’ai pas le time, file-moi des trucs à copier/coller
Il vous faut 3 choses :
- Duplicity
- Un “bucket” Swift, par exemple ici https://www.ovh.com/fr/public-cloud/object-storage/
- 5 minutes de votre vie
On commence par tout installer
1$ sudo dnf install duplicity
2# ou
3$ sudo apt-get install duplicityPour ma part, il manquait des librairies Python pour Swift :
1$ sudo pip install python-swiftclient python-keystoneclientOn créé la conf systemd
Il vous faut 4 fichiers :
~/.config/systemd/user/backups.service(le backup en lui-même) :1[Unit] 2Description=Backups Duplicity 3After=network-online.target 4Wants=network-online.target 5OnFailure=backups-notify-failure.service 6 7[Service] 8# Avec Type=simple, les commandes ExecStartPost seront lancées une fraction de seconde après le début du backup, ce qui 9# va faire planter Duplicity à cause des lock 10Type=oneshot 11TimeoutStartSec=12h 12EnvironmentFile=%h/.backups.env 13# On s'assure que le réseau est up et l'API OpenStack disponible 14ExecStartPre=/usr/bin/bash -c 'for i in $(seq 1 5); do test $(curl $SWIFT_AUTHURL --output /dev/null --write-out \'%{http_code}\' --silent --max-time 1) -eq 200 && exit 0 || echo "En attente d'OpenStack" && sleep 3; done; echo "OpenStack est indisponible"; exit 1;' 15# Nettoyer le bucket des artéfacts des anciennes erreurs, s'il y a 16ExecStartPre=/usr/bin/duplicity cleanup --force "$DEST" 17# Lancement des backup incrémentaux 18ExecStart=/usr/bin/duplicity --verbosity notice --num-retries 3 --full-if-older-than "$FULL_EVERY" --asynchronous-upload --cf-backend swift $DUP_OPTS "$SRC" "$DEST" 19# Suppression des anciens backups 20ExecStartPost=/usr/bin/duplicity remove-older-than --force "$REMOVE_OLDER_THAN" "$DEST" 21ExecStartPost=/usr/bin/duplicity remove-all-inc-of-but-n-full --force "$KEEP_INCREMENTS" "$DEST" 22 23[Install] 24WantedBy=default.target~/.config/systemd/user/backups.timer(le timer - c’est comme un cron, mais géré par systemd) :1[Unit] 2Description=Backups Duplicity 3After=network-online.target systemd-networkd-wait-online.service 4Wants=network-online.target systemd-networkd-wait-online.service 5 6[Timer] 7# Toutes les 6 heures, en commencant à 8h (adaptez comme vous préférez) 8OnCalendar=*-*-* 08/6:00:00 9Unit=backups.service 10 11[Install] 12WantedBy=default.target~/.config/systemd/user/backups-notify-failure.service(service lancé en cas de fail pour afficher une notification, ça vous évite de passer à côté des erreurs de backup et vous rendre compte 6 mois après qu’en fait ça n’a marché que la première fois)1[Unit] 2Description=Affiche une notification d'erreur en cas de problème lors du backup 3 4[Service] 5Type=simple 6Environment=DISPLAY=:0 7ExecStart=/usr/bin/notify-send --urgency critical --icon dialog-warning "Backup Duplicity échoué"~/.backups.env(pour stocker votre token Swift et les éventuels paramètres pour Duplicity) :1# Duplicity 2SRC="/home/val" 3# Mettez le nom de votre conteneur Object Store - le mien s'appelle "backups" 4DEST="swift://backups" 5# Vous pouvez exclure des dossiers de vos backups, exemples ci-dessous 6DUP_OPTS="--exclude /home/val/Downloads/ --exclude /home/val/.cache/ --exclude /home/val/.local/share/containers/" 7 8# Faire un backup complet tous les mois 9FULL_EVERY=1M 10# Supprimer les backups qui ont plus de 3 ans 11REMOVE_OLDER_THAN=36M 12# Garder 3 backups complets avec incréments, ne garder que les complets pour les plus anciens 13KEEP_INCREMENTS=3 14# Tout ça signifie : faire un backup incrémental plusieurs fois par jour, faire un backup complet tous les mois, garder 15# les backups pendant 3 ans mais ne garder que les 3 dernières révisions incrémentales (3 ans de backups complet et les 3 16# derniers mois sont des backups journaliers). Ça vous permet de rollback à un mois près sur ces 3 dernières années ou de 17# rollback à 6h près sur ces 3 derniers mois (parce que dans notre exemple les backups tournent toutes les 6 heures). 18 19# OpenStack 20# Les paramètres OpenStack sont lus par Duplicity directement dans l'environnement, pas besoin de les préciser dans "DUP_OPTS" 21SWIFT_AUTHURL="https://auth.cloud.ovh.net/v3" 22SWIFT_AUTHVERSION="3" 23SWIFT_USERNAME="votre username" 24SWIFT_PASSWORD="votre token" 25SWIFT_TENANTNAME="votre tenant name (= votre project name, 16 chiffres)" 26SWIFT_REGIONNAME="votre région, sans le chiffre (ex : GRA)" 27 28# GnuPG 29PASSPHRASE="la passphrase qui va chiffrer vos données"
On demande à systemd de lire tout ça
1$ systemctl --user daemon-reloadOn démarre le timer
1$ systemctl --user enable --now backups.timerC’est tout
Vous aurez de beaux backups réguliers qui seront poussés sur le Cloud pour un prix dérisoire (à moins que vous ayez mis une rétention de fou ou que vous ayez des To de données perso).
Les trois dernière commandes utiles à connaître :
1# Pour voir l'état de vos backups
2$ systemctl --user status backups
3# Pour savoir quand le dernier backup a été lancé
4$ systemctl --user list-timers
5# Pour lire les logs de vos backups
6$ journalctl --user -u backups