Sauvegardez et automatiquement vos fichiers ou dossiers, sur linux, c’est extrêmement simple. Avant tout définir sa stratégie de sauvegarde et de définir ce que l’on est prêt à perdre comme données.
Voyons cela.
Définir sa stratégie de sauvegarde
Nous allons prendre un cas concret : Nous avons un serveur “web” à backuper.
Sur ce serveur il y a :
- Des fichiers dans le répertoire racine de wordpress emp.(/var/www/html)
- Des bases de données Mysql
Tous les jours, nous allons créer une sauvegarde sous forme de fichier archive pour la base de données mysql ainsi qu’une archive de nos fichiers qui se trouvent dans </var/www/html>.
Nous envisageons de garder au moins deux fichiers de chaque type de sauvegarde, une ancienne sauvegarde et une ressente, ces fichiers, nous allons les déplacer une un autre serveur, ou tout simplement télécharger localement chez soit sur un ordinateur personnel.
Le script ci-dessous, effectue une sauvegarde journalière du dossier racine de wordpress sans le dossiers uplaods, plus une sauvegarde aussi journalière de la base de données Mysql et il notifie les administrateurs du site par e-mail.
#!/bin/bash #------------------------------------------------------------------------- ## Configuration SRC_CODE="<document_root>" BACKUP_DIR="/home/<user>/Sauvegarde" BACKUP_SQL="wordpress database name" PROJECT_NAME="your donain_name" ULPLODS_DIR="*wp-content/uploads*" ##----------------------------------------------------------------------------- ## Type de sauvegarde, valeur possible: journalière, hebdomadaire ou mensuelle ## par défaut: true ##----------------------------------------------------------------------------- BACKUP_DAILY=true BACKUP_WEEKLY=true BACKUP_MONTHLY=true ##----------------------------------------------------------------------------- ## Nopbre de fichiers archives de sauvegarde à conservé sur localement ## par défaut: 1 ##----------------------------------------------------------------------------- BACKUP_RETENTION_DAILY=1 BACKUP_RETENTION_WEEKLY=1 BACKUP_RETENTION_MONTHLY=1 ##----------------------------------------------------------------------------- ## Type de sauvegarde, valeur possible: journalière, hebdomadaire ou mensuelle ## Options disponibles : 'local-only' | 'remote-only' | 'local-remote' ## Par défaut : local-only ##----------------------------------------------------------------------------- BACKUP_MODE='local-only' ##----------------------------------------------------------------------------- BACKUP_TIME=`date +%T` EXIT_CODE=0 MONTH=`date +%d` DAYWEEK=`date +%u` ##----------------------------------------------------------------------------- ## Calculer le type de sauvegarde selon la date actuelle ##----------------------------------------------------------------------------- if [ "$MONTH" -eq 1 -a "$BACKUP_MONTHLY" == true ]; then FN='monthly' elif [ "$DAYWEEK" -eq 7 -a "$BACKUP_WEEKLY" == true ]; then FN='weekly' elif [ "$DAYWEEK" -lt 7 -a "$BACKUP_DAILY" == true ]; then FN='daily' fi DATE=$FN-`date +"%Y%m%d"` DATEJ=`date +"%d/%m/%Y"` EXIT_CODE=$? function local_only { zip -r $BACKUP_DIR/$PROJECT_NAME-htdocs-$DATE.zip $SRC_CODE -x $ULPLODS_DIR > /dev/null 2>&1 mysqldump -u root --databases $BACKUP_SQL | zip -r > $BACKUP_DIR/$PROJECT_NAME-mysql-$DATE.sql.zip cd $BACKUP_DIR/ ## Supression des anciennes sauvegardes ou mise à jours ls -t | grep $PROJECT_NAME | grep htdocs | grep daily | sed -e 1,"$BACKUP_RETENTION_DAILY"d | xargs -d '\n' rm -R > /dev/null 2>&1 ls -t | grep $PROJECT_NAME | grep htdocs | grep weekly | sed -e 1,"$BACKUP_RETENTION_WEEKLY"d | xargs -d '\n' rm -R > /dev/null 2>&1 ls -t | grep $PROJECT_NAME | grep htdocs | grep monthly | sed -e 1,"$BACKUP_RETENTION_MONTHLY"d | xargs -d '\n' rm -R > /dev/null 2>&1 ls -t | grep $PROJECT_NAME | grep mysql | grep daily | sed -e 1,"$BACKUP_RETENTION_DAILY"d | xargs -d '\n' rm -R > /dev/null 2>&1 ls -t | grep $PROJECT_NAME | grep mysql | grep weekly | sed -e 1,"$BACKUP_RETENTION_WEEKLY"d | xargs -d '\n' rm -R > /dev/null 2>&1 ls -t | grep$PROJECT_NAME | grep mysql | grep monthly | sed -e 1,"$BACKUP_RETENTION_MONTHLY"d | xargs -d '\n' rm -R > /dev/null 2>&1 } local_only ## Calcule de la taile des fichiers FILESIZE0=$(stat -c%s $BACKUP_DIR/$PROJECT_NAME-htdocs-$DATE.zip) FILESIZE1=$(stat -c%s $BACKUP_DIR/$PROJECT_NAME-mysql-$DATE.sql.zip) ##----------------------------------------------------------------------------- ## Notification par email destinée auà l'administrateur du site ## SUCCES : Envoyer l'email en utilisant la commande mail ##----------------------------------------------------------------------------- if [ "$EXIT_CODE" -eq 0 ]; then # Création du message : text/html from="wordpress<ne-pas-repondre@domain.com>" to="admin@domaine.com>" subject="Notification de sauvegarde du $DATEJ à $BACKUP_TIME" body="<p>Bonjour, Admin <br> Le système vient de d'effectuer une sauvegarde, complette de votre site <b>$PROJECT_NAME</b>.<br> Trouvrez ci-dessous 2 archives (Zip), disponibles en téléchargement.<br> Les fichiers archives de la sauvegarde se trouvent dans: $BACKUP_DIR </p> <h3>Sauvegarde du $DATEJ à $BACKUP_TIME </h3> <ul> <li>Site webs: $PROJECT_NAME-htdocs-$DATE.zip> , <span style='color:red'> `expr $FILESIZE0 / 1000` Ko, </span></li> <li>Base de données: $PROJECT_NAME-mysql-$DATE.sql.zip , <span style='color:red'> `expr $FILESIZE1 / 1000` Ko</span></li> </ul>" echo $body | mail -a "Content-Type: text/html" -s "$subject" -r "$from" "$to" else ##----------------------------------------------------------------------------- ## ERREUR : Envoyer l'email en utilisant la commande mail ##----------------------------------------------------------------------------- from="wordpress<ne-pas-repondre@domain.com>" to="admin@domaine.com>" subject="Notification d'erreur" errormessage="<p>Bonjour, Admin <br> Une erreur est survenue pendant la sauvegarde automatique de votre site. <br> Consulter les fichiers logs, pour plus de détails. <br> La procédure s'est arrêter avec le code : ${EXIT_CODE} </p>" echo $errormessage | mail -a "Content-Type: text/html" -s "$subject" -r "$from" "$to" fi exit $exit_code
Pour assurer l’exécution quotidiennement, copier le script dans le dossier </etc/cron.daily>, et rendez le exécutable :
chmod -x /etc/cron.daily/<notre-script.sh>
Merci de votez pour cet article :