If it wasn’t backed-up, then it wasn’t important
Voici un script sympa que j’utilise pour faire des backups de mon système. rien de bien original et j’avoue m’être pas mal inspiré d’exemples divers sur internet. Je crois qu’on ne rappellera jamais la nécessité de réaliser des backups. Un jour ou l’autre, vous pouvez faire une fausse manip, ou tout simplement les disques durs de votre serveur seront morts (même en raid 1 ça arrive !) ou encore votre base de données sera irrémédiablement corrompue. Ce jour là, vous serez plus qu’heureux d’avoir mis en place un système de backup régulier. Mais avant de commencer, quelques pré-requis :
- le rendre exécutable
- installer ncftp:
apt-get install ncftp
sous debian - installer xz:
apt-get install xz-utils
sous debian - renseigner dedans les mots de passe et les paramètres ftp/mysql etc.
Quelques Explications
Mon serveur est hébergé chez OVH qui fourni un espace ftp de backup de 100Go. Bien sûr, vous pouvez tout aussi bien disposer d’un espace nfs ou cifs (en beta chez ovh) auquel cas, vous aurez juste à faire un montage dans l’arborescence du serveur et copier dessus le fichier final.
Ce script est une version simplifiée. Par défaut il va réaliser
- une copie des configs de votre serveur nginx, apache ainsi que de php et mysql
- une copie des répertoires /home et /var/www où sont censé être vos serveurs web
- un dump des bases de données mysql.
Si vous n’avez pas renseigné ces dernières à la ligne 19, il va récupérer leurs noms via un show databases
à la ligne 41 mais c’est un peu crado car il va aussi faire un dump des « information_schema » et « performance schema ».
Normalement, si vous avez un serveur web classique, il devrait réaliser un backup de tout ce qui est vital. Maintenant, vous avez peut-être d’autres applicatifs spécifiques (bind, exim, postfix etc.), rajoutez ce dont vous avez besoin à la ligne 8! Dans le doute, mettez-y le /etc complet.
Crontab
Une fois que vous en êtes satisfait, rajoutez avec la commande suivante une ligne à la fin de votre crontab pour une exécution régulière:
1 | root@serveur:~# echo "30 4 * * * root /root/backup.sh >/dev/null 2>&1" >> /etc/crontab |
Cette ligne exécute le script tous les jours à 4h30. Mais si vous souhaitez un backup toutes les heures remplacez « 30 4 » par « 00 * » mais faites attention à la l’espace libre sur votre serveur ftp. D’autant plus que ce script n’efface pas les anciennes versions.
Pour Information
Je préfère utiliser xz plutôt que gzip car il est plus performant en terme de compression de l’ordre de 30% au prix d’une consommation CPU plus importante.
Les copies de fichiers sont séparées des dumps des bdd mais un dernier tar concatène le tout dans un fichier unique.
Vous retrouverez tous les backups du serveur dans le répertoire backup_xxxxxx sur votre ftp et ils seront sous la forme backup_xxxxxx-2014-04-26-043001.tar, par exemple, où xxxxxx est le nom du serveur. C’est une organisation assez pratique, d’autant plus qu’un simple rm backup_xxxxxx-2014-03*.tar effacera tous les backups du mois de mars 2014.
En cas d’erreur, il enverra un mail à l’adresse spécifiée à la ligne 29 sous réserve qu’un mailer ait été configuré (exim par exemple).
Voilà, il marche très bien sur mon serveur Debian et il m’a déjà sauvé la vie une fois et m’a aussi servi lors de l’upgrade de mon serveur. Ce script est un peu brutal dans le sens où il sauvegarde aussi des données qui ne sont pas utiles, tout mon répertoire WordPress par exemple. Mais rien ne vous empêche d’être plus sélectif mais au risque d’oublier quelque chose… Bien évidemment, le plus sûr est de tester une restauration sur une VM, voir, encore mieux, d’écrire un script de restauration qui pourra réinstaller potentiellement votre serveur en quelques minutes. Dans tous les cas et comme d’habitude, il vient sans aucune garantie de ma part!
Le Script en Bash
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | #!/bin/sh # System + MySQL backup script # --------------------------------------------------------------------- ### System Setup ### HOST="$(echo $HOSTNAME | sed 's/\([.\\.]*\)\..*/\1/g')" DIRS="/home /etc/nginx /etc/apache2 /etc/php5 /etc/mysql /etc/fail2ban /var/www" BACKUP=/tmp/backup.$$ NOW=$(date +"%Y-%m-%d-%H%M%S") XZ="$(which xz)" ### MySQL Setup ### MUSER="root" MPASS="mon-mot-de-passe" MHOST="localhost" MYSQL="$(which mysql)" MYSQLDUMP="$(which mysqldump)" DBS="BDD1 BDD2 BDD3" ### FTP server Setup ### FTPD="/backup_$HOST" FTPU="username-serveur-ftp" FTPP="mon-mot-de-passe-ftp" FTPS="mon-serveur-ftp" NCFTP="$(which ncftpput)" ### Other stuff ### EMAILID="mon-adresse@gmail.com" ### Start Backup for file system ### [ ! -d $BACKUP ] && mkdir -p $BACKUP || : ### Creating a full backup of specified system files ### FILE="fs-full-$NOW.tar.xz" tar -Jcvf $BACKUP/$FILE $DIRS ### Start MySQL Backup ### # Get all databases name if not defined if [ "x$DBS" = "x" ] ; then DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')" ; fi for db in $DBS do FILE=$BACKUP/mysql-$db.$NOW.xz $MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db | $XZ -9 > $FILE done # package a single tar file S_FILE="backup_$HOST-$NOW.tar" cd $BACKUP tar -cvf $BACKUP/$S_FILE *.xz ### Dump backup using FTP ### #Start FTP backup using ncftp ncftp -u"$FTPU" -p"$FTPP" $FTPS<<EOF mkdir $FTPD cd $FTPD lcd $BACKUP mput *.tar quit EOF ### Find out if ftp backup failed or not ### if [ "$?" == "0" ]; then rm -Rf $BACKUP else T=/tmp/backup.fail echo "Date: $(date)">$T echo "Hostname: $(hostname)" >>$T echo "Backup failed" >>$T mail -s "BACKUP FAILED" "$EMAILID" <$T rm -f $T fi |
Une pensée sur “If it wasn’t backed-up, then it wasn’t important”