Backup automatique des bases mysql et des répertoires d’un serveur web puis envoi sur un ftp

J’avais besoin d’un script sur mon serveur dédié pour effectuer une sauvegarde quotidienne des fichiers importants du serveur (les fichiers de sites web, et les fichiers de configuration des applications, dans /etc), ainsi que des bases de données, mysql en l’occurence. Le problème c’est que les fichiers sauvegardés en local ne servent pas à grand chose quand le disque crashe. Ce script doit donc envoyer les fichiers sauvegardés et compressés sur un serveur FTP. Sur le web j’ai trouvé des scripts qui ne marchaient pas… alors je m’en suis inspiré :-) pour en faire un qui marche.

Mieux : le script m’envoie un mail quand il n’arrive pas à sauvegarder sur le ftp (serveur plein ou indisponible)

Prérequis :

Un compte sur un serveur FTP :

  • Chez OVH il y a un service gratuit d’hébergement FTP (il suffit de le demander dans l’interface du “manager”.
  • Chez Free, vous avez 1 Go de FTP avec votre compte e-mail.
  • Sinon, demandez au Père Noël…

Comme l’espace sur votre FTP de backup ne sera pas infini, ce script écrase tous les jours la version précédente. Vous pouvez aussi avoir un fichier par date du jour. Regardez plus loin…

Quelques logiciels sur votre machine :

  • un client ftp digne de ce nom. Ce script utilise ncftp. Donc “apt-get install ncftp”.
  • savoir où se trouvent les binaires de mysql, mysqladmin et donc ncftp. Via un “whereis ncftp” par exemple.
  • les classiques : tar et gzip
  • la commande mail qui fonctionne, pour savoir quand l’upload sur le ftp a foiré !

Quoi faire comment où :

Copiez-collez ce code dans un fichier, par exemple :

/root/backup2ftp.sh

Le script :

#!/bin/sh
# Copyright (c) 2007 Julien Ricard
# This script is licensed under GNU GPL version 2.0 or above  

### Config  ###
# répertoires séparés par un espace
DIRS="/home/www /etc"
# le répertoire temporaire pour compresser... laissez ça !
BACKUP_DIR=/tmp/backup
# pour avoir un fichier de sauvegarde par jour effacez la ligne NOW=1
NOW=$(date +%d-%m-%Y)
NOW=1 

### Config MySQL ###
# le user qui se connecte à mysql pour faire le mysqldump et le mysql
# cet user doit avoir les droits "Select" et "Lock Tables" en global
# mettez root si vraiment vous le voulez
MYSQL_USER=user-de-backup
MYSQL_PASS=mot-de-passe
MYSQL_HOST=localhost
# les chemins des exécutables de mysql
MYSQL_BIN=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump
# celui de gzip
GZIP=/bin/gzip  

### Config de votre compte FTP ###
# où uploader les fichiers sur le FTP
FTP_DIR=/backup
# votre login et votre mot de passe
FTP_USER=le-login
FTP_PASS=le-mot-de-passe
FTP_SERVER=ip-ou-nom-du-serveur
# chemin de ncftp
NCFTP_BIN=/usr/bin/ncftp  

### E-mail pour les alertes ###
EMAIL=vous@email.com  

### Après on ne touche à rien ###
[ ! -d $BACKUP_DIR ] && mkdir -p $BACKUP_DIR || :
FILE=fs-$NOW.tar.gz
tar -zcf $BACKUP_DIR/$FILE $DIRS  

DBS=$($MYSQL_BIN -u$MYSQL_USER -h$MYSQL_HOST -p$MYSQL_PASS -Bse 'show databases')
for db in $DBS
do
FILE=$BACKUP_DIR/mysql-$db-$NOW.sql.gz
$MYSQLDUMP -u $MYSQL_USER -h $MYSQL_HOST -p$MYSQL_PASS $db | $GZIP -9 > $FILE
done  

$NCFTP_BIN -u$FTP_USER -p$FTP_PASS $FTP_SERVER << EOF
mkdir $FTP_DIR
echo "$NCFTP_BIN -u$FTP_USER -p$FTP_PASS $FTP_SERVER< mkdir $FTP_DIR"
cd $FTP_DIR
lcd $BACKUP_DIR
del *
mput *
quit
EOF  

rm -f $BACKUP_DIR/*
if [ "$?" == "0" ]; then
OUT=/tmp/backup.fail
echo "Date : $(date)">$OUT
echo "Serveur : $(hostname)" >>$OUT
echo "Sauvegarde sur FTP échouée" >>$OUT
mail -s "Sauvegardé échouée" "$EMAIL" <$OUT
rm -f $OUT
fi

Lancez ce script tous les jours…

On rend ce script exécutable :

chmod 755 /root/backup2ftp.sh

Puis on l’ajoute au cron :

crontab -e

Copiez-collez :

0 1 * * * /root/backup2ftp.sh 2>/dev/null

A savoir :

Ce script sauvegarde chaque base séparément, donc vous pourrez récupérer vos données plus facilement en cas de pépin qu’avec un dump géant comprenant tout le serveur.