Scripts et Programmation

BASH - Sauvegarder son site et sa base de données

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

Introduction




Quand on a un site, ce qui est bien, c'est de le sauvegarder. Voici ci-dessous le script que je lance à la main lorsque je souhaite le sauvegarder.

C'est le script de linuxtricks. Adapter avec les noms que vous voulez :)

Je l'ai conçu de A à Z, il se peut donc qu'il ne soit pas parfait :merci:

Les variables ont été changées pour ne pas afficher mes identifiants :intello:



Etat des lieux




Le dossier personnel : /home/linuxtricks

Le dossier de sauvegarde : /home/linuxtricks/sauvegarde

Le script de sauvegarde : /home/linuxtricks/sauvegarde-script.sh

Le dossier du site : /home/linuxtricks/public_html

Code BASH :
#! /bin/bash
echo On definit les variables systeme
dte=$(date +%Y-%m-%d--%H-%M-%S)
path=`dirname $0`
pathsav="$path/sauvegarde"
pathrap="$path/rapports"
ficrap="$pathrap/sauvegarde-$dte-rapport.log"
site="www.linuxtricks.fr"
wwwpath="/home/linuxtricks/"
wwwfolder="public_html"
dbhost="xxx"
dbuser="xxx"
dbpasswd="xxx"
dbname="xxx"
dbrestohost="$dbhost"
dbrestouser="$dbuser"
dbrestopasswd="$dbpasswd"
dbrestoname="xxxrestore"
echo Variables definies.
echo ""
mkdir -p "$pathrap" 2>/dev/null
echo "RAPPORT SAUVEGARDE $site du $dte" > "$ficrap"
echo Vérification des programmes >> "$ficrap"
progtar=$(which tar)
progtar=$(echo $?)
progbzip2=$(which bzip2)
progbzip2=$(echo $?)
progbzcat=$(which bzcat)
progbzcat=$(echo $?)
progmysqdump=$(which mysqldump)
progmysqdump=$(echo $?)
progmysql=$(which mysql)
progmysql=$(echo $?)
if [ $progtar -eq 0 ] && [ $progbzip2 -eq 0 ] && [ $progbzcat -eq 0 ] && [ $progmysqdump -eq 0 ] && [ $progmysql -eq 0 ]
then
echo Tous les programmes sont disponibles sur le serveur >> "$ficrap"
else
echo Il manque un programme pour faire fonctionner le script de sauvegarde. Vérifier la présence de tar, bzip2, bzcat, mysqldump et mysql >> "$ficrap"
#exit 1
fi
echo Vérification des programmes terminés >> "$ficrap"
echo "" >> "$ficrap"
echo Iniatalisation du script >> "$ficrap"
cd "$path"
mkdir -p "$pathsav" 2>/dev/null
echo Script initialise >> "$ficrap"                                                                                          
echo "" >> "$ficrap"
echo On lance la sauvegarde >> "$ficrap"
echo "" >> "$ficrap"
echo On lance l\'archivage du site web $site >> "$ficrap"
cd "$wwwpath"
tar cf "$pathsav/$site-$dte.tar" "$wwwfolder"
cd "$path"
if [ $? -eq 0 ]
then
echo Archivage du site Web termine :  "$pathsav/$site-$dte.tar" >> "$ficrap"
else
echo Echec de l\'archivage du site Web >> "$ficrap"
#exit 2
fi
echo "" >> "$ficrap"
echo On compresse l\'archive du site web $site >> "$ficrap"
bzip2 -z "$pathsav/$site-$dte.tar"
if [ $? -eq 0 ]
then
        echo Compression de l\'archive du site Web termine :  "$pathsav/$site-$dte.tar.bz2" >> "$ficrap"
else
        echo Echec de la compression de l\'archivage du site Web >> "$ficrap"
        #exit 3
fi
echo "" >> "$ficrap"
echo On lance la sauvegarde de la base de donnees >> "$ficrap"
mysqldump -u "$dbuser" -p"$dbpasswd" -h "$dbhost" "$dbname" > "$pathsav/$site-$dte.sql"
if [ $? -eq 0 ]
then
echo Base de donnees sauvegardee. >> "$ficrap"
else
echo Echec de la sauvegarde de la base de données >> "$ficrap"
exit 4
fi
echo "" >> "$ficrap"
echo On compresse la base de données. >> "$ficrap"
bzip2 -z  "$pathsav/$site-$dte.sql"
if [ $? -eq 0 ]
then
echo Base de donnees compressée. >> "$ficrap"
else
echo Echec de la compression de la base de données >> "$ficrap"
exit 5
fi
echo "" >> "$ficrap"
echo SAUVEGARDE TERMINEE >> "$ficrap"
echo --------------------- >> "$ficrap"
echo PURGE DES ANCIENNES SAUVEGARDES >> "$ficrap"
find "$pathsav" -mtime +30 -exec echo '{}' \; >> "$ficrap"
find "$pathsav" -mtime +30 -exec rm '{}' \; >> "$ficrap"
if [ $? -eq 0 ]
then
        echo Anciennes sauvegardes supprimées. >> "$ficrap"
else
        echo Echec de la suppression des anciennes sauvegardes. >> "$ficrap"
        exit 6
fi
echo -------------------- >> "$ficrap"
echo VERIFICATION DE LA SAUVEGARDE >> "$ficrap"
echo On verifie l\'archive "$pathsav/$site-$dte.tar.bz2" >> "$ficrap"
tar tf "$pathsav/$site-$dte.tar.bz2" 2>/dev/null 1>/dev/null
if [ $? -eq 0 ]
then
        echo Sauvegarde des fichiers du site : OK >> "$ficrap"
else
        echo Une erreur est survenue durant la restauration. La sauvegarde est probablement endommagee. >> "$ficrap"
fi
echo "" >> "$ficrap"
echo On verifie la sauvegarde de la base de donnees : "$pathsav/$site-$dte.sql.bz2" >> "$ficrap"
bzcat "$pathsav/$site-$dte.sql.bz2" | mysql -u "$dbrestouser" -p"$dbrestopasswd" -h "$dbrestohost" $dbrestoname 
if [ $? -eq 0 ]
then
        echo Sauvegarde de la base de donnees : OK >> "$ficrap"
else
        echo Une erreur est survenue durant la restauration. La sauvegarde est probablement endommagee. >> "$ficrap"
fi
echo TESTS DE RESTAURATION TERMINES >> "$ficrap"




Lister les rapports




Si le dossier rapports est accessible via le serveur web, voici une page PHP (à nommer index.php par exemple et à placer dans le même dossier que les rapports) qui permet de les lister et d'y accéder facilement :

Code PHP :
<?php
foreach (scandir('.', 1) as $filename) {
if ( ereg(".log$", $filename) )
echo "<a href=\"$filename\" >$filename</a>
";
}
?>




Le Crontab




Et pour finir, on fait une crontab qui automatise la sauvegarde périodiquement (ici, tous les jours à 00h01) :

Code BASH :
01 00 * * * /home/linuxtricks/sauvegarde-script.sh




Récupérer les sauvegardes ailleurs




Pour plus de sécurité, on peut se permettre de récupérer sur un autre serveur les sauvegardes via la commande :

Code BASH :
cd /le/dossier.voulu/
rsync -rvzh linuxtricks@linuxtricks.fr:/home/linuxtricks/sauvegarde* .


Utiliser cette commande si on a changé le port de SSH :

Code BASH :
cd /le/dossier.voulu/
rsync -rvzh -e 'ssh -p 2222'  linuxtricks@linuxtricks.fr:/home/linuxtricks/sauvegarde* .