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.