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