======= Restic ======= [[https://restic.net/|Restic]] est un programme libre de sauvegarde incrémentale de fichiers. La doc est [[https://restic.readthedocs.io/|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 [[https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html|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 [[https://github.com/restic/restic/releases|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 [[https://restic.readthedocs.io/en/stable/manual_rest.html#manage-tags|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. Ce dossier temporaire doit appartenir au user restic. 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 ===== [[https://restic.readthedocs.io/en/stable/060_forget.html|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 jusqu'au lundi d'avant) : 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 {{tag>n1c0 bash linux utilitaire futuretic}}