webbackup : Sauvegarder son site web personnel
Par fpl le lundi 12 septembre 2005, 20:36 - Général - Lien permanent

Tout le monde sait qu'il est important de sauvegarder ses données mais on s'en rend généralement compte qu'on aurait dû le faire quand les données sont perdues. La plupart des hébergeurs gratuits ou "discount" ne sauvegardent pas les données des utilisateurs. Je propose donc de partager ma petite moulinette de sauvegarde à faire tourner sous Linux. Elle devrait fonctionner avec tous les hébergeurs qui offrent un accès FTP et une base mysql.
Je m'appuie sur les outils suivants :
Voici mon script webbackup.sh :
#!/bin/bash
# WebBackup
# Version : 1.0
# Author : frederic%DOT%ple%AT%gmail%DOT%com
#
# 1.0 : first proper release
#
function usage {
cat >&2 <&2
echo -e "\t- 'tar' found at $CMDTAR
\t- 'curl' found at $CMDCURL
\t- 'lftp' found at $CMDLFTP
\t- 'gzip' found at $CMDFOUND
\t- 'bzip2' found at $CMDBZIP
\t- 'date' found at $CMDDATE
" >&2
echo "Please fix them" >&2
echo "Exiting" >&2
exit 1
fi
PARM_VERBOSE=""
PARM_VERSION=""
PARM_NAME=""
PARM_MPATH=""
PARM_LFTPEXCLUDE=""
PARM_BPATH=""
PARM_FTP=""
PARM_URL=""
PARM_REMOVE_DBBAK=""
PARM_REAL_DBBAK=""
PARM_TAR=""
PARM_ROTATION=31
OPTIND=1
while [ 0 -eq 0 ]
do
getopts 'hqvdVs:m:x:b:f:u:e:tzjr:' OPT || break
case "$OPT" in
h) usage 0
;;
q|v|d) if [ -n "$PARM_VERBOSE" ] ; then
echo "ERROR : option -$PARM_VERBOSE is not compatible with -$OPT" >&2
usage 1
fi
PARM_VERBOSE=$OPT
[ $OPT == "d" ] && set -x
;;
V) PARM_VERSION=$OPT
;;
s) PARM_NAME="$OPTARG"
;;
m) PARM_MPATH="$OPTARG"
;;
x) PARM_LFTPEXCLUDE="${PARM_LFTPEXCLUDE}-x $OPTARG "
;;
b) PARM_BPATH="$OPTARG"
;;
f) PARM_FTP="$OPTARG"
;;
u) PARM_URL="$OPTARG"
;;
e) PARM_REMOVE_DBBAK="$OPTARG"
;;
t|z|j) if [ -n "$PARM_TAR" ] ; then
echo "ERROR : option -$PARM_TAR is not compatible with -$OPT" >&2
usage 1
fi
PARM_TAR="$OPT"
;;
r) if [ "$OPTARG" -ne 0 -a "$OPTARG" -ne 7 -a "$OPTARG" -ne 31 -a "$OPTARG" -ne 365 ] ; then
echo "ERROR : illegal value $OPTARG" >&2
usage 1
fi
PARM_ROTATION=$OPTARG
;;
*) usage 1
;;
esac
done
# Check Parm
[ -z "$PARM_TAR" ] && PARM_TAR="j"
if [ -z "$PARM_NAME" ] ; then
echo "ERROR : missing option -s" >&2
usage 1
fi
if [ -z "$PARM_MPATH" ] ; then
echo "ERROR : missing option -m" >&2
usage 1
fi
if [ ! -d $PARM_MPATH ] ; then
echo "ERROR : directory $PARM_MPATH not found" >&2
usage 1
fi
if [ -n "$PARM_BPATH" -a ! -d "$PARM_BPATH" ] ; then
echo "ERROR : directory $PARM_BPATH not found" >&2
usage 1
fi
if [ -z "$PARM_FTP" ] ; then
echo "ERROR : missing option -b" >&2
usage 1
fi
# Begin
prn "" "Starting backup of $PARM_NAME at $(date)"
ORGPATH=$(pwd)
# Dump MySQL
if [ -z "$PARM_URL" ] ; then
prn v "No URL found. Skipping database dump !"
else
read URL URLU URLP <<-EOF
$(echo $PARM_URL | perl -ne 'chomp; if ( /@/ ) { s/^(http:\/\/)(.*?)\:(.*?)@(.*)/$1$4 $2 $3/ } ; print $_ ; ')
EOF
prn d "URL=$URL URLU=$URLU URLP=$URLP"
prn v "Start database dump at $(date)"
$CMDCURL -s $([ -n "$URLU" ] && echo -n "--user $URLU:$URLP") -o /dev/null "$URL/backupDB.php?StartBackup=complete&nohtml=1" >/dev/null 2>&1
prn v "End database dump at $(date)"
fi
# FTP mirror
prn v "Start FTP mirror at $(date)"
read FTPU FTPP FTPH <<-EOF
$(echo $PARM_FTP | perl -ne 'chomp; if ( /@/ ) { s/^(.*?)\:(.*?)@(.*)/$1 $2 $3/ } ; print $_ ; ')
EOF
if [ -z "$FTPU" -o -z "$FTPP" -o -z "$FTPH" ] ; then
echo "Error : Incorrect FTP parameters (-f). Exiting" >&2
usage 1
else
cd $PARM_MPATH
$CMDLFTP -u $FTPU,"$FTPP" -e "mirror $PARM_LFTPEXCLUDE -n -e ; quit" $FTPH
cd -
fi
prn v "End FTP mirror at $(date)"
# Archive
if [ $PARM_ROTATION -eq 0 ] ; then
prn v "Rotation is 0. Skipping archive !"
else
case $PARM_ROTATION in
7) PARM_ROTATION=u
;;
31) PARM_ROTATION=d
;;
365) PARM_ROTATION=j
;;
esac
ARCH_FILE=$PARM_BPATH/$PARM_NAME-$(date +%$PARM_ROTATION)
case $PARM_TAR in
t) ARCH_FILE=$ARCH_FILE.tar
;;
j) ARCH_FILE=$ARCH_FILE.tar.bz2
;;
z) ARCH_FILE=$ARCH_FILE.tar.gz
;;
esac
prn v "Start archiving at $(date)"
cd $PARM_MPATH
$CMDTAR $([ $PARM_TAR == "t" ] || echo -n "$PARM_TAR")cf $ARCH_FILE .
cd -
prn v "End archiving at $(date)"
fi
# Remove remote DB
if [ -z "$PARM_REMOVE_DBBAK" ] ; then
prn v "Skipping remote DB removal !"
else
prn v "Removing remote DB"
$CMDLFTP -u $FTPU,"$FTPP" -e "rm -f $PARM_REMOVE_DBBAK/backupdb/db_backup.sql.gz ; quit" $FTPH
fi
# End
prn "" "Ending backup of $PARM_NAME at $(date)"
Le script peut être lancé automatiquement en plaçant la ligne suivante dans le cron (crontab -e)
15 4 * * * /usr/local/bin/webbackup.sh -q -s "www.mon-site.com" -m /home/backup/www.mon-site.com/ -f loginftp:secret -u http://www.mon-site.com/database -e /html/database -j -r 0




Commentaires
Je peux t'affirmer que Free fait des sauvegardes régulières et qu'il leur est possible de remonter une version précédant un éventuel incident très rapidement.
Il m'ont fait ça dans la nuit après que mon portail ait été piraté et j'ai poussé un GROS soupir de soulagement.
Ce qui n'empêche pas que ton script est très intéressant !
En admettant que free.fr fasse des sauvegardes des sites persos, ils n'ont aucun engagement ni de moyens ni de résultats. Donc vaut mieux prendre les devants.
En plus ça devrait fonctionner avec d'autres hébergeurs (au moins ouvaton.coop car je l'utilise pour mon blog).
Bonjour,
Merci pour ce script. Je l'utilise maintenant pour la sauvegarde de mon site. Je me suis rendu compte que mon site contenait peu de données réelles mais beaucoup de fichiers caches, de fichiers index, etc. qu'il n'est pas forcément intéressant de sauvegarder. On peut exclure les répertoires à ne pas sauver à l'aide de l'option -x. Si l'on a N répertoires à exclure, on doit utiliser N fois l'option -N.
Bonjour,
Merci pour le tip.
J'utilise depuis un moment une autre version de ce script qui ne s'appuie plus sur du FTP mais mais qui s'éxecute localement sur la machine à sauvegarder (j'ai un acces shell à la machine). Du coup je fais un find / -name .nobackup pour definir la liste des répertoires a exclure de la sauvegarde dynamiquement.
Fred