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 # exp: DocumentRoot = '/srv/www/public_html' # ------------------------------------------ SRC_CODE="<documentroot>" 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
Merci de votez pour cet article :