Ce script a été initialement réalisé sur un serveur tournant sous GNU/Linux Debian Woody.
Il permet de sauvegarder tous les sites d'un serveur mutualisé, sachant que chaque Virtual Host d'Apache pointe sur un dossier situé dans /var/www.
Aprés chaque sauvegarde on effacera l'ancienne sauvegarde de la semaine précédente.

Paramétrage du script

La première partie consiste à définir les différentes variables du script:

  • Configuration du FTP
  • Configuration des noms de fichiers de backup
# Configuration du FTP distant
loginftp=votre_login
passftp=votre_mdp
hostftp=adresse_du_serveur_ftp
 
# Racine WWW
www=/var/www
# Date du jour
date=`date '+%d-%m-%Y'`
# Date d'il y a 7 jours
date2=`date --date '7 days ago' "+%d-%m-%Y"`

Création des archives tar.gz

Ensuite le script va boucler sur tous les répertoires (sites) contenus dans /var/www et compresser chaque site dans une archive unique qui sera placé dans le répertoire /home/administrateur/backup.
Sous entendu vous avez un utilisateur nommé "Administrateur" qui a un répertoire "backup" dans son home, à adapter suivant vos besoins ...

# Boucle sur tous les comptes Web
for rep in `ls $www`; do    
    if [ -d $www/$rep ]; then
        tar -czf /home/administrateur/backup/backup_$rep\_$date.tar.gz $www/$rep/www
        echo Tar.gz de $rep OK
    fi
done

Transfert des archives

Maintenant que chaque site a été sauvegardé proprement dans une archive, il suffit de transférer ces fichiers sur un serveur FTP pour plus de sécurité.
Après chaque transfert de fichier le script va vérifier, grace à la date contenue dans le nom du fichier, si une version datant de 7 jours existe, si c'est le cas on l'efface afin de ne pas surcharger le serveur de fichiers plus ou moins volumineux.

Afin d'effectuer le transfert FTP, j'utilise ici un client FTP en ligne de commande : NcFTP.

# Boucle sur tous les comptes Web
for rep in `ls $www`; do    
	if [ -d $www/$rep ]; then
		fileToTransfert=/home/administrateur/backup/backup_$rep\_$date.tar.gz 	
		fileToDel=/home/administrateur/backup/backup_$rep\_$date2.tar.gz 
		# Transfert FTP
		ncftpput -u $loginftp  -p $passftp $hostftp / $fileToTransfert 
		echo Transfert FTP de backup_$rep\_$date.tar.gz OK
		# Effacement du backup de la semaine d'avant
		if [ -f $fileToDel ]; then
			rm $fileToDel 
			echo $fileToDel effac?
		fi
	fi
done

Crontab

Le script est maintenant terminé, il suffit de paramétrer la crontab afin de le lancer quotidiennement:

crontab -e
00 05 * * * /home/blabla/backup.sh > backup_log.log

Script complet

#!/bin/sh
 
#---------------------------------------------------------------#
# Script de backup des répertoires web de ***			
# Author: 	Stéphane MUNOS						
# Date:		20 octobre 2004			       					
#											
# N?cessite le client FTP NCFTP							
# 	#apt-get install ncftp										
#											
# Crontab / tous les jours ? 00h05							
# 	#crontab -e								
#											
# 00 05 * * * /home/blabla/backup.sh					
#---------------------------------------------------------------#
 
 
#----- Paramétrage du script -----
 
# Configuration du FTP distant
loginftp=login
passftp=pass
hostftp=ip
 
# Racine WWW
www=/var/www
# Date du jour
date=`date '+%d-%m-%Y'`
# Date d'il y a 7 jours
date2=`date --date '7 days ago' "+%d-%m-%Y"`
 
#---------- Lancement du script ----------
 
clear
 
echo `date`
echo '### Backup des répertoires web ###'
echo
 
#---------- Création des archives tar.gz ----------
 
# Boucle sur tous les comptes Web
for rep in `ls $www`; do    
    if [ -d $www/$rep ]; then
        tar -czf /home/administrateur/backup/backup_$rep\_$date.tar.gz $www/$rep/www
        echo Tar.gz de $rep terminé  
    fi
done
 
echo 
echo '### Backup terminé ###'
echo
 
 
echo 
echo '### Transfert des backups par FTP ###'
echo
 
#---------- Transfert des archives ----------
 
# Boucle sur tous les comptes Web
for rep in `ls $www`; do    
	if [ -d $www/$rep ]; then
		fileToTransfert=/home/administrateur/backup/backup_$rep\_$date.tar.gz
		fileToDel=/home/administrateur/backup/backup_$rep\_$date2.tar.gz 
		# Transfert FTP
		ncftpput -u $loginftp  -p $passftp $hostftp / $fileToTransfert 
		echo Transfert FTP de backup_$rep\_$date.tar.gz terminé	
		# Effacement du backup de la semaine dernière
		if [ -f $fileToDel ]; then
			rm $fileToDel 
			echo $fileToDel effacé
		fi
	fi
done
 
echo 
echo '### Transferts terminés ###'
echo

Conclusion

Ce script peut bien evidemment être adapté à votre guise, notamment en incluant dans le tar.gz un dump de votre SGBD.
Vos commentaires sont les bienvenus !

EDIT 04-08-2005 :

j'ai rajouté la ligne pour le dump SQL avant de faire le tar.gz du Virtual Host :

A rajouter en début de script :

# Password root mysql
$passrootmysql=votrepassrootmysql

A rajouter dans la boucle de création des archives :

# dump sql du compte
fileDumpSql=$www/$rep/dumpsql_$rep\_$date.sql
/usr/bin/mysqldump $rep --user=root --password=passrootmysql -r "$fileDumpSql"
tar -czf /home/administrateur ...

et voilà, avec ça vous un backup complet de votre site (fichiers + bdd) !