7.3 KiB
🟠 gitea-backup
Script Bash professionnel de sauvegarde et restauration complète de Gitea — base de données, dépôts Git, LFS, avatars, attachments, configuration
app.ini, clés SSH — avec menu interactif et planification cron intégrée.
✨ Fonctionnalités
| Fonctionnalité | Détail |
|---|---|
| 💾 Sauvegarde complète | DB + dépôts Git + LFS + avatars + attachments + config |
| 🔄 Restauration interactive | Menu avec 5 modes de restauration ciblée |
| 🗄️ Multi-base de données | PostgreSQL, MySQL/MariaDB, SQLite3 — auto-détection via app.ini |
🧰 gitea dump natif |
Intégration optionnelle de la commande officielle Gitea en complément |
| ⏰ Planification cron | Fréquences prédéfinies ou expression personnalisée + notifications email |
| 📋 Manifest d'archive | Version Gitea, stats dépôts, taille LFS, extrait app.ini |
| 🔁 Rotation automatique | Conservation configurable des N dernières archives |
| 🛡️ Arrêt/relance automatique | Gitea est stoppé proprement avant restauration, relancé après |
| 🔑 Clés SSH incluses | Sauvegarde du répertoire .ssh de l'utilisateur Gitea |
| 📝 Journal | Logging horodaté dans /var/log/gitea-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 →
- Optionnel : binaire
giteaaccessible pour le dump natif
🚀 Installation
# Cloner le dépôt
git clone https://git.h3campus.fr/Johnny/Redmine.git /opt/scripts/gitea-backup
cd /opt/scripts/gitea-backup
# Rendre le script exécutable
chmod +x gitea-backup.sh
# Copier et configurer le fichier .env
cp .env.gitea.example .env.gitea
nano .env.gitea
⚙️ Configuration — fichier .env.gitea
# Utilisateur système Gitea
GITEA_USER=git
# Répertoire d'installation du binaire
GITEA_ROOT=/opt/gitea
# Répertoire de travail (repositories, data, log...)
GITEA_WORK_DIR=/var/lib/gitea
# Chemin vers app.ini (obligatoire)
GITEA_CONF=/etc/gitea/app.ini
# Chemin vers le binaire gitea
GITEA_BINARY=/usr/local/bin/gitea
# Dossier de stockage des archives
BACKUP_DIR=/opt/Backups/gitea
# Nombre d'archives à conserver
KEEP_BACKUPS=7
# Inclure les logs dans la sauvegarde
INCLUDE_LOG=false
# Activer le dump natif "gitea dump" en complément
USE_NATIVE_DUMP=true
# Surcharge DB optionnelle (auto-détectée depuis app.ini par défaut)
# DB_TYPE=postgresql
# DB_HOST=localhost
# DB_PORT=5432
# DB_NAME=gitea
# DB_USER=gitea
# DB_PASS=motdepasse
Les valeurs
DB_*sont auto-détectées depuisapp.ini. Ne les renseigner que pour surcharger ou si la détection échoue.
📖 Utilisation
Menu interactif (recommandé)
sudo ./gitea-backup.sh
[1] Créer une sauvegarde — Sauvegarde complète (DB + dépôts + données + 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
sudo ./gitea-backup.sh backup # Lancer une sauvegarde
sudo ./gitea-backup.sh restore # Menu de restauration
sudo ./gitea-backup.sh list # Lister les archives
sudo ./gitea-backup.sh cron # Gérer la planification cron
sudo ./gitea-backup.sh help # Aide
💾 Contenu d'une archive de sauvegarde
Chaque archive gitea_backup_YYYYMMDD_HHMMSS.tar.gz contient :
gitea_backup_20260227_030000.tar.gz
├── database.sql ← dump complet de la base de données (PostgreSQL/MySQL)
├── database.db ← copie binaire (SQLite uniquement)
├── manifest.txt ← version Gitea, stats dépôts, extrait app.ini
├── config/
│ ├── app.ini ← configuration principale Gitea
│ ├── ssh_keys/ ← clés SSH de l'utilisateur Gitea
│ └── .env.gitea.backup ← copie du fichier .env
├── repositories.tar.gz ← tous les dépôts Git (bare repos)
├── data.tar.gz ← avatars, attachments, LFS, tokens
└── native_dump/ ← archive gitea dump officielle (si USE_NATIVE_DUMP=true)
└── gitea_native_dump.zip
🔄 Modes de restauration
| Mode | DB | Dépôts | Données | Config |
|---|---|---|---|---|
| Complète | ✅ | ✅ | ✅ | ✅ |
| Base de données uniquement | ✅ | ❌ | ❌ | ❌ |
| Dépôts Git uniquement | ❌ | ✅ | ❌ | ❌ |
| Données uniquement (avatars, LFS...) | ❌ | ❌ | ✅ | ❌ |
| Configuration uniquement (app.ini + SSH) | ❌ | ❌ | ❌ | ✅ |
⚠️ Le service Gitea est automatiquement arrêté avant la restauration et redémarré à la fin (modes 1 à 4).
⚠️ Les dossiers remplacés sont renommés.pre_restore_TIMESTAMPcomme filet de sécurité.
⏰ Planification automatique (Cron)
Via le menu [4] ou sudo ./gitea-backup.sh cron :
| Option | Expression | Description |
|---|---|---|
| Quotidienne | 0 3 * * * |
Tous les jours à 03h00 |
| Biquotidienne | 0 3,15 * * * |
À 03h00 et 15h00 |
| Hebdomadaire | 0 3 * * 1 |
Tous les lundis à 03h00 |
| Mensuelle | 0 3 1 * * |
Le 1er du mois à 03h00 |
| Personnalisée | <expression> |
Saisie manuelle validée |
Exemple d'entrée installée :
MAILTO=admin@exemple.fr
0 3 * * * /opt/scripts/gitea-backup/gitea-backup.sh backup # gitea-backup-auto
📁 Structure du dépôt
gitea-backup/
├── gitea-backup.sh ← script principal
├── .env.gitea.example ← modèle de configuration
├── README.md ← cette documentation
└── LICENSE ← licence MIT
🔒 Sécurité
- Le fichier
.env.giteacontient des mots de passe — ne jamais le committer. - Ajouter au
.gitignore:echo ".env.gitea" >> .gitignore - Restreindre l'accès au dossier de sauvegardes :
chmod 700 /opt/Backups/gitea app.inipeut contenir des secrets (clés JWT, mots de passe SMTP) — les archives sont sensibles.
🐛 Dépannage
Erreur gitea dump échoue
Le script bascule automatiquement sur la méthode manuelle. Vérifier que GITEA_BINARY est correct et que l'utilisateur GITEA_USER a les droits nécessaires.
La détection DB échoue
Forcer manuellement DB_TYPE, DB_NAME, DB_USER, DB_PASS dans .env.gitea.
Permissions après restauration
chown -R git:git /var/lib/gitea
chmod 750 /etc/gitea
chmod 640 /etc/gitea/app.ini
Gitea ne redémarre pas après restauration
systemctl status gitea
journalctl -u gitea -n 50
Consulter les logs de sauvegarde
tail -f /var/log/gitea-backup.log
👤 Auteur
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.