Pour la 3e étape du backup de notre site web, on va garder un historique des versions hebdomadaires de notre site. Cela permet d’aller récupérer l’état de son site une ou plusieurs semaines dans le passé. Pratique si on a mis à jour un plugin foireux de notre CMS et qu’on s’en est rendu compte après la synchro du clone automatique du site…

Voici le script de sauvegarde rdiff-backup : backupDataLocalRdiff.sh

 

Pour les tâches planifiées, je vous conseille ceci :

30 1 * * 7 root [ -x /root/backupDataLocalRdiff.sh ] && /root/backupDataLocalRdiff.sh localhistorybackup
01 6 1 * * root [ -x /root/backupDataLocalRdiff.sh ] && /root/backupDataLocalRdiff.sh localhistoryverify
  • Une fois par semaine, on archive les données FTP et les dump MySQL
  • Une fois par mois, on reçoit un résumé avec les tailles des sauvegardes rdiff-backup.

 

Voici le script en question :

#!/bin/bash
# Auteur : Belgotux
# Site : www.monlinux.net
# Adresse : 
# Version : 1.0.2
# Date : 05/03/2012
# Description : 

#Arguments
# backupDataLocalRdiff localhistorybackup | localhistoryverify

# for crontab 
# 30 1 * * * root [ -x /root/backupDataLocalRdiff.sh ] && /root/backupDataLocalRdiff.sh localhistorybackup
# 01 6 1 * * root [ -x /root/backupDataLocalRdiff.sh ] && /root/backupDataLocalRdiff.sh localhistoryverify

error_report=root
mail_report=root
folderBackup="/data/clone-ftp
/root"								#dossiers à sauvegarder en chemin absolu sans / à la fin
foldersExcluded="/data/perso/test"
logFile=""
formatDate="%Y-%m-%d %H:%M:%S"		#obligatoire
rdiffbackupRemovePeriod="3M" 		# obligatoire période rdiffbackup pour faire un clean des vieilles backups ( si full 1mois et remove 3 mois, on garde en fait 4 mois (car regarde la date du dernier incrémental donc 1 de plus))

#Variables sauvegarde local
dossierDistantLocal="/data/backup"


#Variables définies
if [ "$logFile" == "" ] ; then logFile="/var/log/$(basename $0 .sh).log" ; fi


### Fonctions ###

function rdiffbackupLocal {
	echo -e "Backups incrémentales Rdiff-backup en cours..."
	
	cptResult=0
	flagError=0
	while read i ; do
		echo -e "\n\n\n- dossier en cours : $i"
		#test répertoire vide
		if [ $(ls -a "$i"|wc -l) = 2 ] ; then
			echo "  !Erreur : répertoire $1 vide!"
			flagError=1
			verif=1
		else
			# (rdiffbackup chemin absolut)
			excluded="$foldersExcluded"
			folderDestination=$(basename "$i")	#dossier destination = nom du dossier local
			
			echo -e "$excluded" | rdiff-backup --print-statistics --exclude-filelist-stdin "$i" ${dossierDistantLocal}/"$folderDestination" && \
			rdiff-backup --print-statistics --remove-older-than "$rdiffbackupRemovePeriod" --force ${dossierDistantLocal}/"$folderDestination"
			
			verif=$?
			if [ "$verif" != 0 ] ; then
				echo "  !Erreur synchronisation dossier $i"
				flagError=1
			else
				echo "    Synchronisation terminée du dossier $i"
			fi
		fi
		
		tabResultRdiffbackupLocal[$cptResult]="$verif"
		cptResult=$(($cptResult+1))
	done < <( echo -e "$folderBackup" )
	
	if [ $flagError == 0 ] ; then
		return 0
	else
		return 1
	fi
}


function rdiffbackupVerifyLocal {
	echo -e "Check Rdiff-backup en cours..."
	
	cptResult=0
	flagError=0
	while read i ; do
		echo -e "\n\n\n- dossier en cours : $i"
		folderDestination=$(basename "$i")	#dossier destination = nom du dossier local
		rdiff-backup --print-statistics --test-server --list-increment-sizes ${dossierDistantLocal}/"$folderDestination"
		
		verif=$?
		if [ "$verif" != 0 ] ; then
			echo "  !Erreur check dossier $i"
			flagError=1
		else
			echo "    Check du dossier $i"
		fi
		
		tabResultRdiffbackupLocal[$cptResult]="$verif"
		cptResult=$(($cptResult+1))
	done < <( echo -e "$folderBackup" )
	
	if [ $flagError == 0 ] ; then
		return 0
	else
		return 1
	fi
}



############### Main ###############

case "$1" in

localhistorybackup)
	if [ "$dossierDistantLocal" != "" ] ; then
		rdiffbackupLocal
		returnRdiffbackupLocal=$?
		#gestion erreurs
		if [ $returnRdiffbackupLocal != 0 ] ; then
			mailBody=$(echo -e "\nErreur : RdiffbackupLocal=$returnRdiffbackupLocal")
			cpt=0
			while read i ; do
				if [ "${tabResultRdiffbackupLocal}" = "" ] || [ ${tabResultRdiffbackupLocal[$cpt]} != 0 ] ; then
					mailBody+=$(echo -e "\n  $i : ${tabResultRdiffbackupLocal[$cpt]}")
				fi
				cpt=$(($cpt+1))
			done < <( echo -e "$folderBackup" )
			echo $(date +"$formatDate")" Erreur : RdiffbackupLocal=$returnRdiffbackupLocal" >> $logFile
			echo "$mailBody" | mail -s "$(hostname -f) erreur backup rdiffbackup" $error_report
		fi
		
		if [ $returnRdiffbackupLocal != 0 ] ; then
			exit 1
		else
			echo ""
			echo -e "opération terminée"
			echo ""
			echo -e "Backup rdiffbackup réussie" | mail -s "$(hostname -f) backup rdiffbackup reussie" $mail_report
		fi
	else
		echo -e "\nErreur : Paramètres manquants" | mail -s "$(hostname -f) erreur backup rdiffbackup" $error_report
		exit 1
	fi
	;;
localhistoryverify)
	if [ "$dossierDistantLocal" != "" ] ; then
		rdiffbackupVerifyLocal | mail -s "$(hostname -f) résumé du mois rdiffbackup " $mail_report
	fi
	;;
*)
	echo "Aide :"
	echo "$(basename $0) localhistorybackup | localhistoryverify"
	echo ""
	exit 0
	;;
esac


echo $(date +"$formatDate")" opération terminée" >> $logFile

exit 0

Voilà vous être tranquille maintenant 😉

Vérifiez de temps en temps les mails de retour des backups et surtout essayez de faire une restauration sur un autre serveur pour tester vos backups au moins une fois par an!