J’ai décrit, il y a un peu plus d’un an, ma méthode de sauvegarde utilisant backupninja et rdiff-backup. Bien que très efficace, cette solution n’est ni sécurisée ni utilisable avec un serveur de sauvegarde externe (comme le dedibackup proposé par dedibox/online qui ne supporte que ftp).
Voici donc une méthode légèrement différente utilisant toujours backupninja pour l’ordonnancement et duplicity pour le stockage.
Les concepts
En me relisant, je me suis rendu compte que j’avais surtout décrit la partie pratique et pas assez la logique. Et c’est dommage parce-que bien comprendre ce qu’on fait (et pourquoi) est au moins aussi important que comment on le fait.
backupninja
BackupNinja est un ordonnanceur c’est à dire un chef d’orchestre qui va gérer l’ensemble du processus :
- définir de façon centrale ce qu’on veut sauvegarder,
- effectuer des tâches avant la sauvegarde proprement dite (par exemple faire un export des bases de données),
- déclencher la sauvegarde et la copie
- effectuer des tâches après la sauvegarde (envoyer un mail, faire du ménage…)
duplicity
Duplicity est le programme qui crée la sauvegarde, la chiffre et la transfère sur le serveur.
Environnement de travail
Les points évoqués ici décrivent l’environnement auquel s’applique ce tutoriel.
- L’objectif est de stocker les sauvegardes sur un serveur dedibackup donc en FTP.
- Les machines à sauvegarder utilisent des distributions sur bases debian (debian ou ubuntu)
Au boulot !
D’abord réfléchir
J’ai bien écrit d’abord.
Il faut réfléchir et écrire (sur un pad, un papier…) ce qu’on veut faire. Ça évitera de revenir en arrière, modifier une config, tester des choses déjà testées (ou oublier des tests), bref ça fera gagner du temps et vous donnera une vision claire de ce qu’est votre objectif.
Récapituler à quoi sert cette machine
- c’est un serveur de mail (courier-mta)
- c’est un serveur PostgreSQL
- c’est (hélas) aussi un serveur MySQL
- c’est un serveur OwnCloud
- c’est un serveur web (Apache)
Quoi sauvegarder
- la config du système (
/etc
) - les bases de données : Backupninja fait des sauvegardes individuelles de chaque base, les compresse et place les fichiers résultants dans
/var/backups/postgres
ou/var/backups/mysql
. - les boîtes-aux-lettres (
/home/*/Maildir
) - les données web (
/var/www
)
Quand sauvegarder
Vraisemblablement la nuit, quand le serveur est le moins chargé (en n’oubliant pas que tous les admins qui utiliseront le serveur de sauvegarde auront la même “idée”).
Comment sauvegarder
Là se pose l’éternel conflit entre l’espace occupé et la facilité de récupération : une sauvegarde complète tous les jours ou bien une sauvegarde complète tous les dimanches et une sauvegarde incrémentale chaque jour (ou n’importe quel autre schéma) ?
Quel est le risque ? Si on perd une des sauvegardes incrémentales, on perd ce qui n’a été sauvegardé que de façon incrémentale depuis.
Faites ce que je dis ?
Pour faire une progression en douceur, je vais procéder en deux étapes : d’abord une simple sauvegarde d’un dossier /home/xxx et ensuite tout ce que j’ai décrit ci-dessus.
Ce n’est pas antinomique avec la nécessité de réfléchir d’abord. Rien ne vous empêche de procéder petit à petit. Le fait d’avoir à l’avance une vision d’ensemble de votre objectif vous aidera à chaque étape.
Vue d’ensemble
La configuration de backupninja
est répartie entre :
- la configuration générale (
/etc/backupninja.conf
) : utilisateur, groupe, adresse email, logs, dossier contenant les configurations - les actions (
/etc/backup.d/*
)
Chaque action est définie par un fichier. Les fichiers sont nommés XXce_que_vous_voulez.YYYYY où XX est un nombre compris en 10 et 99 qui détermine l’ordre dans lequel se déroulent les actions et YYYYY indique le type d’action. backupninja est fourni avec une dizaine de types d’actions par défaut (.pgsql pour sauvegarder les bases PostgreSQL, .dup pour sauvegarder, chiffrer et transférer avec duplicity, etc.)
Le serveur de sauvegarde
S’agissant d’une machine sur laquelle on n’a pas du tout la main, il n’y a rien à faire ; simplement connaître son nom et les login/mot de passe à utiliser.
La machine à sauvegarder
On commence, bien sûr, par installer les deux outils :
sudo apt-get install backupninja duplicity ncftp
backupninja est livré avec des exemples d’actions tout prêts. Ne réinventons pas la roue.
cp /usr/share/doc/backupninja/examples/example.dup /etc/backup.d/90-do_it.dup
Ce qui veut dire que mon action .dup (duplicity) sera la dernière (90) exécutée.
Rendez ce fichier lisible uniquement par root :
chmod 600 /etc/backup.d/90-do_it.dup
Utilisez votre éditeur de texte préféré pour modifier ce fichier.
Par défaut, duplicity va créer des volumes de 25Mo soit 40 fichiers par gigaoctet. Or, sur dedibackup, il existe une limite à 1000 fichiers soit, dans notre cas, 25Go (alors qu’on paye pour 750 Go). On va donc demander à duplicity de créer des volumes plus gros. Les conséquences sont :
- besoin de plus d’espace en local pour créer et chiffrer chaque volume,
- possible légère accélération des transferts,
- plus lent pour récupérer un seul fichier puisqu’il faudra récupérer tout le volume qui le contient.
Théoriquement, je devrais prévoir un peu plus de 750Mo par volume, prendre en compte le fait que le dernier volume sera toujours plus petit que la taille maximale… On ne vas pas chipoter, je vais faire des volumes d’un Go.
Au début du fichier, avant la première section (gpg), il est possible de passer des options directement à duplicity. C’est là que je vais indiquer la taille du volume :
options = --volsize 1000
D’autre part, vu qu’on va utiliser desturl
, la fonction testconnect
ne sera pas utilisable, on va donc la désactiver pour s’éviter un warning inutile :
testconnect = no
Section [gpg]
Pour ma part, je vais chiffrer les sauvegardes avec un mot de passe symétrique. Je mets juste
password = manteaucarotteinterditcastagnettes
Section [source]
Je ne vais sauvegarder que /etc
et /home/monlogin
. Donc :
include /etc
include /home/monlogin
Section [dest]
Je vais utiliser des sauvegardes incrémentales et un backup “full” tous les trois jours. Donc je n’ai qu’à décommenter la ligne increments
et mettre la valeur 3.
Maintenant, il faut dire où on sauvegarde :
desturl = ftp://sd-12345@dedibackup-dc3.online.net/mamachine
Et comme c’est en FTP, indiquer le mot de passe tel que défini dans l’interface d’Online (entre 8 et 15 caractères, non vous ne rêvez pas) :
ftp_password = unTruc12Reve
On teste
backupninja -d -n
(-d = debug, -n = now)
Quand c’est fini, connectez-vous sur le serveur FTP et regardez si des fichiers apparaissent bien.
On vérifie aussi les éventuelles différences entre les fichiers avec duplicity (attention, les fichiers sont sauvegardés en omettant le “/” initial) :
duplicity verify --file-to-restore etc ftp://sd-12345@dedibackup-dc3.online.net/mamachine/ /etc
Au boulot (vraiment !)
Je reprends ma todo-list et je complète la config :
c’est un serveur de mail (courier-mta)
Donc je dois sauvegarder les dossiers /home/*/Maildir. J’ajoute une ligne dans 90-do_it.dup
dans la section [source] :
include /home/*/Maildir
c’est un serveur PostgreSQL
On va utiliser une action .pgsql :
cp /usr/share/doc/backupninja/examples/example.pgsql /etc/backup.d/10-Postgres.pgsql
Et je précise le format custom
parce-qu’il est beaucoup plus pratique :
format = custom
Cette action fabrique le(s) dump(s) et les place (par défaut) dans /var/backups/postgres. Il ne faut donc pas oublier d’ajouter à 90-do_it.dup
l’include correspondant :
include /var/backups/postgres
c’est (hélas) aussi un serveur MySQL
Même motif, même punition.
cp /usr/share/doc/backupninja/examples/example.mysql /etc/backup.d/20-MySQL.mysql
Comme les valeurs par défaut (en haut du fichier) me vont bien, je n’y touche pas. J’ajoute juste l’include à 90-do_it.dup :
include /var/backups/mysql
c’est un serveur OwnCloud
include /var/www/owncloud
c’est un serveur web (Apache)
include /var/www/htdocs
Derniers ajustements
Les fichiers de /etc/backup.d ne doivent être lisibles que par root :
chmod 600 /etc/backup.d/*
Tests
backupninja -d -n
Sur dedibackup, il faut compter 3mn/Go soit 5 heures pour 100Go.
Résumé
Aide-mémoire pour ceux qui ont déjà lu :
sudo -i
apt-get install backupninja duplicity ncftp
cp /usr/share/doc/backupninja/examples/example.dup /etc/backup.d/90-do_it.dup
Modifier :
options = --volsize 1000
testconnect = no
[gpg]
password = un_truc_complique
[source]
include = /etc
[dest]
desturl = ftp://sd-12345@dedibackup-dc3.online.net/mamachine
ftp_password = unTruc12Reve
PostgreSQL
cp /usr/share/doc/backupninja/examples/example.pgsql /etc/backup.d/10-Postgres.pgsql
Indiquer :
format = custom
MySQL
cp /usr/share/doc/backupninja/examples/example.mysql /etc/backup.d/20-MySQL.mysql
Permissions
chmod 600 /etc/backup.d/*
Conclusion
Configurer ses sauvegardes ainsi prend 5 minutes montre en main. Je ne vois pas comment on peut faire plus simple. C’est très souple (vous pouvez créer vos propres types d’actions) et très sécurisé (puisque tout est chiffré, vous pouvez sauvegarder à peu près n’importe où, même dans un pays qui n’a aucun respect de la vie privée).