Backup incrémental avec Duplicity : installation et scripts périodiques

18 Nov

Une des tâches que l’on se doit de très rapidement mettre en place sur un serveur est la sauvegarde. Il y a plusieurs alternatives pour cela. De mon côté, n’étant qu’un administrateur amateur, j’ai trouvé mon bonheur avec duplicity.

Duplicity est un programme de sauvegarde incrémentale pour systèmes GNU/Linux tels Debian ou Ubuntu. Il permet de réaliser des sauvegardes à distance (via ssh et scp, rsync, ftp, ou Amazon S3) en chiffrant les données. Le processus utilisé par duplicity consiste en un « full backup » suivi d’une série de « backup incrémental » sous la forme d’archives tar chiffrées par gpg.

J’associe à duplicity une batterie de quelques scripts simples qui permettent de faciliter la sauvegarde, la configuration et la restauration en cas de besoin.

 

Installer duplicity

Pour commencer il vous faut installer le programme :

apt-get install duplicity

(ajoutez évidemment sudo si vous n’êtes pas connecté en root).

Si vous allez utiliser duplicity pour un backup en FTP, pensez également à installer :

apt-get install ncftp

 

Utiliser la commande duplicity

Vous pouvez faire le choix d’utiliser directement la commande duplicity. Voici les principales utilisations

  • duplicity full [options] “source_dir” “target_url”
    Commande pour lancer un full backup
  • duplicity incremental [options] “source_dir” “target_url”
    Commande pour lancer un backup incrémental
  • duplicity list-current-files [options] “target_url”
    Permet de lister les fichiers sauvegardés
  • duplicity remove-older-than time [options] [-- force] “target_url”
    Permet de supprimer les sauvegardes anciennes
  • duplicity collection-status [options] “target_url”
    Affiche des informations sur l’état de la sauvegarde
  • duplicity cleanup [options] [-- force] “target_url”
    Nettoie les fichiers en erreur et orphelins, etc (notamment en cas de crash d’une sauvegarde). Pour effacer complètement une sauvegarde, il faut supprimer manuellement la chaîne de sauvegarde sur le répertoire de destination puis lancer ensuite un duplicity cleanup.
  • duplicity [restore|verify] [options] “source_url” “target_dir”
    Commande pour simuler ou lancer une restauration
  • duplicity --help
    Affichage de l’aide

Vous pouvez allez plus loin avec man duplicity ou duplicity --help.

 

Faciliter la manipulation des sauvegardes

Plutôt que d’utiliser manuellement les commandes, j’ai un peu plus pratique : une batterie de quelques scripts simples pour gérer tout cela de manière un peu plus ergonomique.

Ces script s’appuient sur l’appel d’un fichier de configuration. Il sera ainsi simple d’avoir autant de fichiers de configuration que de sauvegardes à réaliser (par exemple une sauvegarde principale complète en FTP et une sauvegarde complément de certain fichiers uniquement sur un autre support). Aucune limite donc à votre paranoïa ! Les plus prudents d’entre vous seront comblés.

 

Installer les scripts de sauvegarde

Nous allons installer ces script dans le répertoire /usr/local/sbin

# On récupère les scripts
wget -O /usr/local/sbin/master-backup-cleanup.sh --no-check-certificate https://raw.github.com/yvangodard/Scripts-Utiles/master/duplicityscripts/scripts/master-backup-cleanup.sh
wget -O /usr/local/sbin/master-backup-listing.sh --no-check-certificate https://raw.github.com/yvangodard/Scripts-Utiles/master/duplicityscripts/scripts/master-backup-listing.sh
wget -O /usr/local/sbin/master-backup-restore.sh --no-check-certificate https://raw.github.com/yvangodard/Scripts-Utiles/master/duplicityscripts/scripts/master-backup-restore.sh
wget -O /usr/local/sbin/master-backup-status.sh --no-check-certificate https://raw.github.com/yvangodard/Scripts-Utiles/master/duplicityscripts/scripts/master-backup-status.sh
wget -O /usr/local/sbin/master-backup-verify.sh --no-check-certificate https://raw.github.com/yvangodard/Scripts-Utiles/master/duplicityscripts/scripts/master-backup-verify.sh
wget -O /usr/local/sbin/master-backup.sh --no-check-certificate https://raw.github.com/yvangodard/Scripts-Utiles/master/duplicityscripts/scripts/master-backup.sh

# On les rends exécutables
sudo chmod +x /usr/local/sbin/master-backup*

A partir de ce moment là on dispose de commandes que l’on pourra utiliser :

  • master-backup-verify.sh vous permet de simuler un backup, d’afficher le résultat, sans pour autant l’effectuer, en listant les modifications en cours,
  • master-backup-listing.sh vous permet de lister tous les fichiers inclus dans votre sauvegarde, en fonction de votre configuration (nous y viendrons plus tard),
  • master-backup-status.sh vous permet de voir quel est l’état de votre backup,
  • master-backup-cleanup.sh est la commande à utiliser en cas de crash d’une sauvegarde, pour supprimer les fichiers orphelins et fichiers en erreur,
  • master-backup-restore.sh est la commande à utiliser pour restaurer un ou plusieurs fichier(s) ou dossier(s),
  • master-backup.sh et la commande principale pour réaliser votre backup.

L’intérêt de cette batterie de scripts est de ne pas avoir à entrer manuellement tous les paramètres, car ils vont interroger un fichier de configuration qui contiendra notamment :

  • l’adresse et les paramètres de connexion au répertoire distant de sauvegarde (FTP, SSH, Amazon ou autre),
  • la liste des dossiers à sauvegarder,
  • la liste des dossiers à exclure,
  • etc.

 

Mise en place du fichier de configuration

Je vous propose de récupérer un fichier de configuration à compléter :

wget -O /etc/master-backup.conf --no-check-certificate https://raw.github.com/yvangodard/Scripts-Utiles/master/duplicityscripts/etc/master-backup.conf

Il ne vous reste qu’à modifier ce fichier pour le personnaliser selon votre configuration, notamment les paramètres suivants :

  • EMAIL contient l’adresse email qui recevra le journal de sauvegarde. S’il est vide, aucun mail sera envoyé et le journal de sauvegarde sera envoyé sur la sortie standard. Vous avez également la possibilité de mettre une deuxième adresse destinataire avec le paramètre EMAILADMIN.
  • BASE est le dossier où un dossier tmp sera créé si nécessaire pour les fichiers temporaires de duplicity.
  • CACHE est le dossier qui contiendra le cache de duplicity. Il est conseillé de conserver ce cache dans le dossier BASE mais il peut aussi être défini sur un point de montage dédié.
  • FULLDELAY est le délai maximum avant de refaire un backup complet. Si vous souhaitez refaire un backup complet tous les quinze jours et entretemps des sauvegardes incrémentales, utilisez FULLDELAY=15D.
  • HOWMANYKEEPFULL est le paramètre qui permet de fixer le nombre de backups complets à conserver.
  • PASSPHRASE est le secret utilisé par duplicity pour chiffrer les archives sur l’espace de stockage. Connaître ce secret est indispensable pour restaurer des fichiers. Vous pouvez générer aléatoirement votre passphrase ici http://www.littlelite.net/pwdgen/ en choisissant par exemple 30 caractères.
  • NAME est le nom associé au backup. Si vous configurez plusieurs backups sur votre machine, utilisez des noms différents, pour séparer les caches.
  • WHAT doit contenir les dossiers à exclure et inclure de la sauvegarde. Deux alternatives s’offrent à vous :
    • Soit vous créez quelque part un fichier contenant la liste des dossiers à exclure dans votre sauvegarde (disons par exemple /home/backups/master-backups_exclude.txt) et quelque part un fichier contenant la liste des dossiers à inclure dans votre backup (disons par exemple /home/backups/master-backups_include.txt). Dans ce cas, votre fichier de configuration se terminera ainsi :
      # WHAT doit contenir les exclusions et inclusions pour les sauvegardes
      # Par défaut tout est exclu, donc si aucune inclusion n'est spécifiée, la
      # sauvegarde sera vide. Il vaut mieux indiquer les exclusions spécifiques
      # en premier, puis indiquer les inclusions. Dans ce sens, la première liste
      # d'exclusion peut ne concerner que ce qui est à exclure dans la liste d'inclusion.
      # En général, on va ainsi spécifier dans la liste d'exclusion des sous-dossiers
      # de la liste des inclusions.
      # Exemple: On veut sauvegarder tout /home sauf un dossier /home/mysql utilisé
      # par le service MySQL tout en sachant que des dumps MySQL sont faits dans /home/backups
      # Exclusion: /home/mysql
      # Inclusion: /home
      #
      # Voir "man duplicity" pour les options possibles
      unset WHAT
      WHAT="$WHAT --exclude-filelist /home/backups/master-backups_exclude.txt"
      WHAT="$WHAT --include-filelist /home/backups/master-backups_include.txt"
    • Soit vous entrez dans les lignes concernées, directement dans le fichier de configuration, la liste des inclusions et exclusions, comme par exemple :
      unset WHAT
      # Ajout liste des exclusions
      # Entrez dans la ligne qui suit à liste des dossiers à ne pas sauvegarder
      for d in /home/mysql $BASE /var/cache /var/lock /var/run /var/tmp /var/spool/postfix '/root/VirtualBox*'
      do
      	WHAT="$WHAT --exclude $d"
      done
      # Ajout liste des inclusions
      # Ajoutez ici la liste des dossiers à inclure dans la sauvegarde
      for d in /home /var /etc /root /usr /bin /sbin /boot /lib /lib32 /lib64
      do
      	WHAT="$WHAT --include $d"
      done
  • OPTIONS vous permet d’ajouter l’appel de paramètres de la commande de duplicity. Par exemple ajoutez une ligne OPTIONS="-v info" pour changer le niveau de verbosité.

Vous pouvez éditez ce fichier avec nano /etc/master-backup.conf et le modifier à votre guise.

Si vous utilisez plusieurs destinations de sauvegarde, créez un deuxième fichier de configuration, en veillant à ce que son nom commence par master-backup pour être correctement interprété. Notez que vous pouvez dans ce cas n’entrer dans ce deuxième fichier de configuration que les valeurs des paramètres à changer car nos scripts veilleront à charger par défaut les valeurs contenues dans /etc/master-backup.conf.

 

Utilisation

Pour lancer une sauvegarde incrémentale immédiate en ligne de commande avant une intervention importante, utilisez la commande :
master-backup.sh --no-email --incremental

Pour restaurer un dossier ou un fichier, utilisez la commande :
master-backup-restore.sh [-f] [-t x[s|m|h|D]] chemin_vers_fichier_ou_dossier [chemin_à_restaurer]
Options :
-f : pour forcer la restauration si la cible existe
-t [délai] : pour restaurer la version dispo au délai spécifié (ex.: 1h pour une heure, 3D pour 3 jours)
Par défaut, la restauration se fait en place mais on peut indiquer un nouveau chemin pour la restauration.

Par exemple master-backup-restore.sh -f -t 2D /etc/master-backup.conf /etc/master-backup.conf.old va forcer la restauration du fichier /etc/master-backup.conf d’il y a deux jours sous le nouveau nom /etc/master-backup.conf.old.

 

Programmez vos tâches de restauration dans votre crontab

Pour éditer votre crontab, utiliser crontab -e.

Quelques exemples de tâches cron pour réaliser vos backups, à adapter selon vos besoins :

# backup quotidien principal chaque jour à 01h15
15 1 * * * /usr/local/sbin/master-backup.sh --report-status   #backup duplicity FTP Quotidien

# backup secondaire en forçant l'appel du fichier de config /etc/master-backup-2.conf
# Dans /etc/master-backup-2.conf FULLDELAY=1D, pour gérer dans la crontab manuellement l'alternance Full / Incrémental
# On force un backup full chaque samedi à 01h15
15 1 * * 6 /usr/local/sbin/master-backup.sh --conf  /etc/master-backup-2.conf #backup Secondaire (Full / Hebdo)
# On force un backup incrémental chaque jour sauf le samedi à 01h30
30 1 * * 0-5 /usr/local/sbin/master-backup.sh --conf  /etc/master-backup-2.conf --incremental #backup secondaire (Incrémental / Quotidien)

 

  • JustAReader

    Salut !

    Merci pour ces scripts qui m’ont été très utiles !

    J’ai trouvé ici certaines exclusions qu’il serait peut-être bon d’ajouter à ton script :
    http://forum.kimsufi.com/showthread.php?9265-Sauvegarde-quot-complete-quot-serveur&p=76613&viewfull=1#post76613

    Il y a aussi une partie intéressante qui crée la liste des paquets et sauvegarde cette liste au lieu de sauvegarder les paquets. Peut-être une chose intéressante à ajouter à ton script aussi ?

    J’ai aussi cherché s’il y avait moyen de faire une sauvegarde complète pour faire du Bare Metal Recovery sur un serveur distant mais je n’ai rien trouvé. La chose qui s’en approche le plus est LVM + snapshot mais cela a l’air compliqué à mettre en place. Malheureusement des choses comme Clonezilla ne fonctionne que si l’on a un accès physique au serveur.

    Merci encore !

#JeSuisCharlie