Sauvegardes avec rsync, lftp et rsnapshot

Besoin

J’ai rajouté la fonction de serveur de sauvegarde à mon petit dockstar . Le besoin est de :

  1. sauvegarder l’ensemble de mes données sur un disque dédié installé sur celui-ci :
    • sauvegarde locale des répertoires importants du serveur lui-même,
    • sauvegarde  des autres machines Linux de mon petit réseau LAN
    • sauvegarde de mes sites internet, avec le cas particulier d’un site wordpress hébergé sur Free (c’est moins important  pour les sites hébergés sur OVH qui dispose de backups proposés par l’hébergeur)
  2. sauvegarder ces backups dans le cloud, chiffrés

Voici un petit aide-mémoire sur la manière dont j’ai traité le premier point

Principe du serveur de sauvegarde

Le dispositif est basé sur trois logiciels libres :

  • le programme perl rsnapshot qui gère des sauvegardes de systèmes de fichier par « snapshot » (clichés) localement ou en réseau via rsync
  • l’utilitaire rsync,  qui permet la réplication de répertoires localement ou sur SSH. rsnapshot s’appuie nativement sur rsync pour faire des sauvegardes incrémentales
  • l’utilitaire lftp qui comme son nom ne l’indique pas est un utilitaire de transfert de fichiers qui supporte une multitude de protocoles (pas seulement FTP mais aussi HTTP, FTPS, SFTP et  …). Il possède des fonctionnalités de scripting et de réplication d’arborescence de répertoires.

rsnapshot permet de copier l’image complète des répertoires à sauvegarder dans des répertoires « snapshot » tournants et avec une périodicité paramétrable (n snapshots « heure »,  p snapshots « jour », q snapshots « mois » …), qu’on peut facilement exploiter pour les restaurations. L’espace disque est utilisé de manière assez efficace car il n’écrit qu’une fois les fichiers dupliqués entre snapshots, grâce aux « hard links » Linux.

Pour sauvegarder les données d’un système « dans le cloud » sans accès SSH, on  complète rsnapshot par lftp qui a des fonctions très similaires à rsync pour les réplications.

Installation et utilisation de rsnapshot

Configuration de base et sauvegarde locale

On peut suivre le bon tutorial  « sauvegarde automatisée de votre machine avec rsnapshot »  pour mettre rapidement en œuvre les sauvegardes locales avec rsnapshot

Attention à la syntaxe de rsnapshot.conf :

  • les séparateurs sont des TAB et pas des espaces.
  • il faut mettre un / à la fin des répertoires à sauvegarder

Par ailleurs,  changer l’option  sync_first à  1 (voir la page man de rsnapshot), et modifier la crontab en conséquence. Il y a deux commandes à passer pour faire un snapshot dans ce cas. Pour la config standard ça donne :

0 */4 * * * /usr/bin/rsnapshot sync && /usr/bin/rsnapshot hourly
45 23 * * * /usr/bin/rsnapshot sync && /usr/bin/rsnapshot daily
30 23 * * 0 /usr/bin/rsnapshot sync && /usr/bin/rsnapshot weekly
15 23 1 * * /usr/bin/rsnapshot sync && /usr/bin/rsnapshot monthly

Sauvegardes via le réseau LAN

On va réaliser ces sauvegardes avec rsync sur SSH. Il faut donc que rsync et ssh soient installés sur la machine à backuper :

  • sur debian :
apt-get install rsync
  • sur openWrt :
 opkg install rsync

Les backups sont déclenchés par le serveur de backup, qui doit pouvoir accéder aux données des autres machines via rsync sur SSH. On préfèrera utiliser une authentification par clefs, en définissant le serveur comme client SSH de confiance. Cela permet d’éviter de laisser logins et mots de passe en clair dans des fichiers de config.

Pour cela, on créé un couple de clefs publique et privée sur notre serveur sans passphrase, puis on copie la clef publique sur chacun des clients. (voir Using Rsync and SSH et Sauvegardes automatisées depuis le cron du serveur qui donnent le principe avec rsync) :

# ssh-keygen -t rsa
# ssh-copy-id -i /root/.ssh/id_rsa.pub root@machineBackupee

Pour une machine openWrt, il faut passer les commandes suivantes pour compléter (les clefs ne sont pas au même endroit)

# cat /root/.ssh/authorized_keys >> /etc/dropbear/authorized_keys
# chmod 0600 authorized_keys
# rm -r /root/.ssh

Sauvegarde d’un poste qui ne reste pas toujours allumé

Pour la sauvegarde de mon PC sous Linux, je préfère utiliser une instance de rsnapshot installée sur celui-ci, avec un montage réseau samba sur le disque de sauvegarde du dockstar :

Avantages :

  1. le PC est plus puissant que le dockstar qui mouline lors des sauvegardes
  2. il est allumé de manière assez irrégulière, et il n’est donc pas garanti que les sauvegardes s’effectuent bien…

Inconvénients :

  1. la configuration n’est pas centralisée sur le seul serveur de sauvegardes
  2. sécurité : oblige à faire des autorisations SSH dans les deux sens

Utiliser fcron pour lancer les snapshots (pallie au fait que la machine n’est pas toujours up)

Sauvegarde distantes sur Internet

SSH n’est pas le bon protocole pour cette tâche : d’une part il n’est pas disponible sur tous les serveurs, et d’autre part il n’est pas du tout optimum en terme de perfs hors LAN. On utilisera plutôt FTP ou mieux une variante sécurisée, grâce à lftp adossé à rsnapshot :

  1. un script lftp va faire la réplication des répertoires à sauvegarder sur un répertoire local, déclenché par rsnapshot
  2. rsnapshot va prendre des snapshots de ce répertoire

Remarque : si quelqu’un avait un peu de courage, ce serait encore mieux de modifier rsnapshot pour lui permettre de prendre en charge lftp au même titre que rsync

Sauvegarde d’un site WordPress hébergé sur Free

Pour sauvegarder un site WordPress, il faut sauvegarder d’une part les fichiers et d’autre part la base MySQL associée. Le tutorial Sauvegarde ftp et mysql automatisée chez free.fr indique comment le faire avec lftp, en tenant compte des particularités de Free qui fournit une page dynamique pour faire un dump de la base de données.

Sur le serveur de sauvegarde les répertoires miroir des différents sites seront dans /home/backup :

  • miroir du site1 = /home/backup/site1.free.fr . C’est ce répertoire dont rsnapshot va prendre des images…
  • dump de la base de données du site 1 = /home/backup/site1.free.fr/MySQdump.gz

ainsi que les scripts de sauvegarde lftp à créer pour chaque site (lftp-site1, etc)

Pour chaque site à sauvegarder, créer le fichier lftp-site1 en modifiant les login et mot de passe (attention à bien laisser l’ordre des backups : fichiers puis MySQL car le fichier de dump MySQL est supprimé par le backup fichiers)

lcd /home/backup
FreeSaveFiles site1 FTPpassword
FreeSaveMySQL site1 MySQLpassword bye

et modifier ses permissions de manière à ce qu’il ne soit lisible que de root :

# chmod 600 /home/backup/lftp-site1

Lancer lftp pour créer le répertoire ~/.lftp et les fichiers associés avec les permissions adéquates

lftp
bye

Editer ~/.lftp/rc (ou /etc/lftp.conf si vous souhaitez que ce soit disponible pour l’ensemble des utilisateurs du serveur) pour ajouter les lignes suivantes :
# general : ne pas garder de log dans ~/.lftp ni d'historique des commandes
set xfer:log false
set cmd:save-rl-history true
# FreeSaveFiles nomsite password : sauve dans nomsite.free.fr
alias FreeSaveFiles "eval -f \"set mirror:parallel-transfer-count 2; set mirror:set-permissions false; open ftp://ftpperso.free.fr; user $0 $1; mirror --delete --only-newer --verbose . $0.free.fr \" "
# FreeSaveMySQL nombase password : sauve dans nombase.free.fr/MySQLDump.gz
alias FreeSaveMySQL "eval -f \"open http://sql.free.fr; set http:post-content-type application/x-www-form-urlencoded; quote post /backup.php \\\"login=$0&password=$1&check=1&all=1 \\\" > $0.free.fr/MySQLdump.gz \""

et modifier ses permissions de manière à ce qu’il ne soit lisible que de l’utilisateur :

# chmod 600 ~/.lftp/rc

Vérifier que ça marche en lançant la réplique à la main

# lftp -f /home/backup/lftp-site1

éditer /etc/rsnapshot.conf  (attention à bien utiliser des tab et pas des espaces comme séparateurs. Je ne sais pas comment le faire en HTML, donc il faut modifier ça à la mano si on fait un copier/coller) :

backup_script   /bin/date "+ backup of site1.free.fr started at %c" unused1
backup_script   /home/backup/lftp -f /home/backup/lftp-site1   unused2
backup  /home/backup/site1.free.fr  site1.free.fr/
backup_script   /bin/date "+ backup of site1.free.fr ended at %c"   unused9

Tester la syntaxe du fichier modifié :

# rsnapshot -t hourly

Tester pour de vrai …

# rsnapshot hourly

Sauvegarde d’un site simple

Dans l’exemple ci-dessus (sauvegarde base et fichiers d’un hébergement Free)  il était nécessaire de préciser user et mot de passe dans l’URL permettant de récupérer le dump de la base MySQL. Dans la plupart des autres cas on a affaire à une authentification  standard et il est possible d’utiliser le fichier ~/.netrc pour conserver login et mot de passe, ce qui permet de simplifier les scripts de backup et garder login et mots de passe dans un fichier standard :

Indiquer login et mot de passe de la machine à sauvegarder et sécuriser l’accès au fichier de config

# vi ~/.netrc
machine mamachine login monlogin password monpassword

# chmod 600 ~/.netrc

On peut désormais s’authentifier avec lftp  sans indiquer à chaque fois le mot de passe. Par exemple , la commande suivante permet de lister le répertoire racine du site site1.free.fr :

 lftp -d -e ls ftp://site1@ftpperso.free.fr/

Mon retour d’expérience sur rsnapshot

La CPU monte pas mal sur mon petit dockstar (charge CPU entre 2,5 et 4,5 lorsque les fichiers sont effectivement sauvegardés) mais ça n’empêche pas le serveur squeezebox de fonctionner correctement. On voit dans le graphe ci-dessous l’initialisation du process avec le 1er backup horaire qui dure une petite heure et demi mais les suivants rien du tout, les fichiers à sauvegarder n’ayant pas été modifiés. Au besoin on peut utiliser nice.

Liens utiles et références

Sauvegardes Linux (général)

rsync

rsnapshot

lftp

sauvegarde des sites perso Free