Sauvegarder un site et sa base sql via un script shell

11 février 2016 Sauvegarde 0 Commentaire

Comment sauvegarder un site et sa base sql ? Qui ne s’est jamais posé la question, moi la première fois que j’en ai ouvert un et je me suis rapidement rendu compte que j’aurais du (j’étais beaucoup plus jeune donc cela peut peut être se comprendre).

Quand l’hébergeur a fermé sans préavis (si si ça arrive) j’étais un peu dégoutté mais dans un sens j’étais aussi coupable que lui était honnête. Même si depuis je choisis un peu plus consciencieusement mon hébergeur, il reste très important de pouvoir sauvegarder un site et sa base sql parce que :

  • vous êtes partis en vacances et vous avez oublié de payer votre facture résultat votre serveur a été fermé et remis sur le marché (presque arrivé)
  • le disque de votre serveur a rendu l`âme
  • vous avez fait des modifications et planté votre site

Si votre site est basé sur un CMS vous devriez pouvoir trouver votre bonheur via un plugin, cependant si comme moi votre site est hébergé sur un vps / serveur dédié (aussi possible si votre hébergeur met à votre disposition un accès ssh) je préfère utiliser un petit script qui tourne quotidiennement via cron.

 

 

L’environnement

Avant de directement partir sur le détails du script et de son exécution je partirai du principe que :

  • vous avez un accès SSH à vos données
  • vos données sont stockées dans /var/www/www.example.com
  • le répertoire (interne) de destination de votre sauvegarde est /home/user/backups
  • le script sera stockés dans /home/user/scripts

Commençons par créer les répertoires détaillés ci-dessus

mkdir ~/scripts
mkdir ~/backups

 

Créons le fichier qui contient le script et rendons le exécutable

touch backup.script
chmod +x backup.script

 

 

Définition des variables

Nous allons commencer par définir les variables de base servant à l’exécution du script :

  • la variable NOW qui donnera un timestamp à notre fichier de sauvegarde
  • la variable FILE qui attribue un nom pour notre fichier de sauvegarde
  • la variable BACKUP_DIR qui définit le répertoire local de sauvegarde
  • la variable WWW_DIR qui indique où se trouvent les fichiers à sauvegarder
  • les variables DB_USER, DB_PASS, DB_NAME qui permettent de se connecter à mysql
  • la variable DB_FILE qui attribue un nom à la sauvegarde mysql
  • les variables WWW_TRANSFORM et DB_TRANSFORM permettent de rendre la navigation plus facile dans l’archive contenant la sauvegarde

Ouvrez le fichier backup.script et collez le texte suivant

#!/bin/bash
NOW=$(date +"%Y-%m-%d-%H%M")
FILE="example.org.$NOW.tar"
BACKUP_DIR="/home/user/backups"
WWW_DIR="/var/www/www.example.org/"

DB_USER="mysqluser"
DB_PASS="mysqlpass"
DB_NAME="example_org"
DB_FILE="example.org.$NOW.sql"

WWW_TRANSFORM='s,^www/example.org,www,'
DB_TRANSFORM='s,^home/username/backups,database,'

 

 

Sauvegarde du site et de la bdd

Le script à proprement parlé commence ici, ce sont cinq lignes de commande qui pourraient être lancé dans un terminal. Elles vont contenir les variables prédéfinies précédemment cela pour plus de lisibilité mais surtout pour modifier plus facilement le script.

La première commande, tar, va nous permettre de créer une archive nommée example.org.année.mois.jour.heure contenant un dossier www ou seront présents les données contenues dans le répertoire /var/www/www.example.org.

La seconde commande, mysqdump, va nous permettre de nous connecter à la base de donnée et de créer une copie de la base example_org nommée example.org.année.mois.jour.heure.sql dans le répertoire /home/user/backups.

La troisième commande , tar, va nous permettre de copier le fichier example.org.année.mois.jour.heure.sql, localisé dans /home/root/backups/, dans l’archive crée précédemment dans un répertoire database,

La quatrième commande, rm, va effacer le fichier example.org.année.mois.jour.heure.sql 

La cinquième commande et dernière commande, gzip, va simplement compresser notre archive.

Ci dessous les 5 lignes de commande à ajouter à votre fichier

tar -cvf $BACKUP_DIR/$FILE --transform $WWW_TRANSFORM $WWW_DIR
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/$DB_FILE
tar --append --file=$BACKUP_DIR/$FILE --transform $DB_TRANSFORM $BACKUP_DIR/$DB_FILE
rm $BACKUP_DIR/$DB_FILE
gzip -9 $BACKUP_DIR/$FILE

 

 

Automatiser l’exécution de la sauvegarde

Je vous conseille très fortement d’automatiser le lancement de la sauvegarde sinon vous risquez d’oublier de le faire et lorsque vous aurez besoin de votre sauvegarde vous vous risquez d’être déçu.

Nous allons donc configurer ajouter un fichier de configuration a Cron afin que la sauvegarde s’effectue quotidiennement.

Créons le fichier du script et rendons le exécutable (modifiez example_org par ce que vous voulez)

sudo touch /etc/cron.daily/example.org.backup
sudo chmod +x example.org.backup

 

Maintenant ouvrez ce fichier et ajoutez-y les lignes suivantes

#!/bin/bash
/home/user/scripts/backup.script

 

 

Nettoyez vos sauvegardes

Puisque vous avez planifier une sauvegarde quotidienne vous pouvez sereinement ajouter au script de sauvegarde (/home/user/scripts/backup.script) une commande permettant de supprimer les sauvegardes datant de plus de XX jours.

#Supprimer les sauvegardes de plus de 10 jours
find $BACKUP_DIR -type f -mtime +10 -exec rm {} \;

 

 

Téléchargez vos sauvegardes

Maintenant que vos fichiers sont sauvegardés encore faut-il les télécharger

 

Sous Mac et Linux

Mac et Linux intègrent nativement rsync il vous suffit donc de lancer la commande suivante

rsync example.org:/home/username/backups/* .

 

Sous Windows :

rsync n’est pas disponible nativement sous windows. Certains logiciels intègrent cette fonction, vous trouverez une liste ici

 

Source

Konstantin Kovshenin, theme.fm, A shell script for a complete wordpress backup