Restic backup

De Wiki doc


Restic est une application de sauvegarde semblable à Borg backup se basant sur les principes de Git. Les sauvegardes se présentes donc sous forme de dépôt haché au lieu d'un dépôt de fichier avec un index de rangement. Avec ce principe, les fichiers ne sont pas récupérables directement via le système de fichiers. Il faut donc obligatoirement passer par Restic pour naviguer dans les sauvegardes. Passer cette contraintes, ce mode de fonctionnement apporte des atouts non négligeable puisque l'outil permet la dé-duplication à la source, la compression et le chiffrement des données. La gestion des versions est quand à elle totalement automatisé, ce qui est un plus non négligeable afin de ne pas avoir à gérer des scripts de roulement fastidieux.

Elle a également l'avantage d'être développée en Go. Elle n'a donc aucune dépendance (le plus de ouf).

INFORMATION

Concernant la durée de sauvegarde, j'avais 1,8 To de données à sauvegarder via NFS sur un réseau local en gigabit. Il a fallut environ 4 jours ! Je ne sais pas vraiment ce que fait l'outil pendant ce temps mais c'est vraiment long (d'autant plus que aucune ressources, quelle soit processeur, réseau ou disque et ceux, sur les deux machines, n'est grandement utilisé). Rassurez-vous, les passes suivantes sont très rapides car l'outil scanne le dépôt à 1,5 Go/s (je ne sais pas comment il atteint de tels débits) et ne transfert que les différences.

Installation

Restic est présent dans les dépôts Debian. Je l'utilise avec Stretch.

apt install restic fuse

Note: le paquet fuse est facultatif et permet de monter lé dépôt de sauvegarde afin de naviguer dedans en mode fichiers (utile pour récupérer des données en particulier).

Utilisation

Avoir de l'aide

La meilleure documentation de l'outil reste celle fournie avec l'argument --help. Il est utilisable en complément de chaque paramètre afin d'apprendre le fonctionnement de Restic (il n'y a pas de page de man fournie avec le paquet).

Usage:

restic --help
restic <commande> --help

Initialisation d'un dépôt de sauvegarde

restic init -r /srv/test/

Note: le répertoire "test" sera automatiquement créé.

INFORMATION

Restic chiffre obligatoirement le dépôt en AES 256 bits. Un mot de passe est donc demandé à la création de celui-ci. Ne le perdez pas car sinon les données sont irrécupérables.

Par la suite, il est possible de mettre le mot de passe dans un fichier ou une variable d'environnement afin de ne pas avoir à le taper à chaque commande:

  • Via un fichier (mdp=test pour l'exemple): echo "test" > /root/mdp.txt; restic <commande> -r /srv/test/ -p /root/mdp.txt
  • Via la variable RESTIC_PASSWORD: RESTIC_PASSWORD=test restic <commande> -r /srv/test/
  • Via la variable de spécification du fichier: RESTIC_PASSWORD_FILE=/root/mdp.txt

Le dépôt est précisé par le paramètre -r ou la variable RESTIC_REPOSITORY.

Je précise également que la compression et le chiffrement sont effectués coté client, aucune donnée ne circule en clair sur le réseau et il n'y a pas besoin d'avoir une machine de guerre en guise de serveur de sauvegarde comme avec ZFS.

Changement du mot de passe

restic key passwd -r /srv/test/

Sauvegarde

Les sauvegardes se font sous forme d'instantanés (snapshot). Le fait de refaire une deuxième sauvegarde ne transférera que la différence avec les sauvegardes précédentes et ceux, même si un fichier a été copier plusieurs fois entre temps. Restic analyse chaque fichiers et dé-duplique les données à envoyer avant le transfert ce qui représente un gain de ressource réseau et disque considérable et évite de trop se prendre la tête lors de l'usage massif de mount --bind (l'outil se démerde).

ASTUCE

Le dépôt Restic étant lui même un dossier, il peut être sauvegarder ou déplacé via un bête copier/collé ou via Rsync sur un autre support.

Sauvegarde simple

Sur un volume local

restic backup /etc -r /srv/test/

Sur un volume SSH

restic backup -r sftp:utilisateur@hôte:/srv/test

Sauvegarde avec exclusion de répertoire

Il est possible d'indiqué plusieurs répertoires à exclure via le paramètre -e.

L'exclusion des répertoires suit la même logique que pour Rsync. Les répertoires exclus sont relatifs au répertoire de sauvegarde. C'est à dire que si je sauvegarde /etc et que je souhaite exclure "/etc/default/", je dois préciser "default" relativement à "/etc" de sorte à avoir "default/" ou "/default/". Restic fait un espèce de chroot sur le dossier à sauvegarder si vous préférez (et ce comportement est similaire dans tout les outils de sauvegarde qu'il m'ait été donné de voir).

restic backup /etc -e default -e apt -r /srv/test/

De la même manière, il est possible d'utiliser un fichier contenant la liste des données à exclure de la sauvegarde avec le paramètre --exclude-file=.

restic backup /etc --exclude-file=/srv/excludes-restic.txt -r /srv/test/

Il ne doit y avoir qu'une seule donnée à exclure par ligne comme ceci:

root/.cache/
/var/lib/lxc/lxc-*/rootfs/proc/
/var/lib/lxc/lxc-*/rootfs/sys/
/var/lib/lxc/lxc-*/rootfs/dev/
/var/lib/lxc/lxc-*/rootfs/tmp/
/var/lib/lxc/lxc-aptmirror/rootfs/var/www/apt-mirror/mirror/
/var/lib/lxc/lxc-aptmirror/rootfs/var/spool/apt-mirror/skel/
/var/lib/lxc/lxc-web/rootfs/var/www/ressources/Logiciels/
/var/lib/lxc/lxc-web/rootfs/var/www/ressources/Partage/
/var/lib/lxc/lxc-web/rootfs/var/www/ressources/Films/

ATTENTION

Le répertoire ~/.cache/ ne doit pas être inclus dans la sauvegarde car il est massivement utilisé par Restic au moment de cette même sauvegarde. Vous aurez compris que ça peut vite foutre la merde si vous sauvegardez un répertoire qui stock les informations de cette même sauvegarde en temps réelle (une espèce de merde auto récursive en somme).

Sauvegarde avec inclusion de répertoire

Au même titre que l'exclusion, l'inclusion peut se faire en spécifiant les répertoires à sauvegarder en les séparant par des espaces ou via un fichier avec le paramètre --files-from=. Il est bien sûr possible de combiner le tout à l'exclusion.

restic backup --files-from=/srv/includes-restic.txt --exclude-file=/srv/excludes-restic.txt -r /srv/test/

Note: le fichier d'inclusion suit la même logique que le fichier d'exclusion à ceci près que les chemins doivent être absolus à la racine du système en cours d'exécution.

/root
/home
/etc
/var/log
/var/lib/lxc
/var/lib/qemu
/srv
/boot

Lister les instantanés

restic snapshots -r /srv/test/

Cette commande indique le hache de chaque instantané. Cette donnée sera utilise pour interagir avec eux.

Restauration

Restauration via le hache

restic restore d46c88f0 -r /srv/test/ --target /tmp/test/

Il est possible de restreindre la restauration à un répertoire en particulier:

restic restore d46c88f0 -r /srv/test/ --target /var/lib/ --include lxc/lxc-mediawiki

Restauration via un montage

restic mount /mnt -r /srv/test/

Note: Ceci nécessite fuse.

ATTENTION

Ne pas trop compter sur la méthode fuse car elle est vraiment pourrie. Elle passera pour des fichiers uniques de taille raisonnable mais pour restaurer un conteneur LXC entier c'est vraiment pas top car la connexion fini par se fermer d'elle même.

Supprimer un instantané

restic forget 17eb8d3d -r /srv/test/

Il est possible d'organiser un roulement des sauvegarde en oubliant le Nème dernier instantané:

restic forget --keep-last 2 -r /srv/test/

Note: Avec ceci, Restic ne garde que les 2 derniers instantané.

Il est également possible de faire un roulement bien plus complexe:

restic forget --keep-daily 7 --keep-weekly 5 --keep-monthly 12 --keep-yearly 1 -r /srv/test/

Dans ce cas, Restic va garder les 7 derniers jours de la semaine en cours et ne va garder que le dernier jour en passant à la semaine suivante (au bout de 8 jours, nous n'auront donc que 2 sauvegardes: la semaine dernière et le premier jour de la nouvelle semaine, qui peut aller jusqu'à 7 - donc 8 sauvegardes au bout de 14 jours). Ensuite nous ne gardons que que les 5 dernières semaines, nous ne pouvons donc avoir au maximum que les 7 derniers jours et les 5 dernières semaines (qui sont elles-même une sauvegarde du dernier jour de chacune de ces 5 semaines passée). Idem pour les 12 derniers mois. Le tout sur un ans, ce qui doit correspondre à 2 ans - 1 sauvegarde.

Je précise que ce que je dit est le fruit de ma compréhension du bousin vu que je n'utilise pas l'outil depuis très longtemps. On verras bien si la pratique valide la théorie...

Vérifier l'intégrité d'un dépôt

En cas de coupure du lien avec le support de sauvegarde, il se peut que l'index du dépôt distant rencontre un problème. Voici la marche à suivre pour régler ça (sorte de fsck):

Vérifier l'intégrité du dépôt

restic check -r /srv/test/

Réparrer le dépôt

restic rebuild-index -r /srv/test/

ASTUCE

Dans le cas d'une sauvegarde via partage NFS, je recommande l'utilisation des paramètres suivants pour le point de montage: rw,noauto,noexec,nosuid,tcp,hard,intr,timeo=14. Leur utilité est expliqué ici. Ceci permettra de faire une pause dans la transmission en cas d'injoignabilité du serveur de fichiers et de ne pas tout bousiller avec des pertes de paquets (testé et approuvé).

Source