Skip to content

Instantly share code, notes, and snippets.

@ZerooCool
Forked from ronanguilloux/script-bash-redmine-backups
Last active February 15, 2021 09:42
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ZerooCool/b06925403f94960e32c3c52f2db81b01 to your computer and use it in GitHub Desktop.
Save ZerooCool/b06925403f94960e32c3c52f2db81b01 to your computer and use it in GitHub Desktop.
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
Copy link
Author

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