Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Script de sauvegarde journalier & mensuel pour Redmine (Fichiers + Base de données)
#! /bin/bash
# sudo sh backup_redmine.sh
# Last version by Zer00CooL - www.visionduweb.fr
# Modified by ronan@lespolypodes.com
# Inspiration: https://gist.github.com/gabrielkfr/6432185
# Distribué sous les termes de la licence MIT.
## Premier stockage en local.
## Créer une seule fois les dossiers qui vont stocker les sauvegardes en local.
# mkdir -p $HOME/backup/fichiers/redmine
# mkdir -p $HOME/backup/sql/redmine
# sudo chmod -R 640 $HOME/backup/
## Deuxième stockage en local pour la synchronisation avec DropBox. (Facultatif !)
## Créer une seule fois les dossiers qui vont permettre la synchronisation avec DropBox.
# mkdir -p $HOME/Dropbox/backup/fichiers/redmine
# mkdir -p $HOME/Dropbox/backup/sql/redmine
# sudo chmod -R 640 $HOME/Dropbox/
#############################################################
# Etape 1 - Sauvegarder la base de données MySQL de Redmine #
#############################################################
REDMINE_BDD_NOM=........................................................................
REDMINE_BDD_UTILISATEUR=................................................................
REDMINE_BDD_UTILISATEUR_PASSWORD=.......................................................
REPERTOIRE_UTILISATEUR=......................................................./home/utilisateur
REDMINE_REPERTOIRE_BACKUP_SQL=$REPERTOIRE_UTILISATEUR/backup/sql/redmine/
REDMINE_REPERTOIRE_DROPBOX_SQL=$REPERTOIRE_UTILISATEUR/Dropbox/backup/sql/redmine/
DATE_FR=$(date +%d-%m-%y_%Hh)
REDMINE_NOM_SAUVEGARDE_FICHIER_EXTENSION_SQL=sauvegarde_sql_redmine_$DATE_FR.sql
PASSWORD_ARCHIVE_CHIFFREE=...............................................................
echo "Sauvegarder la base de données MySQL de Redmine :"
mysqldump --single-transaction -h localhost --user=$REDMINE_BDD_UTILISATEUR --password=$REDMINE_BDD_UTILISATEUR_PASSWORD $REDMINE_BDD_NOM > "${REDMINE_REPERTOIRE_BACKUP_SQL}${REDMINE_NOM_SAUVEGARDE_FICHIER_EXTENSION_SQL}"
echo "La sauvegarde de la base de données est réalisée dans le dossier backup."
# Chiffrer la base de données.
# Attention un mot de passe complexe consomme d'avantage de ressources système, pouvant faire planter le script.
# Attention à l'heure de création de la base de données pour ne pas bloquer la sauvegarde si le fichier est mal nommé.
cd $REDMINE_REPERTOIRE_BACKUP_SQL
7z a -t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on -mhe=on -p$PASSWORD_ARCHIVE_CHIFFREE $REDMINE_NOM_SAUVEGARDE_FICHIER_EXTENSION_SQL.7z $REDMINE_NOM_SAUVEGARDE_FICHIER_EXTENSION_SQL
# Télécharger la sauvegarde manuellement pour la tester en la plaçant à la racine du site.
# La décompression fonctionne, les chmod seront à modifier pour pouvoir lire le contenu de l'archive.
echo "Le chiffrement de la base de données est réalisé."
# Décompresser l'archive.
# 7z x archive.7z
# Supprimer l'archive non chiffrée devenue inutile du dossier de backup.
rm $REDMINE_NOM_SAUVEGARDE_FICHIER_EXTENSION_SQL
echo "La sauvegarde non chiffrée de la base de données a été supprimée."
# Copier l'archive chiffrée de la base de données du dossier backup redmine vers Dropbox en local.
cp ${REDMINE_REPERTOIRE_BACKUP_SQL}${REDMINE_NOM_SAUVEGARDE_FICHIER_EXTENSION_SQL}.7z ${REDMINE_REPERTOIRE_DROPBOX_SQL}${REDMINE_NOM_SAUVEGARDE_FICHIER_EXTENSION_SQL}.7z
echo "La sauvegarde chiffrée a été copiée vers le dossier DropBox en local."
#################################################
# Etape 2 - Sauvegarder les fichiers de Redmine #
#################################################
REPERTOIRE_PROGRAMME_REDMINE=................................./path/redmine
REDMINE_REPERTOIRE_BACKUP_FICHIERS=$REPERTOIRE_UTILISATEUR/backup/fichiers/redmine/
REDMINE_REPERTOIRE_DROPBOX_FICHIERS=$REPERTOIRE_UTILISATEUR/Dropbox/backup/fichiers/redmine/
REDMINE_NOM_SAUVEGARDE_FICHIERS_EXTENSION_TAR_GZ=sauvegarde_fichiers_redmine_$DATE_FR.tar.gz
RED_FICHIERS_CONF1=$REPERTOIRE_PROGRAMME_REDMINE/config/configuration.yml
RED_FICHIERS_CONF2=$REPERTOIRE_PROGRAMME_REDMINE/config/database.yml
RED_FICHIERS_CONF3=$REPERTOIRE_PROGRAMME_REDMINE/config/settings.yml
RED_FICHIERS_CONF4=$REPERTOIRE_PROGRAMME_REDMINE/public/stylesheets/application.css
RED_FICHIERS_CONF5=$REPERTOIRE_PROGRAMME_REDMINE/public/favicon.ico
RED_FICHIERS_FILES=$REPERTOIRE_PROGRAMME_REDMINE/files/
RED_FICHIERS_THEME=$REPERTOIRE_PROGRAMME_REDMINE/public/themes/
RED_FICHIERS_PLUGINS=$REPERTOIRE_PROGRAMME_REDMINE/plugins/
# Sauvegarde journalière des fichiers importants de Redmine.
echo "Sauvegarde journalière de tous les fichiers de Redmine."
tar zcvf $REDMINE_REPERTOIRE_BACKUP_FICHIERS/$REDMINE_NOM_SAUVEGARDE_FICHIERS_EXTENSION_TAR_GZ $RED_FICHIERS_CONF1 $RED_FICHIERS_CONF2 $RED_FICHIERS_CONF3 $RED_FICHIERS_CONF4 $RED_FICHIERS_CONF5 $RED_FICHIERS_FILES $RED_FICHIERS_THEME $RED_FICHIERS_PLUGINS
echo "La sauvegarde journalière des fichiers importants de Redmine a été réalisée dans le dossier backup."
# Chiffrer l'archive contenant les fichiers.
# Attention un mot de passe complexe consomme d'avantage de ressources système, pouvant faire planter le script.
# Attention à l'heure de création de la base de données pour ne pas bloquer la sauvegarde si le fichier est mal nommé.
cd $REDMINE_REPERTOIRE_BACKUP_FICHIERS
7z a -t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on -mhe=on -p$PASSWORD_ARCHIVE_CHIFFREE $REDMINE_NOM_SAUVEGARDE_FICHIERS_EXTENSION_TAR_GZ.7z $REDMINE_NOM_SAUVEGARDE_FICHIERS_EXTENSION_TAR_GZ
# Télécharger la sauvegarde manuellement pour la tester en la plaçant à la racine du site.
# La décompression fonctionne, les chmod seront à modifier pour pouvoir lire le contenu de l'archive.
echo "Le chiffrement des fichiers est réalisé."
# Décompresser l'archive chiffrée.
# 7z x archive.7z
# Décompresser l'archive compressée.
# tar xzvf fichier.tar.gz
# Supprimer l'archive non chiffrée devenue inutile du dossier de backup.
rm $REDMINE_NOM_SAUVEGARDE_FICHIERS_EXTENSION_TAR_GZ
echo "La sauvegarde non chiffrée des fichiers a été supprimée."
# Copier l'archive chiffrée des fichiers du dossier backup redmine vers Dropbox en local.
cp ${REDMINE_REPERTOIRE_BACKUP_FICHIERS}${REDMINE_NOM_SAUVEGARDE_FICHIERS_EXTENSION_TAR_GZ}.7z ${REDMINE_REPERTOIRE_DROPBOX_FICHIERS}${REDMINE_NOM_SAUVEGARDE_FICHIERS_EXTENSION_TAR_GZ}.7z
echo "La sauvegarde chiffrée a été copiée vers le dossier DropBox en local."
##############################################################################
# Etape 3 - Sauvegarder les fichiers de Redmine totalement une fois par mois #
##############################################################################
REDMINE_NOM_SAUVEGARDE_MENSUELLE_FICHIERS_EXTENSION_TAR_GZ=sauvegarde_mensuelle_fichiers_redmine_$DATE_FR.tar.gz
# Sauvegarde mensuelle de tous les fichiers de Redmine.
TOMORROW=`date --date=tomorrow +%d`
# Si demain est le jour 2 du mois, nous sommes le 1er du mois.
if [ $TOMORROW -eq "2" ]; then
echo "Début du mois : Sauvegarde mensuelle."
tar zcvf $REDMINE_REPERTOIRE_BACKUP_FICHIERS/$REDMINE_NOM_SAUVEGARDE_MENSUELLE_FICHIERS_EXTENSION_TAR_GZ $REPERTOIRE_PROGRAMME_REDMINE
echo "La sauvegarde mensuelle des fichiers de Redmine a été réalisée."
# Chiffrer l'archive contenant la sauvegarde de fichiers mensuelle.
# Attention un mot de passe complexe consomme d'avantage de ressources système, pouvant faire planter le script.
# Attention à l'heure de création de la base de données pour ne pas bloquer la sauvegarde si le fichier est mal nommé.
cd $REDMINE_REPERTOIRE_BACKUP_FICHIERS
7z a -t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on -mhe=on -p$PASSWORD_ARCHIVE_CHIFFREE $REDMINE_NOM_SAUVEGARDE_MENSUELLE_FICHIERS_EXTENSION_TAR_GZ.7z $REDMINE_NOM_SAUVEGARDE_MENSUELLE_FICHIERS_EXTENSION_TAR_GZ
# Télécharger la sauvegarde manuellement pour la tester en la plaçant à la racine du site.
# La décompression fonctionne, les chmod seront à modifier pour pouvoir lire le contenu de l'archive.
echo "Le chiffrement de la sauvegarde mensuelle des fichiers est réalisé."
# Décompresser l'archive chiffrée.
# 7z x archive.7z
# Décompresser l'archive compressée.
# tar xzvf fichier.tar.gz
# Supprimer l'archive mensuelle non chiffrée devenue inutile du dossier de backup.
# Attention ! Si elle n'existe pas, une erreur est affichée :
# rm: impossible de supprimer 'sauvegarde_mensuelle_fichiers_redmine_vdw_05-04-19_05h.tar.gz': Aucun fichier ou dossier de ce type
rm $REDMINE_NOM_SAUVEGARDE_MENSUELLE_FICHIERS_EXTENSION_TAR_GZ
echo "La sauvegarde mensuelle non chiffrée des fichiers a été supprimée."
# Copier l'archive mensuelle chiffrée des fichiers du dossier backup redmine vers Dropbox en local.
cp ${REDMINE_REPERTOIRE_BACKUP_FICHIERS}${REDMINE_NOM_SAUVEGARDE_MENSUELLE_FICHIERS_EXTENSION_TAR_GZ}.7z ${REDMINE_REPERTOIRE_DROPBOX_FICHIERS}${REDMINE_NOM_SAUVEGARDE_MENSUELLE_FICHIERS_EXTENSION_TAR_GZ}.7z
echo "La sauvegarde mensuelle chiffrée a été copiée vers le dossier DropBox en local."
fi
##############################################
# Etape 4 - Purger les sauvegardes dépassées #
##############################################
REDMINE_BACKUP_JOUR_LIVE_TIME=5
REDMINE_BACKUP_MOIS_LIVE_TIME=70
MODEL_DELETE_BKP_SQL_JOUR=sauvegarde_*_redmine_*.sql.7z
MODEL_DELETE_BKP_FILE_JOUR=sauvegarde_*_redmine_*.tar.gz.7z
MODEL_DELETE_BKP_FILE_MOIS=sauvegarde_mensuelle_*_redmine_*.tar.gz.7z
# Purger les sauvegardes dépassées.
echo "Purger les sauvegardes dépassées dans le dossier backup."
find ${REDMINE_REPERTOIRE_BACKUP_SQL}${MODEL_DELETE_BKP_SQL_JOUR} -mtime +$REDMINE_BACKUP_JOUR_LIVE_TIME -exec rm {} \;
find ${REDMINE_REPERTOIRE_BACKUP_FICHIERS}${MODEL_DELETE_BKP_FILE_JOUR} -mtime +$REDMINE_BACKUP_JOUR_LIVE_TIME -exec rm {} \;
find ${REDMINE_REPERTOIRE_BACKUP_FICHIERS}${MODEL_DELETE_BKP_FILE_MOIS} -mtime +$REDMINE_BACKUP_MOIS_LIVE_TIME -exec rm {} \;
echo "Purger les sauvegardes dépassées dans le dossier DropBox local."
find ${REDMINE_REPERTOIRE_DROPBOX_SQL}${MODEL_DELETE_BKP_SQL_JOUR} -mtime +$REDMINE_BACKUP_JOUR_LIVE_TIME -exec rm {} \;
find ${REDMINE_REPERTOIRE_DROPBOX_FICHIERS}${MODEL_DELETE_BKP_FILE_JOUR} -mtime +$REDMINE_BACKUP_JOUR_LIVE_TIME -exec rm {} \;
find ${REDMINE_REPERTOIRE_DROPBOX_FICHIERS}${MODEL_DELETE_BKP_FILE_MOIS} -mtime +$REDMINE_BACKUP_MOIS_LIVE_TIME -exec rm {} \;
##################################################################################
# Permettre la synchronisation avec un chmod 755 sur le dossier Dropbox en local #
##################################################################################
# Une fois les fichiers sauvegardés et chiffrés on peut autoriser la synchronisation avecDropBox.
# Donner le droit 755 pour permettre la synchronisation avec le cloud Dropbox.
chmod -R 755 ${REPERTOIRE_UTILISATEUR}/Dropbox/
# Le temps de connexion (sleep) est définit dans le script de connexion Dropbox. (3 minutes actuellement. Suffit pour déposer Redmine à distance.)
# chmod 640 à la fin du script de connexion Dropbox pour retirer les droits et restreindre l'accès au dossier Dropbox local.
# END !
#####################################################
#####################################################
#####################################################
#####################################################
# Ajouter ce script dans le dossier de maintenance. #
#####################################################
# sudo bash
# cd ${REPERTOIRE_UTILISATEUR}/maintenance/
# nano sauvegarde_redmine.sh
#
# Rappel facultatif.
# Lancer le script manuellement.
# sudo sh maintenance/sauvegarde_redmine.sh
#####################################################
#####################################################
#####################################################
##########################################
# Lancer le script depuis /usr/local/bin #
##########################################
# Créer un nouveau script dans le dossier /usr/local/bin.
cd /usr/local/bin
sudo nano Automatisation-sauvegarde-redmine-cron.sh
# Ajouter le code suivant :
#!/bin/bash
# Effectuer la sauvegarde dans le dossier Backup et Dropbox puis synchroniser vers Dropbox.
sudo sh /home/debian/maintenance/sauvegarde_redmine.sh
# La connexion Dropbox doit se lancer sans être sudo.
sh /usr/local/bin/Demarrer-Arreter-Dropbox.sh
# Lancer le script pour effectuer la sauvegarde :
# sh /usr/local/bin/Automatisation-sauvegarde-redmine-cron.sh
################################################################
# Rappel facultatif : Démarrer et arrêter DropBox manuellement #
################################################################
# cd /usr/local/bin
# La connexion Dropbox doit se lancer sans être sudo.
# sh Demarrer-Arreter-Dropbox.sh
# Notes pour une connexion à Dropbox : https://www.visionduweb.eu/wiki/index.php?title=Sauvegarder_et_reinstaller_Linux#Connecter_son_serveur_.C3.A0_Dropbox
#####################################################
#####################################################
#####################################################
########
# Cron #
########
# Le script doit être rendu exécutable pour une automatisation avec cron.
sudo chmod +x /usr/local/bin/Automatisation-sauvegarde-redmine-cron.sh
# Ajouter une tâche cron
crontab -e
# Sauvegarder Redmine - Tous les jours à 5h25 du matin.
25 5 * * * /usr/local/bin/Automatisation-sauvegarde-redmine-cron.sh >> /var/log/cron-dropbox.log 2>&1
# Vérifier la présence d'un fichier de journalisation des logs.
# cd /var/log/
# Créer le fichier si il n'existe pas déjà.
# sudo touch /var/log/cron-dropbox.log
# Le propriétaire et le groupe du fichier cron-dropbox.log ont été changés pour l'utilisateur courant du système linux.
# sudo chown utilisateur:utilisateur /var/log/cron-dropbox.log
@ZerooCool

This comment has been minimized.

Copy link
Owner Author

@ZerooCool ZerooCool commented Apr 30, 2020

J'avais tenté d'utiliser le chiffrement aes comme proposé ici, depuis un serveur debian, mais, il m'était alors impossible de décompresser l'archive depuis Linux Mint : https://ubuntuplace.info/questions/45715/7z-ligne-de-commande-avec-le-cryptage-le-plus-eleve-aes-256

On note dans le tutoriel que 7z n'est pas recommandé pour une sauvegarde Linux, puisqu'il ne conserverait pas les droits sur les fichiers !

Noter également la présence des accès de la base de données, ce qui n'est pas sécuritaire.
Voir à sauvegarder autrement les bases de données. (auto-mysqldump ?)

On peut envisager la création d'un fichier de log, pour confirmer les actions réalisées par la sauvegarde !

On peut envisager de dupliquer la sauvegarde vers un autre serveur, avec lftp sftp://
On peut envisager de dupliquer la sauvegarde vers un autre serveur, avec rsync pour sauvegarder uniquement les modifications !

Notes complémentaires pour améliorer le script :
https://github.com/Mettmett/debian-backup-wp
https://techarea.fr/lsci-8-sauvegarder-son-serveur-web/
https://ludovicscribe.fr/blog/script-bash-sauvegarde-site-web
https://www.memoinfo.fr/tutoriels-linux/script-sauvegarde-linux/
https://www.it-connect.fr/script-sauvegarde-des-bases-de-donnees-sous-linux/
https://openclassrooms.com/fr/courses/213631-le-multiboot-sous-gnu-linux/212934-pratique-la-sauvegarde-en-ligne-de-commande
https://wiki.debian-fr.xyz/Sauvegarder_sa_Debian_en_vue_d%27une_R%C3%A9installation_ou_Reconstruction_-_Racine_et_Home_s%C3%A9par%C3%A9s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.