C’est un peu une évidence rabâchée à longueur d’Internet mais les backups, c’est bien. Au delà des risques physiques encourus par votre serveur (incendie, inondation, malveillance, Martiens…), il est toujours bon pour le coeur d’avoir des backups en cas d’erreur de manipulation…

Je fonds, je foooonds !
Dans cet article nous allons voir comment sauvegarder de manière simple les fichiers importants et les bases MySQL d’un serveur Ubuntu (ou plus généralement d’un serveur Linux quelconque).
Fichiers
Pour sauvegarder les fichiers nous allons utiliser Duplicity un outil qui va non seulement s’occuper de la sauvegarde proprement dite mais également gérer le cryptage et les sauvegardes incrémentales. Les fichiers peuvent aussi être uploadés sur un autre serveur en FTP, SCP, SSH, Amazon S3, etc.
Pour installer Duplicity sur un serveur Ubuntu, entrez la commande suivante :
$sudo apt-get install duplicity
Une fois l’installation terminée il faut créer un script contenant l’ensemble des commandes à effectuer. Par exemple vous pourriez indiquer les commandes suivantes :
export PASSPHRASE=MOT_DE_PASSE
duplicity –full-if-older-than 1M /etc file:///home/nom_utilisateur/backups/duplicity/etc
duplicity –full-if-older-than 1M /var/lib/mediawiki file:///home/nom_utilisateur/backups/duplicity/var/lib/mediawiki
duplicity –full-if-older-than 1M /var/www file:///home/nom_utilisateur/backups/duplicity/var/www
duplicity –full-if-older-than 1M –exclude /home/nom_utilisateur/backups /home file:///home/nom_utilisateur/backups/duplicity/home
duplicity remove-all-but-n-full 3 file:///home/nom_utilisateur/backups/duplicity/etc
duplicity remove-all-but-n-full 3 file:///home/nom_utilisateur/backups/duplicity/var/lib/mediawiki
duplicity remove-all-but-n-full 3 file:///home/nom_utilisateur/backups/duplicity/var/www
duplicity remove-all-but-n-full 3 file:///home/nom_utilisateur/backups/duplicity/home
unset PASSPHRASE
La première ligne défini le mot de passe qui vous sera demandé lorsque vous souhaiterez accéder au fichier de backup.
La ligne suivante demande de lancer un backup du répertoire /etc et de le stocker dans le répertoire /home/nom_utilisateur/backups/duplicity/etc. Notez bien le triple / après file: qui indique qu’il s’agit d’un répertoire ou d’un fichier local et non pas d’un serveur FTP, SSH ou autre. L’option –full-if-older-than 1M indique à Duplicity qu’il devra faire un backup incrémental sauf si le dernier backup complet date de plus d’un mois, auquel cas il relancera un backup complet.
Si vous souhaitez sauvegarder vos données directement sur un serveur distant vous pouvez ajouter une ligne export FTP_PASSWORD = MOT_DE_PASSE_FTP et remplacer l’expression file:/// par ftp://utilisateur_ftp@IP_serveur_distant/répertoire_backup. Ajoutez également à la fin une ligne unset FTP_PASSWORD.
Les deux lignes suivantes exécutent un backup des fichiers de MediaWiki installé dans /var/lib/mediawiki et un backup du répertoire /var/www.
La dernière ligne effectue un backup du répertoire /home en excluant le répertoire /home/nom_utilisateur/backups.
Les quatre commandes suivantes suppriment les backups de plus de trois mois.
La dernière ligne vide la variable PASSPHRASE avant que le script ne s’achève.
Vérifiez bien que votre script, par exemple duplicity.sh dans votre répertoire /home/nom_utilisateur, a bien les droits d’exécution ou donnez-les lui :
$sudo chmod 700 duplicity.sh
Il ne reste plus qu’à programmer l’exécution de ce script à la fréquence que vous préférez. Dans mon cas le backup se fera tous les jours à 22h30 :
$sudo crontab -e
J’ai ajouté au cron la ligne suivante :
30 22 * * * /home/nom_utilisateur/duplicity.sh
Duplicity crée une série de fichiers GPG cryptés par votre PASSPHRASE. Les fichiers de backups proprement dits sont de la forme :
duplicity-full.20100712T223000Z.vol1.difftar.gpg
duplicity-inc.20100712T223000Z.to.20100713T223000Z.vol1.difftar.gpg
duplicity-inc.20100713T223000Z.to.20100714T223000Z.vol1.difftar.gpg
…
On reconnaît le backup complet (full) et les backups incrémentaux qui suivent (inc) ainsi que les dates associées.
Pour afficher la liste des fichiers sauvegardés vous pouvez créer un script list.sh contenant les lignes suivantes :
export PASSPHRASE=MOT_DE_PASSE
duplicity list-current-files file:///home_nom_utilisateur/backups/duplicity/var/lib/mediawiki
unset PASSPHRASE
Ce fichier listera les fichiers dans la sauvegarde de /var/lib/mediawiki exécutée précédemment.
Pour restaurer l’ensemble de /var/lib/mediawiki dans un répertoire temporaire /home/nom_utilisateur/restore, vous pouvez lancer la commande suivante :
$sudo duplicity file:///home_nom_utilisateur/backups/duplicity/var/lib/mediawiki /home/nom_utilisateur/restore
et taper le mot de passe du fichier de sauvegarde.
Pour restaurer un fichier en particulier, par exemple le fichier /var/lib/mediawiki/extensions/geshi.php :
$sudo duplicity --file-to-restore extensions/geshi.php file:///home/nom_utilisateur/backups/duplicity/var/lib/mediawiki/ /home_nom_utilisateur/restore/geshi.php
De la même manière vous pouvez restaurer le fichier geshi.php d’il y a 5 jours :
$sudo duplicity -t5D --file-to-restore extensions/geshi.php file:///home/nom_utilisateur/backups/duplicity/var/lib/mediawiki/ /home/nom_utilisateur/restore/geshi.php
MySQL
Pour réaliser nos sauvegardes de bases MySQL nous allons utiliser le script AutoMySQLBackup. Ce script se chargera de faire des sauvegardes quotidiennes, hebdomadaires et mensuelles dans des répertoires /daily, /weekly, /monthly et se chargera de faire la rotation entre ces différents répertoires. Le script peut sauvegarder plusieurs bases, les compresser, envoyer des logs par email, etc.
Placez ce script dans votre répertoire /home par exemple et donnez lui les droits d’exécution :
$sudo chmod 700 automysqlbackup.sh
Editez ensuite le fichier :
$sudo nano automysqlbackup.sh
et modifiez les lignes USERNAME et PASSWORD pour y indiquer un nom d’utilisateur et un mot de passe ayant le droit d’accéder à vos bases. Si votre serveur MySQL est installé en local, laissez DBHOST à localhost, dans le cas contraire indiquez l’adresse IP du serveur MySQL distant.
Modifiez ensuite la variable DBNAMES pour y indiquer le nom des bases que vous voulez sauvegarder en les séparant par des espaces.
Indiquez ensuite pour la variable BACKUPDIR l’emplacement où vous souhaitez enregistrer vos sauvegardes, par exemple /home/nom_utilisateur/backups. C’est dans ce répertoire que le script créera ses propres répertoires.
Si vous souhaitez recevoir un mail en cas d’erreur, donnez la valeur quiet à la variable MAILCONTENT et indiquez votre adresse email pour MAILADDR.
Il ne reste plus qu’à programmer l’exécution de ce script :
$sudo crontab -e
Ajoutez la ligne suivante pour une exécution quotidienne à 23h00 :
0 23 * * * /home/nom_utilisateur/automysqlbackup.sh
Le script créera des répertoires indépendants pour chacune de vos bases dans les répertoires /daily, /weekly et /monthly et enregistrera dedans chaque sauvegarde dans un classique format d’export MySQL, compressé en .gz. Par exemple on trouvera dans le répertoire /daily/mediawiki :
mediawiki_2010-07-23_23h00m.Friday.sql.gz
mediawiki_2010-07-25_23h00m.Sunday.sql.gz
mediawiki_2010-07-26_23h00m.Monday.sql.gz
mediawiki_2010-07-27_23h00m.Tuesday.sql.gz
mediawiki_2010-07-28_23h00m.Wednesday.sql.gz
mediawiki_2010-07-29_23h00m.Thursday.sql.gz
Au bout d’une semaine le plus ancien backup sera déplacé dans le répertoire /weekly/mediawiki :
mediawiki_week.28.2010-07-17_23h00m.sql.gz
mediawiki_week.29.2010-07-24_23h00m.sql.gz
La même chose se fera au bout d’un mois pour le répertoire /monthly/mediawiki :
mediawiki_2010-07-01_23h00m.July.mediawiki.sql.gz