Bash : Script de sauvegarde
On ne le dira jamais assez : FAITES DES SAUVEGARDES!!!!! Ayant un petit serveur dédié sous CentOS, j'ai évidemment appliqué cet adage à moi même. Je vous présente donc un script duquel vous pouvez librement vous inspirer afin de l'adapter à votre environnement. Ce script place quelques répertoires et quelques exports …
On ne le dira jamais assez : FAITES DES SAUVEGARDES!!!!! Ayant un petit serveur dédié sous CentOS, j'ai évidemment appliqué cet adage à moi même. Je vous présente donc un script duquel vous pouvez librement vous inspirer afin de l'adapter à votre environnement. Ce script place quelques répertoires et quelques exports de base de données dans un fichier tar.gz puis envoie ce fichier sur 2 serveurs FTP (ceinture + bretelles) et enfin déplace l'archive dans un répertoire de pydio afin de pouvoir facilement récupérer le fichier sur ma machine personnelle.
#!/bin/bash #Fichier de Backup créé par Alain Devarieux # - créer un fichier tar.gz contenant plusieurs élements de l'arborescence # - Envoie ce fichier tar.gz sur un serveur FTP dédié au backup # - Dépose une copie du fichier tar.gz dans un repertoire local # - Ceinture ET Bretelles : Envoie le fichier tar.gz sur un 2nd serveur FTP logger -t backup "########## Debut de la sauvegarde ##########" # Nom du fichier de Backup backup_file="/sauv/backup-$(hostname)-$(date +%Y-%m-%d).tar.gz" #Variable : Premier Serveur FTP de Backup bckftp01="server01" bckftp01_user="user01" bckftp01_mdp="Enter password here" #Variable : Second Serveur de Backup bckftp02="server02" bckftp02_user="user02" bckftp02_mdp="Enter password here" #Varibales : Dossier de destination du tar.gz en local destdir="/var/www/html/pydio/data/files/" #Liste des dossiers à sauvegarder backup_list="/etc /var/www/html /sauv/sql /sauv/packagelist.txt" #Le dossier a exclure backup_exclude="/var/www/html/pydio/data" #Liste des paquets installés rpm -qa > /sauv/packagelist.txt #Dump des bases SQL #Base01 if ! mysqldump -u userbase01 -pPassword base01 > /sauv/sql/base01.sql; then statusbase01="Warning : Erreur lors de l'export de la base Base01" else statusbase01="Succes de l'export de la base Base01" fi logger -t backup "$statusbase01" #Base02 if ! mysqldump -u userbase02 -pPassword Base02 > /sauv/sql/base02.sql; then statusbase02="Warning : Erreur lors de l'export de la base Base02" else statusbase02="Succes de l'export de la base Base02" fi logger -t backup "$statusbase02" #Creation du tar #On commence par enregistrer la seconde de debut start=$(date '+%s') if ! tar czf $backup_file --exclude=$backup_exclude $backup_list; then statustar="echec de la commande tar" || exit 1 else statustar="Succes creation fichier tar taille=$(stat -c%s $backup_file) duree=$((`date '+%s'` - $start))" fi #On log le resultat logger -t backup "$statustar" #Envoie vers le ftp01 if ! lftp $bckftp01_user:$bckftp01_mdp@$bckftp01 -e "put $backup_file; exit"; then statusftp01="Echec de l'envoie FTP vers $bckftp01" else statusftp01="Succes de l'envoie FTP vers $bckftp01" fi #On log le resultat logger -t backup "$statusftp01" #Envoie vers le ftp02 if ! lftp $bckftp02_user:$bckftp02_mdp@$bckftp02 -e "put $backup_file; exit"; then statusftp02="Echec de l'envoie FTP vers $bckftp02" else statusftp02="Succes de l'envoie FTP vers $bckftp02" fi #On log le resultat logger -t backup "$statusftp02" #Deplacer le fichier dans pydio if ! mv $backup_file $destdir; then statusmv="Warning : Echec du déplacement de $backup_file dans Pydio" else statusmv="Fichier $backup_file déplacé dans Pydio" fi logger -t backup "$statusmv" logger -t backup "########## Fin de la sauvegarde ##########" exit 0
Le script est planifié pour être lancé tous les dimanche à 5h00. J'ai écris un 2nd script qui m'envoie un email avec les logs de la sauvegarde afin que je puisse surveillé que tout c'est bien passé
#!/bin/bash #Envoie d'un mail suite à l'execution du script de sauvegarde datejour=$(LC_ALL="en_EN.UTF-8" date "+%b %d") grep backup /var/log/messages |grep "$datejour" | mail -s "Backup du mois de $(date "+%B")" adresse@email.com adresse2@email.com
Petite explication sur le LC_ALL="en_EN.UTF-8" Lorsque je tape
date "+%b"
J'obtiens la version courte et francisée du mois. Par exemple, pour le mois de juillet, je vais avoir comme retour juil. Hors syslog lui écris dans le fichier /var/log/messages en anglais. Ce qui donne pour le mois de juillet : jul pour july. Pour pouvoir réussir mon grep dans mon fichier de log, j'ai besoin de que la commande date me retourne les informations en anglais également. C'est ce qui explique le positionnement de cette variable en amont.
Ce second script est également placé dans un cron et est lancé a 5h15 tous les dimanches.