Une problématique qui se pose tout le temps en informatique, c'est la protection des données. C'est-à-dire leur confidentialité et leur disponibilité.

Avec tous les services que j'ai mis en place (avec docker), j'ai rapidement commencé à me poser la question de la sauvegarde de mes données.
Si un jour une défaillance matérielle entraîne une perte de toutes les données utilisées par mes services, comment je fais ?

Il y a quelques années, j'avais acheté pour 30€ un vieux NAS qui me permettait de stocker mes documents, mes fichiers audio et vidéos, toute ma vie numérique quoi ! Mais depuis quelque temps, je suis passé sur un fournisseur de Cloud qui se veut en mode "zero knowledge". Ce qui veut dire qu'ils ne peuvent pas accéder aux données de leurs clients (c'est en tout cas ce que veux la théorie ;-) ).
Depuis, mon NAS était un peu à l'abandon.

L'idée est d'utiliser ce que j'ai à disposition, et ça tombe bien car le but d'un NAS, c'est aussi de stocker des sauvegardes !

Le matériel

Mon NAS est un DLink DNS 323, qui permet un stockage de 2x 2To maximum. C'est donc largement suffisant à mes besoins.

DNS323

La connexion est lente (maximum 500 ko par secondes), mais je souhaite sauvegarder seulement des fichiers de configuration et quelques images docker. Rien de très volumineux en somme.

Rsync

Je vais utiliser RSync (pour "remote synchronization"), qui a un fonctionnement client / serveur, en passant par une connexion SSH.

Installation du serveur Rsync

La première étape est de trouver comment faire tourner un serveur SSH et un serveur RSyncsur mon vieux NAS. Heureusement pour moi, ce modèle a (ou avait) une assez grande communauté qui a développé un script (fun plug), apportant de nouvelles fonctionnalités, comme LAMP et un serveur RSync!

Je ne développerai pas l'installation du script "fun plug" car la plupart des NAS récents proposent beaucoup d'applications par défaut, dont RSync. C'est le cas pour Synology en tout cas.

Si vous avez un NAS identique au mien, le tutoriel est ici. Pour la mise en place d'un serveur RSync sur Ubuntu, c'est très simple.

$ sudo apt-get install rsync

Pour activer l'écoute distante, il faut éditer le fichier /etc/default/rsync et dé-commenter la ligne RSYNC_ENABLE=yes.
Puis on créée ou on modifie le fichier de configuration /etc/rsycnd.conf :

uid = rsync  
gid = rsync     # rsync sera lancé avec l'utilisateur rsync.

[nom_du_partage]                              # Configuration du partage de sauvegarde
   path = /Repertoire/de/sauvegarde
   comment = Sauvegarde depuis mon serveur
   read only = false                          # Partage en lecture seule ou non

Ensuite, on créée l'utilisateur et le groupe rsync.

$ useradd rsync
$ passwd rsync
$ groupadd rsync
$ usermod -G -a rsync rsync

Enfin, on lui attribue les droits sur les dossiers de sauvegarde.

$ chown -R rsync:rsync /Repertoire/de/sauvegarde
$ chmod -R 775 /Repertoire/de/sauvegarde

Et on redémarre pour appliquer les modifications : /etc/init.d/rsync restart.

Source

Sauvegarde distante

Un des avantages de RSync, c'est qu'il fonctionne en passant par une connexion SSH. Elle est donc cryptée chiffrée, contrairement à une connexion avec FTP.

De plus, les sauvegardes sont incrémentielles. A la première utilisation, RSync copie tous les fichiers et dossiers à sauvegarder (comme toute solution de sauvegarde). Mais ensuite, il ne copiera que les éléments modifiés depuis la dernière sauvegarde.
La première sauvegarde peut être un peu longue, en fonction de la quantité de données que vous avez à sauvegarder. Mais les suivantes seront extrêmement plus rapides (en fonction du nombre de changements qui aurons eu lieu).

C'est pour cette raison qu'une connexion un peu lente n'est pas forcément un problème.

Lancer une sauvegarde

Maintenant que j'ai un serveur RSync qui tourne, je peux faire un premier essai.

$ rsync --progress --compress --archive --recursive --exclude="/inutile/*" /Dossier/à/sauvegarder utilisateur@1.2.3.4:chemin/de/sauvegarde

En décomposant la commande, ça donne :

  • rsync pour appeler le client
  • --progress pour afficher l'avancée de la sauvegarde au fur et à mesure
  • --compress (ou -z en moins explicite) pour compresser
  • --archive pour demander à tout sauvegarder
  • --recursive pour parcourir tous les dossiers et sous dossiers
  • --exclude="Chemin" pour exclure un dossier, un chemin ou utiliser un Pattern
  • /Dossier/à/sauvegarder spécifie à partir de quel dossier RSync commence
  • utilisateur@1.2.3.4 est le paramètre de connexion SSH
  • :chemin/de/sauvegarde est le chemin du dossier distant qui contient(dra) les sauvegardes

Mais attends, ça me demande mon mot de passe de connexion SSH ? Comment je vais pouvoir l'automatiser ?

Bonne question ;-)

Automatiser

Pour faire en sorte que la commande ne nous demande pas de mot de passe, il n'y a qu'une seule solution : l'authentification par clé.

Le tutoriel du forum de qnapclug explique qu'il existe la méthode --password-file=/chemin/vers/pwd.txt. Mais cette méthode ne fonctionne pas si on utilise RSync avec SSH.

Mettre en place une identification par clé

L'authentification par clé privée, c'est assez simple en fait. Il faut d'abord générer une paire de clé :

$ ssh-keygen -t rsa -b 4096 -C username@domain.tld
Generating public/private rsa key pair.  
Enter file in which to save the key (/home/louis/.ssh/id_rsa):  
Enter passphrase (empty for no passphrase):  
Enter same passphrase again:  
Your identification has been saved in /home/louis/.ssh/id_rsa.  
Your public key has been saved in /home/louis/.ssh/id_rsa.pub.  
The key fingerprint is:  
cb:61:48:6b:b4:53:00:9b:d1:2a:cf:44:88:79:c2:19 username@domain.tld  

-C c'est pour ajouter un commentaire à la clé. Ça peut être votre adresse email ou votre nom de domaine. Bien sûr, c'est optionnel.

Maintenant il faut éditer la configuration du serveur SSH, dans /etc/ssh/sshd_config et décommenter la ligne #PubkeyAuthentication yes, qui permettra d'utiliser une clé publique au lieu du mot de passe.

Vous pouvez maintenant copier votre clé publique sur le serveur de destination :

  • ssh-copy-id -i ~/.ssh/id_rsa.pub utilisateur@1.2.3.4
  • Ou cat ~/.ssh/id_rsa.pub | ssh utilisateur@1.2.3.4 "cat - >> ~/.ssh/authorized_keys"

Vous devriez maintenant être en mesure de vous connecter sans mot de passe, car vous êtes reconnu grâce à l'association clé privée / clé publique.

Automatiser la sauvegarde RSync

Avec l'utilisation de crontab, vous pourrez lancer un script à heure fixe.

$ crontab -e

Ajoutez ensuite la ligne suivante : 0 1 * * * sh /home/louis/scripts/rsync_backup.sh.

  • 0 1 * * * : Tous les jours à 01h00.
  • sh /home/louis/scripts/rsync_backup.sh : Chemin vers le script.

Et voilà, c'est terminé. Vous avez maintenant une sauvegarde à heure fixe, hebdomadaire. Bien sûr, c'est à adapter suivant les besoins. Si vous êtes du genre compulsif de la sauvegarde, vous pouvez toujours essayer 1 * * * * (toutes les minutes !).

Vérifier le bon fonctionnement

J'aime quand c'est automatique, que je n'ai rien à faire pour que mes données soient sauvegardées. Mais comment m'en assurer ?

J'ai créer un petit script, avec une seule fonction qui appelle RSync et redirige toute la sortie vers un fichier de log. Comme ça, de temps à autres, je peux vérifier le temps que la sauvegarde a pris, et m'assurer du bon fonctionnement de celle-ci.

Script

#!/bin/bash

echo '==========================================='  
echo '| Lancement du script de sauvegarde RSYNC |'  
echo '==========================================='  
echo ''

# Date du jour & création du fichier de log
date='date +"%c"'  
date_fichier_log=$(date +"%d.%m.%y")  
log='/home/louis/logs/rsync/rsync_'$date_fichier_log'.log'

touch $log

echo '===============================================================' >> $log  
echo -n 'Nouvelle sauvegarde : ' >> $log  
date >> $log  
echo '' >> $log

function backup_home {  
  rsync --progress --compress --archive --recursive --checksum --delete --backup --backup-dir=deleted/ --stats /home/$1 utilisateur@1.2.3.4:home/$1/ | tee -a $log
}

echo -e '\n\tSauvegarde du dossier cozy'  
echo -e '\t==========================\n'  
backup_home cozy

echo -e '\n\tSauvegarde du dossier ghost'  
echo -e '\t===========================\n'  
backup_home ghost

echo -e '\n\tSauvegarde du dossier gladys'  
echo -e '\t============================\n'  
backup_home gladys

echo -e '\n\tSauvegarde du dossier louis'  
echo -e '\t===========================\n'  
backup_home louis

echo -e '\n\tSauvegarde du dossier mumble'  
echo -e '\t============================\n'  
backup_home mumble

echo -e '\n\tSauvegarde du dossier nodebb'  
echo -e '\t==============================\n'  
backup_home nodebb

echo -e '\n\tSauvegarde du dossier rocket.chat'  
echo -e '\t=================================\n'  
backup_home rocket.chat

echo -e '\n\tSauvegarde du dossier emby'  
echo -e '\t============================\n'  
backup_home emby

echo -e '\n===============================================================' >> $log  
echo -n 'Sauvegarde terminée le ' >> $log  
date >> $log  
echo -e '===============================================================\n' >> $log  

Sources: forum.qnapclub.fr, www.fatdex.net, man page RSync, illustration de l'article.