# 🔮 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` --- ## 🚀 Installation ```bash # 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` ```ini # 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Ă©) ```bash 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 ```bash # 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_TIMESTAMP` comme 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 | `` | Saisie manuelle avec validation | Exemple d'entrĂ©e installĂ©e dans `crontab -u root -l` : ```cron 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 `.env` contient potentiellement des mots de passe — **ne jamais le committer**. - Ajouter `.env` au `.gitignore` : ```bash echo ".env" >> .gitignore ``` - Les archives de sauvegarde contiennent des donnĂ©es sensibles — sĂ©curiser `BACKUP_DIR` avec des permissions restrictives : ```bash 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** ```bash chown -R www-data:www-data /opt/redmine/redmine ``` **Consulter les logs** ```bash tail -f /var/log/redmine-backup.log ``` **Johnny Fontaine** — [j.fontaine@h3campus.fr](mailto:j.fontaine@h3campus.fr) H3 Campus — [https://git.h3campus.fr/Johnny/Redmine](https://git.h3campus.fr/Johnny/Redmine) --- ## 📄 Licence Ce projet est distribuĂ© sous licence **MIT**. Voir le fichier [LICENSE](LICENSE) pour plus de dĂ©tails.