Sauvegarder les données d'un site web personnel: Bonjour BackupMonitor !

Dans le billet précédent j'expliquais pourquoi BackupMonitor est devenu désuet sur mon bureau Ubuntu où DejaDup résout déjà le problème des sauvegardes. Cependant il restait un type de sauvegarde auquel je ne m'étais pas intéressé: la sauvegarde de données présentes sur un serveur distant (typiquement celles d'un site web). Vous me direz que ce genre de sauvegarde peut certainement être pris en charge (moyennant quelques frais supplémentaires) par mon hébergeur internet, et ce serait en fait tout à fait exact ! Cependant, j'aime bien l'idée d'avoir mes données "à la maison", et s'arranger pour que ce soit le cas n’exclue pas bien évidemment de faire des sauvegarde via d'autre système (plus il y en a, mieux c'est). Je vais donc expliquer rapidement comment j'ai configuré une sauvegarde automatique de ce type. L'idée de départ c'est donc de jeter à la poubelle tout ce qui est au cœur de BackupMonitor et de ne conserver que les fonctionnalités triviales suivantes:
  • rappel régulier par notification de la nécessité d'une sauvegarde
  • rajout simple de nouveau scripts
  • une GUI simpliste qui permet de lancer la sauvegarde via un gros bouton et d'avoir des retours sur les succès ou les erreurs du processus
Le script qui doit être rajouté comme une étape personnalisée de sauvegarde peut en fait rester très simple comme celui présenté plus bas, et qui permet de copier des fichiers depuis un serveur distant vers le répertoire conventionnel de sauvegarde définit par BackupMonitor.
#!/bin/bash

# Backup data from a remote server
# where backups are stored 
# in a directory indicated 
# by $HOME/backups/Latest
#
# WARNING: requires that you set a 
# ssh key allowing to access your remote
# server without a password !
#
# Author: Thibauld Nion
# License: Public Domain

# A name that will identify the data once backed up
BKP_NAME=example.com

# Server access configuration
USERNAME=myusername
SERVER_NETLOC=server.example.com

# Direcotry where stuff will be downloaded
BACKUP_DOWNLOAD_DIR=$BACKUP_MONITOR_DESTINATION_FOLDER/$BKP_NAME

if [ -d  $BACKUP_DOWNLOAD_DIR ]
then
echo "Removing previously created download directory $BACKUP_DOWNLOAD_DIR"
rm -r $BACKUP_DOWNLOAD_DIR
fi

echo "Preparing to download remote backup from $SERVER_NETLOC to $BACKUP_DOWNLOAD_DIR"
scp -rq $USERNAME@$SERVER_NETLOC:/home/$USERNAME/backups/Latest $BACKUP_DOWNLOAD_DIR
echo "Download finished"
Ce script est assez simple mais a, pour cela, deux pré-requis:
  1. qu'une clé ssh (et éventuellement un ssh-agent) soit utilisée pour accéder au serveur du site web de telle sorte que l'utilisateur n'ait pas à entrer de mot de passe.
  2. que, du côté serveur, un script fasse régulièrement une sauvegarde des fichiers régulier et du contenu des base de données, dans un dossier appelé $HOME/backups/Latest
En ce qui me concerne, pour répondre au deuxième pré-requis, j'ai adapté un script de DockStreet media qui permet facilement de faire une sauvegarde d'une base mysql et du dossier correspondant au site web tel qu'il est définit par l'hébergeur Dreamhost. Un "template" de mon script "adapté" est présenté ci-dessous et mes principales modifications sont les suivantes:
  • gérer plusieurs dossiers
  • gérer plusieurs base de données
  • créer et mettre à jour le lien symbolique "$HOME/backups/Latest" pointant vers le dernier dossier de backup
#!/bin/bash

# Site backup
# Adapted from http://www.dockstreetmedia.com/2011/03/automatic-site-backups-using-cron-jobs-in-dreamhost/

# specific config variables (EDIT THESE)
#
# Space separated list of the names of folders 
# below your home directory, that you want to backup
DIRNAMES="topFolderA topFolderB topFolderC"
# host for your site's database(s)
DBHOST=mysql.example.com
# user name for this mysql server
DBUSER=myusername
# corresponding password (the same you gave 
# to the applications powering your site (like wordpress etc)
DBPASS=xxx
# Space separated list of the names of dbs 
# within DBHOST that you want to backup
DBNAMES="sitedb_one sitedb_two sitedb_three"

# other config variables(DO NOT EDIT THESE)
NOWDATE=$(date +"%y%m%d")
NOWDAY=$(date +"%d")
BACKUPDIR=backups
MYSQLDUMP="$(which mysqldump)"
LOGFILE=$HOME/$BACKUPDIR/log.txt

TARGETPATH=$HOME/$BACKUPDIR/$NOWDAY
LINK_TO_LATEST=$HOME/$BACKUPDIR/Latest

# check to see if target path exists – if so, delete the old one and create a new one, otherwise just create it
if [ -d $TARGETPATH ]
then
# print a message for the logfile / output email
echo "$NOWDATE - Removing previous backup $TARGETPATH" | tee -a $LOGFILE
rm -r $TARGETPATH
mkdir -p $TARGETPATH
else
mkdir -p $TARGETPATH
fi

for SITEDIR in $DIRNAMES
do

# create a GZIP of the directory inside the target path
tar -zcf $TARGETPATH/${SITEDIR}_$NOWDATE.tar.gz $HOME/$SITEDIR
# print a message for the logfile / output email
echo "$NOWDATE - $SITEDIR has been backed up" | tee -a $LOGFILE

done

for DBNAME in $DBNAMES
do
# dump the data into a SQL file inside the target path
$MYSQLDUMP -u $DBUSER -h $DBHOST -p$DBPASS $DBNAME | gzip > $TARGETPATH/${DBNAME}_$NOWDATE.sql.gz
# print a message for the logfile / output email
echo "$NOWDATE - $DBNAME has been backed up" | tee -a $LOGFILE
done

# Put a link to the latest backup
if [ -e $LINK_TO_LATEST ]
then
rm $LINK_TO_LATEST
fi

ln -s $TARGETPATH $LINK_TO_LATEST
Le paquet suivant backup_monitor_servers.tar.gz regroupe les deux scripts ainsi que le fichier de configuration spécifique de BackupMonitor qu'il faut copier dans ~/.config/backup-monitor/. Bien sûr je pourrais aussi bien utiliser BackupMonitor pour faite l'ensemble de toutes les sauvegardes (sauvegarde du site web et sauvegarde locale). Ce serait plus élégant et ça m'éviterait de gérer deux outils différents pour faire des choses aussi proches. Cependant, j'espère surtout qu'un nouvel outil pratique apparaîtra (ou peut-être tout simplement de nouvelles fonctionnalités de DejaDup) qui m'aidera à faire toutes ces sauvegardes et me permettra d'arrêter de maintenir les petits bouts de code qui constituent BackupMonitor. En attendant, je devrais pouvoir utiliser la même astuce (mais avec des scripts différents) pour faire la sauvegarde d'autres données personnelles distantes, telles que celles des réseaux sociaux (Delicious, Google, Facebook, LastFM etc).