Backup avec backupninja et duplicity

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).

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *