Automatiser la sauvegarde de vos sites web d’un serveur sur un autre

Le but de ce tutoriel est de décrire l’automatisation de la sauvegarde des données d’un serveur web (fichiers présents sur le serveur et contenu de bases de données MySQL) sur un autre. Le serveur contenant les données à sauvegarder dispose d’un accès sFTP par login/mot de passe et le serveur de stockage dispose d’un accès sFTP par clé publique/privée (accès qui n’est pas utilisé dans le tutoriel). Les deux serveurs seront appelés respectivement :

  • padawan pour le serveur contenant les données à sauvegarder (Debian, hébergement OVH mutualisé)
  • master pour le serveur de stockage (Ubuntu Server, 14.04 LTS)

Sauvegarde des fichiers du serveur padawan

Les données sont sauvegardées en utilisant une tâche CRON hebdomadaire sur master qui invoque le programme rsync pour synchroniser le répertoire distant à sauvegarder sur padawan avec un répertoire local sur master ; dans la suite, ces deux répertoires seront notés saveme. Pour autoriser rsync à utiliser la connexion par login/mot de passe de manière non interactive, il faut installer le package Ubuntu suivant sur master :

sudo apt-get install sshpass

La tâche CRON est ensuite créée en utilisant la commande

sudo crontab -e

puis en insérant en fin de fichier la ligne suivante :

30 01 * * 3 rsync -ratlz --rsh="/usr/bin/sshpass -p PWD ssh -o StrictHostKeyChecking=no -l LOGIN" padawan.fr:saveme/  /home/saveme/

qui permet de synchroniser automatiquement :

  • tous les troisièmes jours de la semaine (3)
  • à 1h30 (30 01)
  • les données trouvées sur le serveur padawan.fr qui se trouve dans le fichier saveme à la racine du répertoire utilisateur
  • pour l’utilisateur LOGIN et le mot de passe PWD
  • dans le répertoire /home/saveme/ du serveur master

Sauvegarde des bases de données

Les bases de données sont copiées dans un fichier SQL dans un dossier situé dans le répertoire saveme de padawan (et donc ainsi, elles mêmes copiées toutes les semaines sur master. Cette opération est effectuée à l’aide d’un script PHP présent sur padawan et automatisé par une tâche CRON sur ce même serveur via l’utilitaire de OVH. Le script PHP qui assure la sauvegarde est :

function sauve($host, $user, $pass) {
  system(sprintf(
    'mysqldump --no-tablespace --opt -h%s -u%s -p"%s" %s | gzip > %s/'.$host.'.sql.gz',
    $host,
    $user,
    $pass,
    $user,
    getenv('DOCUMENT_ROOT')
  ));
  echo '+DONE'.$host;
}
 
sauve("SERVEUR", "USER", "PASS");

dans laquelle le serveur SQL est “SERVEUR”, le nom d’utilisateur et la base de données à sauvegarder sont “USER” et le mot de passe de connexion est “PASS” (le script est aisément modifiable pour prendre en compte le cas où le nom d’utilisateur et le nom de la base de données diffèrent). La tâche CRON est ensuite configurée via l’interface manager de OVH : dans le menu Plateformes/CRON, cliquer sur “Ajouter une planification” (à droite). La commande à exécuter est le chemin vers le script PHP précédent, le langage est PHP (n’importe quelle version). L’écran suivant définit la périodicité de la tâche (par exemple, tous les jours, heures fixes à 23h) comme dans l’exemple ci-dessous : cron_ovh