Sauvegarder les données de son serveur avec RSync
Note aux lecteurs
Cet article est vieillissant et son contenu doit être révisé. Attention donc : les explications, commandes systèmes et autres informations peuvent dorénavant être incorrectes ou inexactes.
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.
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
.
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 commenceutilisateur@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.bash /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.