De plus en plus de gens hébergent leur blog ou autre site Web dynamique chez un fournisseur d’accès comme OVH, qui offre des bases de données MySQL et un espace relativement grand pour un prix assez petit.

Malheureusement, ces “forfaits” ne prennent pas toujours en compte la sauvegarde de vos données. Et lorsque ça n’est pas le cas, on peut toujours se dire : “-Oh, c’est pas n’importe qui quand même… c’est un fournisseur d’accès ! il sait ce qu’il fait ! il y a peu de risque qu’il perde mes données.”

L’histoire montre que même Google peut perdre des données utilisateurs, sans possibilité de les récupérer. C’est justement arrivé chez OVH il y a quelques mois.

Il est donc important de penser à sauvegarder vous-même vos données. Le but de cet article est d’expliquer comment mettre en place une sauvegarde automatisée d’un site et de sa base de données.

Tout d’abord, il faut disposer d’un PC personnel et d’une heure à laquelle on sait qu’il est toujours allumé (sans quoi on loupe une journée de sauvegarde, ce qui n’est pas forcément trop grave).

La plupart des FAI qui offrent une base MySQL et un espace multi-site sont en général accessibles par SSH, c’est donc par ce moyen que nous allons sauvegarder nos données.

Génération de la paire de clés SSH

Afin de permettre la communication automatique entre le client (le PC personnel) et le serveur (le FAI) il faut générer une paire de clés afin de ne pas avoir de mot de passe à taper.

Pour se faire, sur le client, choisissez votre utilisateur. Cela peut être votre utilisateur courant, root (à éviter), ou un utilisateur dédié à cela.

En tant que cet utilisateur, dans une console, tapez :

$ ssh-keygen -t rsa

Lorsque le mot de passe vous est demandé, laissez le vide (comme c’est un script qui se connectera, il ne faut pas de mot de passe). Puis lorsque le programme vous propose d’enregistrer la clé, laissez la valeur par défaut (~/.ssh/id_rsa).

Une fois la commande terminée, vous devez avoir un fichier qui ressemble à ça :

$ more ~/.ssh/id_rsa.pub
ssh-rsa ADFSFS2DFSFDF212AAABIwAAAQEfldkjgdlkjgrileg,LKLKFDLKFslkfdMLFKLFMSlffldmLkfdfs65321dfsdfskljLKFJLSjflk,vkldfrgOBZJFzQrXDV2U1W8ERslDbitJihMT72DV5NjVY23DFf
7JBpJRyzdTkYRxf/YsdfsdfsfsdfskdnfsueoiJFKEJFOKJFOkejfoefjOFjfokeOFKqkfoKfokndfoKFNOdkfsoDFPsokneuigjipOIJFJFNdssds6542d1fsLKJfnsldskdknsqch8osSThNXT8FDSFds654FDS
h8VoqmnmslkfsmF6542iesfsdeEFefsffsEEFfrof/T== monuser@monpc

Il ne reste plus qu’a vous connecter sur le serveur et a éditer le fichier ~/.ssh/authorized_keys pour y ajouter le contenu cité au dessus.

Normalement, une fois cette opération effectuée, le serveur ne demande plus de mot de passe au client pour se connecter.

Création des scripts de sauvegarde

j’ai écrit deux scripts. Un pour sauvegarder la base MySQL, et un pour sauvegarder le contenu physique du site.

Le script qui sauvegarde le contenu du site est le suivant :

#!/bin/csh -f
set DIREXPORT=/PATH/TO/MY/BACKUP #entrez ici le chemin ou sauvegarder sur le client
set SITE=/home.10.10/toto/www.toto.fr #entrez ici le résultat de la commande pwd dans le répertoire du site sur le serveur
set SITENAME=www.toto.fr # le nom du répertoire du site
set DATE=`date '+%u'`

scp -r matao@matao.fr:$SITE $DIREXPORT/
tar cvzf $SITENAME.$DATE.tgz $DIREXPORT/$SITENAME
mv $SITENAME.$DATE.tgz $DIREXPORT/
sleep 10
rm -rf $DIREXPORT/$SITENAME

Le script de sauvegarde de la base de données MySQL est le suivant :

#!/bin/csh -f
set DIREXPORTMYSQL=/PATH/TO/MY/BACKUP #entrez ici le chemin ou sauvegarder sur le client
set PRIVATE=/home.10.10/toto/private #entrez ici le chemin d'un répertoire temporaire sur le serveur
set MYSQLHOST="sql.host" # le serveur de base de données
set MYSQLDB="mabase" # la base de données
set MYSQLUSER="turlu" # l'utilisateur
set MYSQLPASSWD="tutu" # le mot de passe
set DATE=`date '+%u'`

ssh matao@matao.fr "mysqldump -h $MYSQLHOST --user=$MYSQLUSER --password=$MYSQLPASSWD $MYSQLDB | /bin/gzip -f -9 >$PRIVATE/$MYSQLDB.sql.$DATE.gz"
      sleep 10
scp matao@matao.fr:$PRIVATE/$MYSQLDB.sql.$DATE $DIREXPORTMYSQL/$MYSQLDB.sql.$DATE
ssh matao@matao.fr "rm -f $PRIVATE/$MYSQLDB.sql.$DATE"

Une fois ces deux scripts adaptés à vos besoins, vous aurez deux scripts permettant de sauvegarder la totalité des fichier de votre site Web dynamique.

Ce système permet de conserver une sauvegarde journalière pendant une semaine. Si vous souhaitez conserver des sauvegardes pendant plus longtemps, il faut modifier la ligne set DATE=`date '+%u'`

pour une sauvegarde journalière sur un mois : set DATE=`date '+%d'`

pour une sauvegarde journalière sur un an : set DATE=`date '+%j'`

pour une sauvegarde hebdomadaire sur un an : set DATE=`date '+%v'`

pour une sauvegarde journalière à durée illimitée : set DATE=`date '+%F'`

pour avoir plus d’informations date --help

Automatisation de la sauvegarde

pour automatiser la sauvegarde, il suffit d’éditer la crontab de l’utilisateur sur le client et d’y insérer l’exécution des deux scripts à l’heure de votre choix :

crontab -e

et d’ajouter :

15 2 * * * /PATH/TO/scriptMysql > /dev/null 2>&1
30 2 * * * /PATH/TO/Scripmonsite > /dev/null 2>&1

Dans cet exemple, le premier script sera exécuté toutes les nuits à 2h15, et le deuxième à 2h30.

N’oubliez pas que l’ordinateur client doit être démarré à ces heures afin que la sauvegarde est lieu. Il importe donc de trouver une heure à laquelle vous êtes sûr que votre PC est allumé.

Bonne sauvegarde à tous