fafou.fr


Escalade, Alpinisme, Ski, Voile, Mécanique, Informatique ...

fafou.fr


Escalade, Alpinisme, Ski, Voile, Mécanique, Informatique ...

Scripts de sauvegarde de site web

Scripts de sauvegarde de site web

Par le 19 juin 2014

Après la migration, je me suis attelé à réaliser un système de sauvegarde du site plus propre et efficace que sur le précédent serveur. En effet, j’utilisais une série d’extensions WordPress de « backup » dont je n’ai jamais trop su ce qu’elles faisaient réellement.

Rien de mieux que le bash et les outils basiques de GNU/Linux pour reprendre le contrôle sur sa machine et faire exactement ce dont on a besoin !

#!/bin/bash

cd /home/peter/backup/daily

date=`date +"%Y-%m-%d"`
fichier_old=`ls -l | head -1`

mysqldump -uidentifiant -pmotdepasse wordpress > wordpress_${date}.sql
mysqldump -uidentifiant -pmotdepasse photos > photos_${date}.sql
Exemple.sh

1 – Le cahier des charges

Je souhaite sauvegarder deux choses :

  • le répertoire /var/www qui contient l’ensemble du site
  • les bases de données MySQL du site

En cas de problème, je souhaite pouvoir disposer de :

  • 1 sauvegarde du jour « j » et 1 sauvegarde du jour « j-1 »
  • 1 sauvegarde du début de la semaine
  • 1 sauvegarde du début du mois

Les sauvegardes seront stockées en trois emplacement :

  • sur le serveur du site lui-même, dans un répertoire ./backup (enregistrement automatique)
  • sur une autre machine disposant d’un serveur FTP (upload automatique)
  • sur mon PC (upload manuel quand j’utilise mon PC)

Il est un peu compliqué de planifier l’upload des fichiers de sauvegarde vers mon PC alors que celui-ci n’est pas allumé en permanence, ni même à heures fixes. Je ferai donc cela à la main de temps en temps en allumant le PC.
En revanche, je dispose d’une Seedbox (libndown, pour faire un peu de pub) sur laquelle tourne un serveur FTP et qui est, par définition, allumée en permanence. J’utiliserai donc une petite partie du disque de la Seedbox pour stocker mes sauvegardes et l’upload se fera automatiquement.

2 – Programmes à installer

  • Création d’un fichier archive par sauvegarde

Pour une question de facilité de manipulation et de transfert des fichiers de sauvegarde, le mieux est de créer une archive. Le programme « tar » installé par défaut dans toutes les bonnes distributions GNU/Linux fait très bien l’affaire.

  • Sauvegarde des bases de données MySQL

L’outil « mysqldump »est intégré à MySQL donc rien à installer de ce côté.

  • Transfert des fichiers de sauvegarde vers serveur FTP distant

Pour cela il faut un bon client FTP : lftp !

  • Planification des sauvegardes

Le programme « cron » également intégré à toutes les distributions est parfait pour ça.

3 – Les scripts

3-1 – Fonctionnement de l’ensemble

Les sauvegardes seront stockées dans le répertoire ./backup organisé de la manière suivante :

./backup/daily     //où les deux sauvegardes quotidiennes "j" et "j-1" seront stockées
./backup/weekly    //où la sauvegarde hebdomadaire sera stockée
./backup/monthly   //où la sauvegarde mensuelle sera stockée

Le répertoire ./backup sur le serveur FTP distant aura la même organisation.

J’aurai trois scripts :

  • un script exécuté tous les jours qui fera les sauvegardes, les stockera dans ./backup/daily et les enverra sur la Seedbox en FTP
  • un script exécuté tous les lundi qui copiera dans, ./backup/weekly, le fichier de sauvegarde le plus récent contenu dans ./backup/daily et l’enverra à la Seedbox
  • un script exécuté tous les premier du mois qui copiera dans, ./backup/monthly, le fichier de sauvegarde le plus récent contenu dans ./backup/weekly et l’enverra à la Seedbox

3-2 – Script exécuté chaque jour

#!/bin/bash

cd /home/robert/backup/daily

#$date est de la forme "2014-05-17"
date=`date +"%Y-%m-%d"`

#$fichier_old contient le nom du fichier le plus ancien dans le repertoire "daily"
fichier_old=`ls -1 | head -1`

#sauvegarde des bases de données MySQL
mysqldump -uidentifiant -motdepasse wordpress > wordpress_${date}.sql
mysqldump -uidentifiant -motdepasse photos > photos_${date}.sql

#creation de l'archive compressée en gz
#le nom de l'archive sera de la forme "fafou.fr_2014-05-17.tar.gz"
tar -zcf fafou.fr_${date}.tar.gz wordpress_${date}.sql photos_${date}.sql --directory /home/robert www



#suppression des fichers .sql maintenant inclus dans l'archive .tar.gz
rm *.sql

#suppression du fichier le plus ancien contenu dans le repertoire "daily"
rm ${fichier_old}



#lecture sur le serveur FTP distant du nom du fichier le plus ancien dans le repertoire "daily"
#$fichier_old est de la forme "fr_2014-05-17"
fichier_old=`lftp identifiant:motdepasse@ip-du-serveur -e "set ssl:verify-certificate no; ls 00_backup-fafou/daily; quit;" | cut -d . -f 2 | head -1`

#copie de la nouvelle sauvegarde quotidienne sur le serveur FTP distant et suppression de la plus ancienne
lftp identifiant:motdepasse@ip-du-serveur -e "set ssl:verify-certificate no; cd 00_backup-fafou/daily; put fafou.fr_${date}.tar.gz; rm fafou.${fichier_old}.tar.gz; quit;"
backup-daily.sh

Si vous n’utilisez pas SSL pour communiquer avec le FTP, la commande set ssl:verify-certificate no exécutée par lftp n’est pas nécessaire.
Cette commande est nécessaire si vous utilisez SSL sans certificat et obtenez du coup l’erreur suivante :

Erreur fatale: Certificate verification: Not trusted

Cette directive peut également être indiquée de manière définitive dans les fichiers suivants :

/etc/lftp.conf
  ou
/home/utilisateur/.lftprc

3-3 – Script exécuté chaque lundi

#!/bin/bash

cd /home/robert/backup/weekly

#$fichier_weekly contient le nom du fichier le plus récent dans le repertoire "daily"
fichier_weekly=`ls -1 ../daily | tail -1`

#$fichier_old contient le nom du fichier le plus ancien dans le repertoire "weekly"
fichier_old=`ls -1 | head -1`



#suppression de la sauvegarde hebdomadaire la plus ancienne
rm ${fichier_old}

#copie de la sauvegarde quotidienne la plus recente
cp ../daily/${fichier_weekly} ./



#lecture sur le serveur FTP distant du nom du fichier le plus ancien dans le repertoire "weekly"
#$fichier_old est de la forme "fr_2014-05-17"
fichier_old=`lftp identifiant:motdepasse@ip-du-serveur -e "set ssl:verify-certificate no; ls 00_backup-fafou/weekly; quit;" | cut -d . -f 2 | head -1`

#copie de la nouvelle sauvegarde hebdomadaire sur le serveur FTP distant et suppression de la plus ancienne
lftp identifiant:motdepasse@ip-du-serveur -e "set ssl:verify-certificate no; cd 00_backup-fafou/weekly; put ${fichier_weekly}; rm fafou.${fichier_old}.tar.gz; quit;"
backup-weekly.sh

3-4 – Script exécuté chaque premier du mois

#!/bin/bash

cd /home/robert/backup/monthly

#$fichier_monthly contient le nom du fichier le plus récent dans le repertoire "weekly"
fichier_monthly=`ls -1 ../weekly | tail -1`

#$fichier_old contient le nom du fichier le plus ancien dans le repertoire "monthly"
fichier_old=`ls -1 | head -1`



#suppression de la sauvegarde mensuelle la plus ancienne
rm ${fichier_old}

#copie de la sauvegarde hebdomadaire la plus recente
cp ../weekly/${fichier_monthly} ./



#lecture sur le serveur FTP distant du nom du fichier le plus ancien dans le repertoire "monthly"
#$fichier_old est de la forme "fr_2014-05-17"
fichier_old=`lftp identifiant:motdepasse@ip-du-serveur -e "set ssl:verify-certificate no; ls 00_backup-fafou/monthly; quit;" | cut -d . -f 2 | head -1`

#copie de la nouvelle sauvegarde mensuelle sur le serveur FTP distant et suppression de la plus ancienne
lftp identifiant:motdepasse@ip-du-serveur -e "set ssl:verify-certificate no; cd 00_backup-fafou/monthly; put ${fichier_monthly}; rm fafou.${fichier_old}.tar.gz; quit;"
backup-monthly.sh

 

4 – Planification de l’exécution des scripts avec CRON

Sous le compte de l’utilisateur qui exécutera les scripts, taper la commande suivante pour modifier la crontab :

user@computer:$ crontab -e

Votre éditeur de texte par défaut doit normalement s’ouvrir avec le texte suivant :

# m h  dom mon dow   command

Compléter le fichier ainsi :

# m h  dom mon dow   command
0 5 * * * /home/robert/backup/scripts/backup_blog-daily.sh
30 5 * * 1 /home/robert/backup/scripts/backup_blog-weekly.sh
40 5 1 * * /home/robert/backup/scripts/backup_blog-monthly.sh

La première ligne indique que le script sera exécuté tous les jours à 5h00.
La seconde indique que le script sera exécuté tous les lundi à 5h30.
La troisième indique que le script sera exécuté tous les premier du mois à 5h40.

J’ai préféré laisser un peu de temps entre les exécutions des différents scripts pour être sûr que l’archivage et l’upload soit terminé avant de commencer à exécuter le script suivant dans le cas d’un lundi qui serait le premier jour du mois.

Voir cette page pour davantage de précisions quant à l’utilisation de cron.

5 – Première exécution des scripts

Dans chacun des trois répertoires « daily », « weekly » et « monthly », ces trois scripts ne font que créer une nouvelle sauvegarde et supprimer la plus ancienne.

Dans mon cas, je souhaite conserver :

  • deux sauvagardes dans « daily »
  • une sauvegarde dans « weekly »
  • une sauvagarde dans « monthly »

Avant la première exécution, j’ai donc créé des fichiers avec des noms indiquant des dates antérieures à la date du jour :

  • deux fichiers dans « daily »
    • fafou.fr_2008-01-01.tar.gz
    • fafou.fr_2009-01-01.tar.gz
  • un fichier dans « weekly »
    • fafou.fr_2009-01-01.tar.gz
  • un fichier dans « monthly »
    • fafou.fr_2009-01-01.tar.gz

Le nombre de sauvegardes à conserver dans chacun des répertoires est donc facilement adaptable et sans modification du code.
Pour avoir cinq sauvegardes dans daily, quatre dans weekly et trois dans monthly, il suffit de créer le nombre de fichiers correspondant dans chacun des répertoires avec les commandes suivantes :

user@computer:$ touch ./daily/fafou.fr_2008-01-01.tar.gz
user@computer:$ touch ./weekly/fafou.fr_2009-01-01.tar.gz
user@computer:$ touch ./monthly/fafou.fr_2009-01-01.tar.gz

Faire de même sur le serveur FTP distant, soit avec un client en mode graphique, soit avec la commande suivante :

user@computer:$ lftp identifiant:motdepasse@ip-du-serveur -e "set ssl:verify-certificate no; mirror -R ./backup; quit;"

Une fois que vous avez créé tous vos fichiers dans le répertoire ./backup de manière à conserver le nombre de sauvegardes qui vous convient, cette commande va copier ce répertoire vers la racine de votre serveur FTP distant.

Le système de sauvegarde est opérationnel.

6 – Restauration du site après un problème sur le serveur

6-1 – Restaurer le contenu du site

Rien de plus simple !

Supprimer le contenu du répertoire /var/www puis y désarchiver la dernière sauvegarde saine.

user@computer:$ cd /var/www
user@computer:$ rm -rf ./*
user@computer:$ tar -xf sauvegarde-saine.tar.gz

6-2 – Restaurer les bases de données

Simple aussi :

user@computer:$ mysql -uidentifiant -pmotdepasse base_de_donnees < sauvegarde.sql

Faire cette opération pour toutes les bases à restaurer (wordpress et piwigo dans mon cas).

 

Posté dans : Informatique
Taggé :

Comments

Soyez le premier à commenter.

Laisser un commentaire


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre user="" computer="" escaped="">

*