Dans le cadre de la sauvegarde de son site en 3 étapes, voici un script pour cloner le contenu de son FTP à distance pour avoir ses backups délocalisées.

Ce script permet de se connecter en FTP ou SFTP sur son hébergeur et d’y reprendre le nouveau contenu (plus rapide) ou de faire un différentiel de tout le contenu existant et le rapatrier (plus sur mais beaucoup plus long).

Voici le lien vers le script : clone-ftp.sh

Je vous conseille de mettre les tâches cron suivantes pour optimiser le temps et la robustesse de vos backups :

0 10 * * 1-6    root    nice -n 19 /usr/local/sbin/clone-ftp.sh --quick
0 10 * * 7      root    nice -n 19 /usr/local/sbin/clone-ftp.sh
  • Le backup est fait pour le nouveau contenu chaque jour (pour les dump mysql de la nuit surtout) pour être rapide
  • Le backup complet est fait chaque semaine (mise à jour de plugin ou du CRM par exemple)
  • le nice est mis au plus bas dans les priorités noyau

Voici les détails du script :

#!/bin/bash

dossier_local="/data/clone-ftp"

server="ftp.server"							#server name
source_distant=""							#remote directory to backup (let empty for all the ftp root)
credential_file="/data/clone-ftp.secret"	#format user:password
logfile="/var/log/clone-ftp.log"			#logfile
foldersExcluded="backup_ftp
public_html/private/backups
public_html/monlinux.net/files"				#exclude directory or files
quick="no"									#value "on"/"yes" or "off" to only check only new files, not modified (quicker)

#test if local directory exist
if [ ! -d "$dossier_local" ] ; then
	echo "Error : directory $dossier_local don't exist!" >&2
	exit 1
fi

#test if credential file exist
if [ ! -e "$credential_file" ] ; then
	echo "Error : FTP credential file $credential_file don't exist!" >&2
	exit 1
fi

#get args to check about quick mode
if [ $# == 1 ] ; then
	if [ "$1" == "--quick" ] ; then quick="yes"
	  else echo "bad args, use --quick for only check new files" >&2 && exit 1
	fi
fi

credential=$(cat $credential_file)

#get excluded
if [ "$foldersExcluded" != "" ] ; then
	while read exclude ; do
		formatFoldersExcluded="$formatFoldersExcluded --exclude '$exclude'"
	done < <(echo "$foldersExcluded")
fi

#get quick mode : only add new files, don't compare files modified
if [ "$quick" == "yes" ] || [ "$quick" == "on" ] ; then quickValue='--only-missing' ; fi

#lftp -c mirror --continue --delete $quickValue --log="$logfile" "$formatFoldersExcluded" ftp://$credential@$server/$source_distant $dossier_local
lftp -u $credential $server <<EOF
  mirror --continue --delete $quickValue --log=$logfile $formatFoldersExcluded /$source_distant $dossier_local
EOF

exit $?

Pour la suite, il faut aller à la 3e et dernière étape : backup des données FTP en local pour l’historique via rdiff-backup.