Sauvegardez votre site web à l’aide d’un script

Bouée de sauvetage

Vous vous demandez quel est le rapport entre l’image et le titre de cet article ? C’est évident, faire des sauvegardes régulières de votre site internet vous sauvera la vie un jour ou l’autre ! Et oui, en cas de problème (piratage, erreur de manipulation, défaillance technique… les risques sont nombreux), ces sauvegardes vous permettront de ne pas perdre l’ensemble de votre site et de rétablir un fonctionnement normal de ce dernier le plus rapidement possible. Quand j’ai créé ce site, j’ai cherché des solutions à cette problématique. J’avais plusieurs contraintes : je voulais que les fichiers et la base de données MySQL du site soient sauvegardés toutes les nuits, que les sauvegardes soient stockées sur un de mes disque dur et que je sois averti du succès ou de l’échec de la sauvegarde. Comme j’avais un Raspberry Pi allumé 24h/24, j’ai créé un script bash qui répond à ces problématiques. Je vous explique comment le mettre en place.

Prérequis

Le script a été conçu pour être exécuté sur un environnement Linux mais vous pourrez sans aucun doute l’utiliser sous Windows grâce au sous-système Linux inclu dans Windows 10 (Korben vous explique comment l’installer : Installer le shell Bash sous Windows 10) ou à des outils comme Cygwin.

Connexion SSH

Pour commencer, vous devez avoir un accès SSH à votre hébergement. Renseignez-vous auprès de votre hébergeur pour savoir s’il vous met à disposition ce type d’accès et pour récupérer vos informations de connexion. Une fois que vous aurez obtenu vos identifiants, utilisez-les pour vous connecter en SSH depuis la machine qui exécutera le script :

ssh user@fournisseur.com

Un message vous demande de valider que la machine contactée est bien celle que vous souhaitiez :

The authenticity of host 'u83842913.1and1-data.host (212.227.247.171)' can't be established.
ECDSA key fingerprint is 78:e7:07:a3:7d:80:e5:63:c7:87:48:f5:0b:c9:be:69.
Are you sure you want to continue connecting (yes/no)?

Validez en tapant « yes » puis entrer.

Vérification de mysqldump

L’utilitaire mysqldump va vous permettre de sauvegarder la base de données MySQL de votre site, nous allons vérifier qu’il est installé sur le serveur de votre hébergeur :

mysqldump --version

La version de l’utilitaire devrait s’afficher :

mysqldump  Ver 10.13 Distrib 5.5.54, for debian-linux-gnu (x86_64)

En revanche, si vous avez ce message :

-bash: mysqldump: command not found

C’est que l’utilitaire n’est pas installé. Vous ne pouvez malheureusement pas utiliser mon script. Désolé !

Récupération du chemin absolu

Nous allons avoir besoin du chemin absolu du répertoire qui contient les fichiers de votre site sur le serveur de votre hébergeur. Naviguez dans ce dernier à l’aide de la commande cd. Vous devriez retrouver la même arborescence que sur votre FTP, vous pouvez utiliser la commande ls pour vous y retrouver :

(uiserver):user:~$ ls
logs  monsite

(uiserver):user:~$ cd monsite

Une fois que vous êtes dans le bon répertoire, exécutez la commande pwd :

(uiserver):user:~$ pwd
/home/user/www/monsite

Vous venez d’obtenir le chemin absolu du répertoire. Notez-le, nous en aurons besoin par la suite. Vous pouvez fermer la session SSH vers votre hébergeur grâce à la commande exit.

Installation de sshpass

Nous allons maintenant installer l’utilitaire sshpass sur la machine qui exécutera le script. Cet utilitaire permet d’ouvrir une connexion SSH en passant directement le mot de passe en paramètre, ce qui évite que le dialogue classique de demande de mot de passe ne s’affiche car les scripts ne savent pas le gérer. Installez cet utilitaire grâce à votre gestionnaire de packages préféré, apt-get par exemple :

sudo apt-get install sshpass

Sinon, pour plus de sécurité, vous pouvez opter pour une authentification par clé.

Envoi d’un email avec une ligne de commande

Savez-vous qu’il est possible d’envoyer des emails depuis une simple ligne de commande ? Pour cela, vous devez installer les utilitaires ssmtp et mailutils :

sudo apt-get install ssmtp mailutils

Puis éditer le fichier de configuration de ssmtp :

sudo nano /etc/ssmtp/ssmtp.conf

Nous allons indiquer le serveur SMTP que l’utilitaire doit utiliser (exemple de configuration avec Gmail – source) :

root=adresse@gmail.com            # Adresse email
UseSTARTTLS=YES
mailhub=smtp.gmail.com:587        # Adresse et port du serveur SMTP
AuthUser=adresse@gmail.com        # Nom d’utilisateur
AuthPass=motdepasse               # Mot de passe
rewriteDomain=
FromLineOverride=YES
hostname=raspberrypi              # Hostname de la machine : utilisez la commande "hostname -f" pour l'obtenir

Vous pouvez tester votre configuration grâce à la commande suivante :

echo "Hello world" | mail -s "Test" adresse@gmail.com

Si vous ne recevez pas l’email que vous venez de vous envoyer, vérifiez la configuration de ssmtp. Vous pouvez aussi regarder les logs, ça vous aidera à comprendre ce qui ne va pas :

tail /var/log/mail.log

Sinon, vous pouvez passer à l’étape suivante.

Script de sauvegarde

Tout est prêt, vous pouvez ouvrir un fichier backup-site.sh en édition avec votre éditeur de texte préféré :

nano backup-site.sh

Et y copier le code suivant :

#!/bin/bash

if [ $# -eq 0 ]; then
    echo "Vous devez indiquer le chemin du fichier de configuration. Exemple : ./backup-site.sh /home/pi/monsite.cfg"
    exit 1
fi

### Inclusion du fichier de configuration ###
source $1

### Nom des fichiers et des répertoires ###
DATE_MONTH=`date +%Y%m`
BACKUP_DIR="$LOCAL_DIR$PROJECT/$DATE_MONTH/"

DATE_FULL=`date +%Y%m%d-%H%M%S`
SQL_FILENAME="$PROJECT-$DATE_FULL.sql"
BACKUP_FILENAME="$PROJECT-$DATE_FULL.tar.gz"

### Création du répertoire local ###
mkdir -p $BACKUP_DIR

### Création de la sauvegarde sur le serveur ###
sshpass -p $SSH_PASS ssh $SSH_USER@$SSH_HOST "mysqldump -q -u $SQL_USER -h $SQL_HOST -p$SQL_PASS $SQL_DB > $REMOTE_DIR$SQL_FILENAME; tar -zcf $REMOTE_DIR$BACKUP_FILENAME --exclude='$BACKUP_FILENAME'  $REMOTE_DIR; rm $REMOTE_DIR$SQL_FILENAME"

### Récupération du fichier ###
sshpass -p $SSH_PASS scp $SSH_USER@$SSH_HOST:$REMOTE_DIR$BACKUP_FILENAME "$BACKUP_DIR"

### Suppression du fichier sur le serveur ###
sshpass -p $SSH_PASS ssh $SSH_USER@$SSH_HOST "rm $REMOTE_DIR$BACKUP_FILENAME"

### Définition du message de succès ###
read -d '' SUCCESS_MSG <<EOF
Sauvegarde effectuée avec succès.
Date : `date '+%d/%m/%Y %H:%M:%S'`
Emplacement : $BACKUP_DIR
Nom de fichier : $BACKUP_FILENAME
EOF

### Définition du message d'échec ###
read -d '' FAIL_MSG <<EOF
Sauvegarde échouée, le fichier n'a pas été trouvé dans la destination.
Date : `date '+%d/%m/%Y %H:%M:%S'`
Emplacement : $BACKUP_DIR
Nom de fichier : $BACKUP_FILENAME
EOF

### Vérification de la présence du fichier dans la destination et envoi de l'email ###
if [ -f $BACKUP_DIR$BACKUP_FILENAME ]; then
    echo "$SUCCESS_MSG" | mail -s "Sauvegarde terminée : $PROJECT" $EMAIL
else
    echo "$FAIL_MSG" | mail -s "Sauvegarde échouée : $PROJECT" $EMAIL
fi

Enregistrez le fichier et fermez l’éditeur de texte grâce à la combinaison de touches ctrl + x. J’ai mis des commentaires pour ceux qui veulent comprendre comment ça marche.

Configuration

La configuration du script (identifiants de connexion, emplacement de sauvegarde, etc.) se trouve dans un fichier séparé, ça permet de sauvegarder plusieurs sites sans avoir à dupliquer le code du script. Créez un nouveau fichier au nom du site que vous voulez sauvegarder, il doit porter l’extension .config :

nano monsite.config

Copiez-y les lignes suivantes :

PROJECT="monsite"
EMAIL="adresse@gmail.com"

### SSH ###
SSH_HOST="fournisseur.com"
SSH_USER="utilisateur"
SSH_PASS="motdepasse"

### MySQL ###
SQL_HOST="db.fournisseur.com"
SQL_USER="utilisateur"
SQL_PASS="motdepasse"
SQL_DB="database"

### Répertoires ###
LOCAL_DIR="/home/pi/"
REMOTE_DIR="/home/user/www/"

Puis renseignez les différents paramètres :

  • PROJECT : Nom du projet qui sera inclu dans les noms de fichier (pas d’espace ni de caractères spéciaux)
  • EMAIL : Adresse email à laquelle seront envoyées les notifications
  • SSH_HOST : Adresse de connexion au serveur SSH
  • SSH_USER : Nom d’utilisateur SSH
  • SSH_PASS : Mot de passe SSH
  • SQL_HOST : Adresse de connexion à la base de données MySQL
  • SQL_USER : Nom d’utilisateur MySQL
  • SQL_PASS : Mot de passe MySQL
  • SQL_DB : Nom de la base de données à sauvegarder
  • LOCAL_DIR : Répertoire dans lequel seront stockées les sauvegardes (avec slash final)
  • REMOTE_DIR : Chemin absolu du répertoire qui contient les fichiers de votre site sur le serveur de votre hébergeur (avec slash final)

Vous pouvez créer autant de fichiers de configuration que vous avez de site à sauvegarder.

Exécution

Ensuite, il faut rendre le script exécutable :

chmod +x backup-site.sh

Vous pouvez à présent lancer la sauvegarde en passant au script le chemin du fichier de configuration (pensez à remplacer les répertoires par ceux qui correspondent à l’endroit où vous avez mis le script et votre fichier de configuration) :

./backup-site.sh /home/pi/monsite.config

La sauvegarde devrait arriver dans le dossier que vous avez spécifié dans la variable LOCAL_DIR du fichier de configuration. Dans ce dossier, vos sauvegardes seront classées par nom de projet et par mois, c’est plus simple pour s’y retrouver quand on cherche une sauvegarde précise !

Automatisation

Pour que le script se déclenche automatiquement toutes les nuits, vous pouvez planifier son exécution grâce à cron. Pour cela, ouvrez le fichier de configuration de cron :

crontab -e

Et ajoutez la ligne suivante :

  30 3  *   *   *     /home/pi/backup-site.sh /home/pi/monsite.config

Et voilà, votre site internet sera sauvegardé toutes les nuits à 3h30. Ce script tourne depuis un an sur mon Raspberry Pi sans problème. Les sauvegardes sont stockées sur un de mes NAS et je vérifie chaque matin dans ma boîte mail que tout s’est bien passé. Le script ainsi qu’un exemple de configuration sont également disponibles sur GitHub : bash-backup-website. N’hésitez pas à me dire si vous utilisez le script et de quelles améliorations vous auriez besoin !

Ces articles pourraient également vous intéresser :

Commentaires

Il n'y a pas encore de commentaire mais vous pouvez en laisser un grâce au formulaire ci-dessous !


Vous avez aimé cet article ? Dites-le !