🔴 redmine-backup
Script Bash professionnel de sauvegarde et restauration complète de Redmine — base de données, fichiers, configuration, plugins — avec menu interactif et planification cron intégrée.
✨ Fonctionnalités
| Fonctionnalité | Détail |
|---|---|
| 💾 Sauvegarde complète | DB + fichiers + config + plugins en une seule archive .tar.gz |
| 🔄 Restauration interactive | Menu de sélection avec 4 modes de restauration |
| 🗄️ Multi-base de données | PostgreSQL, MySQL/MariaDB, SQLite3 — auto-détection via database.yml |
| ⏰ Planification cron | Intégration cron avec fréquences prédéfinies ou expression personnalisée |
| 📋 Manifest d'archive | Version Redmine, plugins, gems, infos système archivés à chaque backup |
| 🔁 Rotation automatique | Conservation configurable des N dernières archives |
| 📧 Notifications email | MAILTO configurable pour les exécutions cron |
| 🛡️ Sécurité | set -euo pipefail, nettoyage automatique des fichiers temporaires |
| 📝 Journal | Logging horodaté dans /var/log/redmine-backup.log |
📋 Prérequis
- OS : Debian / Ubuntu / RHEL / CentOS
- Bash ≥ 4.0
- Droits : root (sudo)
- Commandes requises :
tar,gzip,awk,find,stat - Selon votre base de données :
- PostgreSQL →
pg_dump,pg_restore,psql - MySQL/MariaDB →
mysqldump,mysql - SQLite3 →
sqlite3
- PostgreSQL →
🚀 Installation
# Cloner le dépôt
git clone https://git.h3campus.fr/Johnny/Redmine.git /opt/scripts/redmine-backup
cd /opt/scripts/redmine-backup
# Rendre le script exécutable
chmod +x redmine-backup.sh
# Copier et configurer le fichier .env
cp .env.example .env
nano .env
⚙️ Configuration — fichier .env
# Répertoire racine de l'installation Redmine (obligatoire)
REDMINE_ROOT=/opt/redmine/redmine
# Dossier de stockage des archives de sauvegarde
BACKUP_DIR=/opt/Backups
# Environnement Rails (doit correspondre à une section dans database.yml)
RAILS_ENV=production
# Chemin personnalisé vers database.yml (optionnel, auto-détecté par défaut)
# DB_CONFIG=/usr/share/redmine/config/database.yml
# Forcer l'adaptateur de base de données (optionnel)
# Valeurs possibles : postgresql | mysql2 | sqlite3
# DB_TYPE=postgresql
# Nombre d'archives à conserver (les plus anciennes sont supprimées)
KEEP_BACKUPS=7
# Inclure le dossier log/ de Redmine dans la sauvegarde (true | false)
INCLUDE_LOG=false
📖 Utilisation
Menu interactif (recommandé)
sudo ./redmine-backup.sh
[1] Créer une sauvegarde — Sauvegarde complète (DB + fichiers + config)
[2] Restaurer — Menu interactif de restauration
[3] Lister les sauvegardes — Voir les archives disponibles
[4] Planification Cron — Gérer les sauvegardes automatiques
[5] Afficher l'aide — Documentation complète
[0] Quitter
Commandes directes
# Lancer une sauvegarde
sudo ./redmine-backup.sh backup
# Ouvrir le menu de restauration
sudo ./redmine-backup.sh restore
# Lister les archives disponibles
sudo ./redmine-backup.sh list
# Gérer la planification cron
sudo ./redmine-backup.sh cron
# Afficher l'aide
sudo ./redmine-backup.sh help
💾 Contenu d'une archive de sauvegarde
Chaque archive redmine_backup_YYYYMMDD_HHMMSS.tar.gz contient :
redmine_backup_20260227_020000.tar.gz
├── database.sql ← dump complet de la base de données
├── manifest.txt ← version Redmine, plugins, gems, infos système
├── config/
│ ├── database.yml
│ ├── configuration.yml
│ ├── email.yml
│ ├── secrets.yml
│ └── .env.backup
└── files_backup.tar.gz ← arborescence complète de REDMINE_ROOT
🔄 Modes de restauration
| Mode | DB | Fichiers | Config |
|---|---|---|---|
| Complète | ✅ | ✅ | ✅ |
| Base de données uniquement | ✅ | ❌ | ❌ |
| Fichiers uniquement | ❌ | ✅ | ❌ |
| Configuration uniquement | ❌ | ❌ | ✅ |
⚠️ Avant tout remplacement de fichiers, l'installation existante est automatiquement renommée en
REDMINE_ROOT.pre_restore_TIMESTAMPcomme filet de sécurité.
⏰ Planification automatique (Cron)
Via le menu interactif [4] ou la commande sudo ./redmine-backup.sh cron :
| Option | Expression | Description |
|---|---|---|
| Quotidienne | 0 2 * * * |
Tous les jours à 02h00 |
| Biquotidienne | 0 2,14 * * * |
À 02h00 et 14h00 |
| Hebdomadaire | 0 2 * * 1 |
Tous les lundis à 02h00 |
| Mensuelle | 0 2 1 * * |
Le 1er du mois à 02h00 |
| Personnalisée | <expression> |
Saisie manuelle avec validation |
Exemple d'entrée installée dans crontab -u root -l :
MAILTO=admin@exemple.fr
0 2 * * * /opt/scripts/redmine-backup/redmine-backup.sh backup # redmine-backup-auto
📁 Structure du dépôt
redmine-backup/
├── redmine-backup.sh ← script principal
├── .env.example ← modèle de configuration
├── README.md ← cette documentation
└── LICENSE ← licence MIT
🔒 Sécurité
- Le fichier
.envcontient potentiellement des mots de passe — ne jamais le committer. - Ajouter
.envau.gitignore:echo ".env" >> .gitignore - Les archives de sauvegarde contiennent des données sensibles — sécuriser
BACKUP_DIRavec des permissions restrictives :chmod 700 /opt/Backups
🐛 Dépannage
Le script quitte immédiatement
Vérifier que .env est présent et que REDMINE_ROOT pointe vers un dossier existant.
Erreur unsafe mail lors de l'installation cron
Mise à jour du script — la version corrigée gère proprement la directive MAILTO sur une ligne séparée sans commentaire.
Erreur de connexion DB
Vérifier les credentials dans database.yml et que l'utilisateur DB dispose des droits SELECT, LOCK TABLES, SHOW VIEW.
Permissions après restauration
chown -R www-data:www-data /opt/redmine/redmine
Consulter les logs
tail -f /var/log/redmine-backup.log
Johnny Fontaine — j.fontaine@h3campus.fr
H3 Campus — https://git.h3campus.fr/Johnny/Redmine
📄 Licence
Ce projet est distribué sous licence MIT. Voir le fichier LICENSE pour plus de détails.