Table des matières
Restic
Restic est un programme libre de sauvegarde incrémentale de fichiers.
La doc est par ici.
On va considérer qu'on a 2 serveurs, 1 de production (prod), et 1 de sauvegarde (save). On veut sauver les homes du serveur prod, chacune ayant sa propre timeline de sauvegarde.
On peut adapter très facilement ce tuto pour sauver une machine sur un disque externe par exemple : il suffit de changer la valeur du paramètre -r qui défini où se trouve le dépôt de sauvegarde (il peut être un peu n'importe où).
Important : Restic utilise massivement les entrées/sorties du disque dur, ce qui ralentit le système pendant les longues sauvegardes. Préférer un SSD s'il y a beaucoup de choses à sauver.
Installation
Il faut l'installer sur le serveur prod, pas besoin sur le serveur save. Ce dernier doit néanmoins accepter le protocole SFTP (très souvent activé par défaut car directement lié au SSH).
On peut installer restic via le gestionnaire de paquet (sur Debian : apt install restic) mais il est rarement à jour. De plus, afin de pouvoir isoler facilement l'execution de restic (en dehors de root donc), mieux vaut passer par la version autonome, d'ailleurs recommandée dans la doc.
Pour installer la version autonome, nous devons créer un nouvel utilisateur sur le serveur de prod (toutes les commandes suivantes sont à executer en tant que root) :
adduser restic
On protège le home de restic des regards indiscrêts :
chown restic: /home/restic && chmod 750 /home/restic
Puis on crée un dossier bin dans /home/restic et on y télécharge la dernière version de restic à trouver en descendant un peu cette page :
cd /home/restic mkdir bin cd bin wget https://github.com/restic/restic/releases/download/v0.9.6/restic_0.9.6_linux_amd64.bz2 bunzip2 restic_0.9.6_linux_amd64.bz2 mv restic_0.9.6_linux_amd64 restic cd .. chown -R root:restic bin chmod 750 bin/restic
Maintenant, on a un fichier executable /home/restic/bin/restic
Reste à accorder un droit spécial à l'execution de ce fichier, afin qu'il ne soit seulement capable que de lire tous les fichiers du serveur de prod, mais pas les modifier ou les executer. Ca évitera les ennuis. Pour ça, on execute (tjs en root) :
setcap cap_dac_read_search=+ep /home/restic/bin/restic
Désormais on pourra, depuis root, exécuter restic en tant que l'utilisateur restic en faisant :
sudo -u restic /home/restic/bin/restic ... paramètres habituels
Configuration
Sur le serveur de save
Créer un nouvel utilisateur resticbackup :
adduser resticbackup
Dans le dossier /home/resticbackup, créer un dossier resticrepo qui contiendra la sauvegarde du serveur de prod. Ce dossier doit avoir les droits de l'utilisateur resticbackup :
mkdir resticrepo && chown -R resticbackup: resticrepo
Sur le serveur de prod
Déclarer l'hôte serveur de save
Afin de pouvoir se connecter au serveur de save sans avoir à taper toutes l'adresse avec le port, on va définir un hôte en ajoutant à la fin du fichier /etc/ssh/ssh_config (on appelle cet hôte : resticbox) :
# Pour restic (backup) Host resticbox HostName XXX.XXX.XXX.XXX User resticbackup Port 22
Changer les XXX par l'adresse IP et adapter le port si nécessaire. L'utilisateur resticbackup a été créé plus haut sur le serveur de save.
Du coup :
# on peut taper ssh resticbox # au lieu de ssh resticbackup@XXX.XXX.XXX.XXX -p 22
Config SSH
Pour permettre à l'utilisateur restic de pouvoir se connecter en SSH au serveur de save sans avoir à donner le mot de passe à chaque fois, on va lier les 2 serveurs avec une clef RSA publique.
Pour ce faire, il faut se logger en tant que restic, puis executer la commande générant les clefs RSA publique et privée :
ssh-keygen -t rsa
Afficher la clef publique et la copier :
less .ssh/id_rsa.pub
Puis, sur le serveur de save, dans le fichier /home/resticbackup/.ssh/authorized_keys (à créer si besoin), coller la clef copiée précédemment.
Puis (retour sur le serveur de prod), pour empêcher que restic ne se déconnecte trop tôt, créer le fichier .ssh/config dans /home/restic et y ajouter :
ServerAliveInterval 60 ServerAliveCountMax 240
Raccourci de commande
Pour l'utilisateur root, on va ajouter un alias de commande pour pas avoir à taper toute la longue commande executant restic en tant que l'utilisateur restic.
Dans le fichier /root/.bashrc, ajouter à la fin l'alias suivant :
# Restic alias rstc='sudo RESTIC_PASSWORD=motDePasse -u restic /home/restic/bin/restic -r sftp:resticbox:/home/resticbackup/resticrepo'
On pourra donc executer la commande rstc seulement.
Remarque : la variable RESTIC_PASSWORD contient le mot de passe du dépôt (différent du user resticbackup du server de sauvegarde). Il faudra changer motDePasse par sa valeur une fois le dépôt initialisé ! (voir plus bas)
Pour que le user root puisse utiliser ce nouvel alias, soit il faut se déconnecter / reconnecter, soit executer la commande :
source /root/.bashrc
Initialiser le depôt
Maintenant que tout est configuré, il faut initialiser le dépôt (sans utiliser l'alias rstc car il n'y a pas de mot de passe au dépôt encore ! ) :
sudo -u restic /home/restic/bin/restic -r sftp:resticbox:/home/resticbackup/resticrepo init
Cette commande connecte restic en SFTP sur l'hôte resticbox (défini précédemment) et créer le dépôt dans le dossier /home/resticbackup/resticrepo
Cela demandera de définir un mot de passe pour le dépôt : attention à bien le conserver, s'il est perdu, c'est foutu :) Idéalement, utiliser uniquement des caractères alphanumériques (a-z et 0-9) sans caractères spéciaux : puisqu'il faut mettre ce mot de passe dans la commande alias du fichier .bashrc, il ne doit pas faire sauter les paramètres de la commande.
Backup
On peut tout a fait utiliser notre alias rstc maintenant que le dépôt est initialisé.
Une opération de sauvegarde crée ce que l'on appelle un snapshot. Chaque snapshot est unique, et on peut en faire autant que l'on veut du même dossier.
Pour le moment on ne va sauver qu'un seul dossier pour l'exemple. Ca sera le dossier /home/jeanclaude
rstc --verbose backup /home/jeanclaude
On peut aussi attribuer un tag (ici : jeanclaude) à ce snapshot :
rstc --verbose backup --tag jeanclaude /home/jeanclaude
Pour tagger un snapshot dejà fait, voir la doc.
Restore
On peut évidemment restaurer n'importe quel snapshot, mais attention, je recommande de restaurer dans un dossier temp ce que l'on veut récuperer, puis de remplacer les fichiers que l'on veut.
Pour restaurer, on a besoin d'un numéro unique de snapshot. Voir plus bas pour la commande listant les snapshots disponibles.
Pour récupérer un snapshot (ici 3054af84) en le placant dans un répertoire temporaire on execute :
rstc restore 3054af84 --target /home/jeanclaude/repertoireTemporaire
Suppression de snapshots
Doc sur les options de la commande.
Utiliser l'option suivante pour voir ce que la commande va faire sans le faire réellement (et controller les erreurs avant de lancer la commande sans le dry-run) :
--dry-run
Ne garder qu'un snapshot par jour sur 7 jours pour un path donné (pour 7 jours où il y a une sauvegarde, c-a-d que si la sauvegarde est le dimanche, cela gardera 1 sauvegarde pour chacun des 7 derniers dimanches) :
rstc forget --path="/home/nico" --keep-daily 7 --prune
Ne garder qu'un snapshot par jour sur 7 jours pour un tag donné :
rstc forget --tag restic1 --keep-daily 7 --prune
En admettant qu'on fasse une sauvegarde journalière, pour chaque tag, ne garder qu'un snapshot par jour sur 7 jours, puis 1 par semaine sur 4 semaines puis 1 par mois sur 6 mois :
rstc forget --group-by tags --keep-daily 7 --keep-weekly 5 --keep-monthly 6 --prune
Pour supprimer tous les snapshots d'un tag par exemple, il faut d'abord supprimer tous sauf le dernier, puis supprimer le dernier manuellement en executant le prune qui reconstituera les index et supprimera réellement les données :
rstc forget --tag montag --keep-last 1 rstc forget bdbd3439 --prune
Commandes utiles
Mise à jour de Restic
Lancer la commande de mise à jour puis remettre les bons droits :
cd /home/restic/bin ./restic self-update chown root:restic restic && setcap cap_dac_read_search=+ep /home/restic/bin/restic
Lister les snapshots
rstc snapshots
Options :
--path="/home" pour ne lister que ceux dans le path donné. --host="prod" pour ne lister que ceux fait depuis l'hôte prod --tag="jeanclaude" pour ne lister que ceux taggé jeanclaude
Exemple :
ID Date Host Tags Directory ---------------------------------------------------------------------- 40dc1520 2015-05-08 21:38:30 kasimir /home/user/work 79766175 2015-05-08 21:40:19 kasimir /home/user/work bdbd3439 2015-05-08 21:45:17 luigi /home/art 590c8fc8 2015-05-08 21:47:38 kazik /srv 9f0bc19e 2015-05-08 21:46:11 luigi /srv
Checker intégrité du dépôt
rstc check
Option :
--read-data : pour checker en profondeur (bcp + long)
Différences entre 2 snapshots
rstc diff 5845b002 2ab627a6
Script de sauvegarde des homes
Dans l'exemple énoncé au départ, on veut sauvegarder tous les homes d'un serveur de prod, de façon à ce que chaque home ait une timeline séparée.
On crée donc un fichier backup-server-homes dans un coin où seul root peut venir et executer ce fichier. Dedans on colle ça (explications ci-dessous) :
#!/bin/bash for f in /home/*; do if [ -d ${f} ]; then sudo RESTIC_PASSWORD='motDePasse' -u restic /home/restic/bin/restic -r sftp:resticbox:/home/resticbackup/resticrepo --verbose backup --tag ${f:6} ${f} fi done
Penser à changer la valeur de RESTIC_PASSWORD par le vrai mot de passe de votre dépôt.
Ce que fait ce script est plutôt simple en réalité :
- avec le
for
on parcourt tous les fichiers directs de /home - si le fichier est un dossier, alors :
- on execute la commande restic de backup du dossier home en cours
La commande execute :
- en tant que l'utilisateur restic
- l'executable restic
- en donnant l'adresse du dépôt via l'argument -r
- de façon verbeuse
- on veut faire un backup
- on tag ce snapshot avec le nom du dossier du home :
${f:6}
veut dire qu'on prend la valeur de la chaine de caractère${f}
a partir du caractère 6, c-a-d qu'on zappe '/home/' - on lui dit quoi sauvegarder,
${f}
contient le path du home en cours, ex : /home/jeanclaude