Vous êtes ici : » Accueil» Linux » bash : Script de sauvegarde automatique d’un site web

bash : Script de sauvegarde automatique d’un site web

Cette page a pour but de proposer un script BASH qui permet de sauvegarder des données.

Ce script effectue plusieurs opérations :

  • les données sont sauvegardées dans un répertoire défini par l’utilisateur
  • les bases sql est également sauvegardées (dump) dans un archive gzip (tar.bz2)
  • les données du répertoire de sauvegarde sont compressées dans une archive gzip (tar.bz2)
  • les deux dernières archives mensuelles et quotidiennes sont conservées, les plus anciennes sont supprimées
  • la dernière archive est exportée sur une autre machine distante (Ordinateur personnel à domicile)
  • un e-mail de notification est envoyé à l’administrateur, chaque fois où le script effectu une savegarde


Voici le script qui permet de faire cela. Le texte en gras est à modifier suivant vos propres paramètres.



#!/bin/bash

## Note
# Remote delete use SSH Command
## ------------------------------------------------------------------------------
## Configuration: 
## liste des paramètres:
## USER : Utlisateur priviligié dans la base de données mysql ou mariaDB engénéral = root
## PASS : Mot de passe mysql ou mariaDB
## DBNAME : Nom de la base de données mysql ou mariaDB
## SRC_CODE : Répertoire source en général il s'agis du dossier racine de wordpress
## BACKUP_DIR : Répertoire local pour la distination des sauvegardes
## PROJECT_NAME : Nom du projet en général c'est le titre du siteweb ou le nom de domaine
## DST_HOST : chaine de connection pour ssh distant, exp: utilisateur@serveur 
## REMOTE_DST_DIR : Dossier distant pour le stockage des sauvegardes
## BACKUP_DAILY : la valeur par defaut de ce paramètre est (true) 
## BACKUP_WEEKLY : la valeur par defaut de ce paramètre est (true) 
## BACKUP_MONTHLY : la valeur par defaut de ce paramètre est (true)
## BACKUP_RETENTION_DAILY : Nombre de fichiers des derniers sauvegardes journalières à garder sur le disque, = 3
## BACKUP_RETENTION_WEEKLY : Nombre de fichiers des derniers sauvegardes journalières à garder sur le disque, = 3 
## BACKUP_RETENTION_MONTHLY : Nombre de fichiers des derniers sauvegardes journalières à garder sur le disque, = 3 
## BACKUP_MODE : Type de sauvegarde journalière ou hébdomadire ou mensuelle, la valeur par deaut est journalière
## NOTE_BODY : text du corps du message de notification à envoyer à l'administrateur
## SUBJECT : text du sujet de la notification administrative
## TO : adresse email de l'administrateur
## FROM : adresse email de l'expiditeur de la notification administrative
## MONTH : mois en cours
## DAYWEEK : jour de la semaine courante
## ------------------------------------------------------------------------------
USER=root
PASS="MotDePasse_SQL"
DBNAME=BaseDeDonnées
SRC_CODE="/var/www/html"
BACKUP_DIR="/home/utlisateur/backup"
PROJECT_NAME="NomDuProjet"
DST_HOST="utilisateur@host"
REMOTE_DST_DIR="/root/backup"
BACKUP_DAILY=true # if set to false backup will not work
BACKUP_WEEKLY=true # if set to false backup will not work
BACKUP_MONTHLY=true # if set to false backup will not work
BACKUP_RETENTION_DAILY=3
BACKUP_RETENTION_WEEKLY=3
BACKUP_RETENTION_MONTHLY=3
BACKUP_MODE='local-only' # Available option ( 'local-only' | 'remote-only' | 'local-remote' )
NOTE_BODY="Bonjour, Admin \n
Une sauvegarde comptelte de votre site web vient d'être effectuée avec succès \n"
SUBJECT="Sauvegarde du siteweb $PROJECT_NAME"
TO="emailDeAdmin@serveur.com"
FROM="no-replay@serveur.com"
MONTH=`date +%d`
DAYWEEK=`date +%u`

## ------------------------------------------------------------------------------
## Définition du mois en cours et de la date et du jour de la semaine en cours
## ------------------------------------------------------------------------------

if [[ ( $MONTH -eq 1 ) && ( $BACKUP_MONTHLY == true ) ]]; then
FN='monthly'
elif [[ ( $DAYWEEK -eq 7 ) && ( $BACKUP_WEEKLY == true ) ]]; then
FN='weekly'
elif [[ ( $DAYWEEK -lt 7 ) && ( $BACKUP_DAILY == true ) ]]; then
FN='daily'
fi

DATE=$FN-`date +"%Y%m%d"`
## ------------------------------------------------------------------------------
## sauvegarde : de locale vers staockage distant
## ------------------------------------------------------------------------------
function local_remote
{
## Sauvegarder des dossiers et dichiers de WordPress
zip -r $BACKUP_DIR/$PROJECT_NAME-htdocs-$DATE.zip $SRC_CODE -x *wp-content/uploads*

cd $BACKUP_DIR/
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

## Sauvegarde de la base de données WordPress
mysqldump -u$USER $DBNAME | gzip > $BACKUP_DIR/-$DBNAME-mysql-$DATE.sql.gz

cd $BACKUP_DIR/
ls -t | grep $DBNAME | grep mysql | grep daily | sed -e 1,"$BACKUP_RETENTION_DAILY"d | xargs -d '\n' rm -R > /dev/null 2>&1
ls -t | grep $DBNAME | grep mysql | grep weekly | sed -e 1,"$BACKUP_RETENTION_WEEKLY"d | xargs -d '\n' rm -R > /dev/null 2>&1
ls -t | grep $DBNAME | grep mysql | grep monthly | sed -e 1,"$BACKUP_RETENTION_MONTHLY"d | xargs -d '\n' rm -R > /dev/null 2>&1

## syncroniser les sauvegardes en tre local et distant
rsync -avh --delete $BACKUP_DIR/ $DST_HOST:$REMOTE_DST_DIR
}

## ------------------------------------------------------------------------------
## Sauvegarder localement, source et distination dans le même ordinateur
## ------------------------------------------------------------------------------

function local_only
{
zip -r $BACKUP_DIR/$PROJECT_NAME-htdocs-$DATE.zip $SRC_CODE -x *wp-content/uploads*

cd $BACKUP_DIR/
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

mysqldump -u$USER $DBNAME | gzip > $BACKUP_DIR/$DBNAME-mysql-$DATE.sql.gz

cd $BACKUP_DIR/
ls -t | grep $DBNAME | grep mysql | grep daily | sed -e 1,"$BACKUP_RETENTION_DAILY"d | xargs -d '\n' rm -R > /dev/null 2>&1
ls -t | grep $DBNAME | grep mysql | grep weekly | sed -e 1,"$BACKUP_RETENTION_WEEKLY"d | xargs -d '\n' rm -R > /dev/null 2>&1
ls -t | grep $DBNAME | grep mysql | grep monthly | sed -e 1,"$BACKUP_RETENTION_MONTHLY"d | xargs -d '\n' rm -R > /dev/null 2>&1 
}

function remote_only
{
zip -r $BACKUP_DIR/$PROJECT_NAME-htdocs-$DATE.zip $SRC_CODE -x *wp-content/uploads*
mysqldump -u$USER -p$PASS $DBNAME | gzip > $BACKUP_DIR/$DBNAME-sql-$DATE.sql.gz

rsync -avh --remove-source-files $BACKUP_DIR/ $DST_HOST:$REMOTE_DST_DIR

ssh -t -t $DST_HOST "cd $REMOTE_DST_DIR ; 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"
ssh -t -t $DST_HOST "cd $REMOTE_DST_DIR ; 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"
ssh -t -t $DST_HOST "cd $REMOTE_DST_DIR ; 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"
}

if [ $BACKUP_MODE == local-remote ]; then
if [[ ( $BACKUP_DAILY == true ) && ( ! -z "$BACKUP_RETENTION_DAILY" ) && ( $BACKUP_RETENTION_DAILY -ne 0 ) && ( $FN == daily ) ]]; then
local_remote
fi
if [[ ( $BACKUP_WEEKLY == true ) && ( ! -z "$BACKUP_RETENTION_WEEKLY" ) && ( $BACKUP_RETENTION_WEEKLY -ne 0 ) && ( $FN == weekly ) ]]; then
local_remote
fi
if [[ ( $BACKUP_MONTHLY == true ) && ( ! -z "$BACKUP_RETENTION_MONTHLY" ) && ( $BACKUP_RETENTION_MONTHLY -ne 0 ) && ( $FN == monthly ) ]]; then
local_remote
fi
elif [ $BACKUP_MODE == local-only ]; then
if [[ ( $BACKUP_DAILY == true ) && ( ! -z "$BACKUP_RETENTION_DAILY" ) && ( $BACKUP_RETENTION_DAILY -ne 0 ) && ( $FN == daily ) ]]; then
local_only
fi
if [[ ( $BACKUP_WEEKLY == true ) && ( ! -z "$BACKUP_RETENTION_WEEKLY" ) && ( $BACKUP_RETENTION_WEEKLY -ne 0 ) && ( $FN == weekly ) ]]; then
local_only
fi
if [[ ( $BACKUP_MONTHLY == true ) && ( ! -z "$BACKUP_RETENTION_MONTHLY" ) && ( $BACKUP_RETENTION_MONTHLY -ne 0 ) && ( $FN == monthly ) ]]; then
local_only
fi
elif [ $BACKUP_MODE == remote-only ]; then
if [[ ( $BACKUP_DAILY == true ) && ( ! -z "$BACKUP_RETENTION_DAILY" ) && ( $BACKUP_RETENTION_DAILY -ne 0 ) && ( $FN == daily ) ]]; then
remote_only
fi
if [[ ( $BACKUP_WEEKLY == true ) && ( ! -z "$BACKUP_RETENTION_WEEKLY" ) && ( $BACKUP_RETENTION_WEEKLY -ne 0 ) && ( $FN == weekly ) ]]; then
remote_only
fi
if [[ ( $BACKUP_MONTHLY == true ) && ( ! -z "$BACKUP_RETENTION_MONTHLY" ) && ( $BACKUP_RETENTION_MONTHLY -ne 0 ) && ( $FN == monthly ) ]]; then
remote_only
fi
fi

## ------------------------------------------------------------------------------
## Notifier l'Administrateur
## ------------------------------------------------------------------------------

echo -e $NOTE_BODY | mail -s "$SUJECT" -r "$FROM" "$TO"

exit
Translate »
 
Laisser un commentaire
Votre commentaire
Avez-vous des commentaires supplémentaires?
Suivant
Entrez votre e-mail si vous souhaitez que nous vous contactions au sujet de vos commentaires.
Retour
Envoyer
Merci d'avoir envoyé vos commentaires!
%d blogueurs aiment cette page :