Configurer un backup incrémental avec duplicity, rsync, et backupninja sous Debian
Par Mathieu le mardi 9 juin 2015, 14:37 - Hacks - Lien permanent
Introduction
Si vous savez ce qu'est un backup, vous devriez savoir qu'il y a plusieurs types de backups :
- Un backup complet copie tous les fichiers, en espérant que votre disque de backup soit assez grand pour accueillir plus d'un backup.
- Un backup incrémental commence par faire un backup complet, puis les fois suivantes n'enregistre que les "différences" sur les fichiers modifiés.
Évidemment, un backup complet est plus simple à restaurer, puisque ce sont les fichiers, et rien que les fichiers ; alors que le backup incrémental a un format de fichier spécial lui permettant de représenter les "diffs" à chaque sauvegarde. Mais considérant le gain d'un backup incrémental en bande passante, vitesse, et espace disque , votre solution pour un backup régulier devrait être le backup incrémental.
Les outils
Duplicity est un logiciel libre similaire à rdiff-backup. Duplicity permet de créer un backup incrémental. Duplicity peut également chiffrer les fichiers, pour pouvoir les envoyer en toute sécurité sur un service de stockage distant. Dans une configuration classique, Duplicity est utilisé conjointement avec rsyc pour optimiser les temps de transfert vers le stockage distant, mais vous pouvez très bien utiliser un disque de stockage local, un serveur FTP, ou un cloud Amazon E3 pour y envoyer vos sauvegardes. Comme le titre l'indique, dans cet exemple j'utiliserai rsync.
Et les bases de données ? Les bases de données ne peuvent pas être sauvegardées simplement en copiant les fichiers de données, car cela peut provoquer une corruptio de données, et vous aurez des bases inutilisables dans vos sauvegardes. Il nous faudrait donc un script qui dump toutes les bases de données avant de sauvegarder ces fichiers de dump via notre méthode de sauvegarde préférée.
Bonne nouvelle : backupninja sait faire tout cela. Backupninja est une sorte de "backup-master" : il est capable de récupérer des données depuis différentes sources (fichiers, bases de données...) et les envoyer à différentes destinations (backup simple, duplicity...), il suffit juste d'écrire les fichiers de configuration correspondants !
Dans cet exemple, nous utiliserons donc backupninja pour récupérer nos fichiers et nos bases de données, et les envoyer pour un backup incrémental Duplicity, stocké sur un serveur SSH distant, en utilisant rsync.
C'est parti !
Pré-requis
- Une machine sous Debian que nous allons backuper, appelons-la production
- Un serveur de backup avec accès SSH (SSH est requis pour rsync mais vous pourriez avoir un simple serveur FTP), appelons-la backup
- Savoir modifier des fichiers de configuration et relancer un service
Configurez le compte sur le serveur de backup
Pour pouvoir envoyer les sauvegardes vers le serveur backup via rsync, nous avons besoin de nous identifier sur ce serveur à partir de production sans spécifier de mot de passe.
Tout d'abord, travaillons en root sur production : sudo -s
Créez les clef SSH pour root : ssh-keygen -t rsa
Après avoir tapé la commande précédente, la clef publique va s'installer dans /root/.ssh/id_rsa.pub
et la clef privée dans /root/.ssh/id_rsa
À présent, considérons backup, vérifiez que votre serveur SSH sur backup accepte l'authentification par clefs privées. Dans le fichier /etc/ssh/sshd_config
, les lignes suivantes doivent apparaître (non commentées) :
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile %h/.ssh/authorized_keys
Sinon, ajoutez-les et relancez le service ssh.
Maintenant, ajoutez l'utilisateur prod_server sur backup : useradd prod_server
Vous pourriez avoir envie changer son dossier home, je suppose que vous savez comment le faire.
Retour sur production, copiez la clef publique dans le fichier /home/prod_server/.ssh/authorized_keys de backup.
La méthode bourrin : scp /root/.ssh/id_rsa.pub root@backup:/home/prod_server/.ssh/authorized_keys
La méthode gentlemen : copiez-collez le contenu de production:/root/.ssh/id_rsa.pub
à la fin du fichier backup:/home/prod_server/.ssh/authorized_keys
Si vous avez tout fait correctement, vous devriez pouvoir vous connecter en ssh depuis votre compte root de production sur le compte prod_server de backup sans spécifier de mot de passe.
Installez backninja (et ses amis)
Sur production, entrez la commande : sudo apt-get install backupninja duplicity rsync
Configurez le dump des bases de données
C'est parti, configurons backupninja !
Pour MySQL, copiez le fichier d'exemple à partir de /usr/share/doc/backupninja/examples/example.mysql
dans le dossier /etc/backup.d/10-alldb.mysql
et modifiez-le pour vos propres besoins (le fichier est simple et bien commenté).
databases = all backupdir = /var/backups/mysql hotcopy = no sqldump = yes compress = yes configfile = /etc/mysql/debian.cnf
Pour PostgreSQL, même chose ! Copiez le fichier /usr/share/doc/backupninja/examples/example.mysql
dans le dossier /etc/backup.d/10-alldb.pgsql
et modifiez les valeurs souhaitées.
backupdir = /var/backups/postgres databases = all compress = yes format = plain
Pourquoi est-ce que j'utilise le préfixe 10-
au début de mes fichiers ? Pour la même raison pour laquelle vous préfixez vos fichiers de configuration Nginx : pour gérer l'ordre de lecture. J'ai besoin de créer les dumps des bases de données avant de créer le backup des fichiers, sinon Duplicity enregistrera les fichiers de la veille, et les fichiers que nous venons de créer devront attendre le lendemain pour être sauvegardés ! Donc, les fichiers de configuration qui vont créer les dumps seront préfixé par 10-
et les fichiers pour configurer le backup incrémental de Duplicity seront préfixés par 20-, par exemple
.
Les dumps SQL seront stockés dans /var/backups/
selon ma configuration actuelle.
Configuration de Duplicity pour le backup incrémental
Comme tout à l'heure, copiez le fichier d'exemple : cp /usr/share/doc/backupninja/examples/example.dup
/etc/backup.d/20-files.dup
Et modifiez les valeurs, en particulier la valeur desturl :
# Disable testconnect because we use desturl testconnect = no # You may change this if you are a partition-maniac tmpdir = /tmp [gpg] # Using symetric encryption for archive files # Note that an encryption method is mandaory, either with symetric or private keys # Don't forget to note that password somewhere ! password = whateveryouwant [source] # Specify the paths to your files include = /var/spool/cron/crontabs include = /var/log include = /var/mail include = /var/www include = /etc include = /root include = /home include = /usr/local # And to your database dumps ! include = /var/backups/mysql include = /var/backups/postgresql # There are some files we don't need # Don't forget to add the tmpdir in the exclude list, if it was included in the previous paths ! exclude = /home/*/.gnupg exclude = /var/cache/backupninja/duplicity exclude = /tmp [dest] # Adjust these to your own taste incremental = yes increments = 15 keep = 30 keepincroffulls = all # Specify the backup server crendentials ## desturl = file:///usr/local/backup ## desturl = rsync://user@other.host//var/backup/bla ## desturl = s3+http:// ## desturl = ftp://myftpuser@ftp.example.org/remote/ftp/path desturl = rsync://prod_server@backup//home/prod_server/data # Only if you choose FTP # ftp_password = whateveryouwant
Cette configuration utilise un chiffrement symétrique pour les archives sauvegardées. Si vous voulez mettre en place un chiffrement asymétrique, vous pouvez lire la documentation et adapter la configuration.
Configurez la fréquence des backups
Vous avez peut-être remarqué que backupninja a créé un cronjob dans /etc/cron.d/backupninja
mais si vous ouvrez ce fichier, vous constaterez que le cronjob est lancé toutes les heures. Pourquoi ? Parce que le cronjob n'est utilisé que pour lancer le backup, qui vérifie si une mise à jour du backup est nécessaire avant de lancer réellement l'opération de backup. Pour modifier les heures et la fréquence des mises à jour, vous pouvez modifier le fichier /etc/backupninja.conf
:
when = everyday at 01:00
Ajustez la valeur selon vos souhaits. Vous pouvez combiner plusieurs lignes, si vous voulez plusieurs dates de démarrage (en savoir plus).
Démarrez votre backup, et vérifiez son bon fonctionnement
C'est le moment de démarrer votre backup pour la première fois ! Si vous ne voulez pas attendre une heure pour que le cron se lance, vous pouvez lancer le backup immédiatement avec la commande backupninja -d -n
Si aucune erreur ne s'affiche pendant l'exécution, bravo ! Vous venez de configurer backupninja avec succès !
À présent, contrôlons que notre backup est bien arrivé : connectez-vous à backup et listez le fichiers dans le dossier /home/prod_server/data/
Vous devriez voir les fichiers d'index créés par Duplicity, vous ne pouvez pas les ouvrir sans utiliser quelques commandes :
- Afficher le statut des "collections" : duplicity collection-status file:///home/prod_server/data
- Lister les fichiers dans l'archive : duplicity list-current-files file:///home/prod_server/data
- Restaurer le dernier backup dans un dossier précis duplicity restore file:///home/prod_server/data/ /home/prod_server/test-restore/ (si vous ne voyez des erreurs mais que les fichiers sont bien présents à la fin de l'exécution de la commande, c'est parce que Duplicity essaye de restaurer les atributs "prorpiétaire" des fichiers, et qu'il ne peut pas le faire si vous n'avez pas lancé la commande en root).
Vous devez avoir le programme Duplicity installé sur le serveur backup pour pouvoir utiliser ces commandes en mode shel sur backup.
Vous pouvez aussi lancer ces commandes sur le serveur production et accéder aux backups stockés sur backup en utilisant la desturl que vous avez configurée au lieu du préfixe file://
que vous utilisez quand vous lancez la commande sur backup.
Conclusion
Vous devriez maintenant être capables d'implémenter une solution complète de backup en utilisant backupninja.
J'espère que cet article vous a été utile, vous pouvez rédiger un commentaire via le formulaire ci-dessous si vous rencontrez des problèmes avec cette documentation.
Commentaires
Eh bien merci beaucoup, votre billet m'a permis de m'en sortir ;-)
Pour info, je sauvegarde mon poste de travail sous Debian Jessie 8.5 vers un répertoire situé en local sur mon NAS qui tourne sous OpenMediaVault 2.2.5 (Wheezy, la version 3 étant encore en bêta à cette heure).
Je sauvegarde ma base de données Dolibarr 3.9.1 qui est mon principal outil journalier.
J'ai choisi le FTP comme protocole, il suffit d'indiquer l'adresse IP et le nom du répertoire partagé ; j'avais indiqué le nom du volume au départ et je me retrouvais avec une erreur "access denied".
A quand le billet sur le crash-test et les possibilités de restauration ? :D
Peut-être bientôt, c'est un sujet intéressant. :)
Juste pour info, la commande "ninjahelper" permet d'ouvrir une interface graphique basique que j'ai trouvée bien utile ; info glanée ici : http://xmodulo.com/backup-debian-sy...
C'est bon à savoir, je connaissais pas. Merci pour l'info. :)