Outils pour utilisateurs

Outils du site


restic_utilitaire_de_sauvegarde

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 RESTIC_PASSWORD contient le mot de passe du dépôt (différent du user resticbackup du server save). Il faudra changer motDePasse par sa valeur une fois le dépôt initialisé !

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

Commandes utiles

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 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
restic_utilitaire_de_sauvegarde.txt · Dernière modification: 2020/03/28 00:29 par n1c0