forgejo dump crée un fichier ZIP unique qui contient tout : la base de données, les dépôts Git,
la configuration, les clés SSH, les avatars et les données LFS. Cette page explique comment
créer, vérifier et restaurer ce backup — avec une automatisation cron pour ne plus y penser.
La procédure a été testée en lab : une instance Forgejo 14.0.3 sauvegardée, complètement détruite et restaurée depuis le ZIP. Résultat : HTTP 200, dépôts et configuration intacts.
Ce que contient un backup Forgejo
Section intitulée « Ce que contient un backup Forgejo »forgejo dump produit un fichier .zip dont le contenu type est :
| Fichier dans le ZIP | Contenu |
|---|---|
app.ini | Fichier de configuration principal |
forgejo-db.sql | Export SQL complet de la base de données |
data/ | Queues, indexeurs, LFS, clés SSH, avatars, sessions |
repos/ | Tous les dépôts Git (format bare) |
Préparer le répertoire de backup
Section intitulée « Préparer le répertoire de backup »sudo mkdir -p /var/lib/forgejo/backupssudo chown git:git /var/lib/forgejo/backupssudo chmod 750 /var/lib/forgejo/backupsCréer un backup
Section intitulée « Créer un backup »Backup manuel (service arrêté – recommandé)
Section intitulée « Backup manuel (service arrêté – recommandé) »Arrêter le service garantit la cohérence des données, notamment pour SQLite qui n’a pas de mécanisme de snapshot transactionnel externe.
# Arrêter le servicesudo systemctl stop forgejo.service
# Créer le backupsudo -u git forgejo dump \ -w /var/lib/forgejo \ -c /etc/forgejo/app.ini \ -f /var/lib/forgejo/backups/forgejo-dump-$(date +%Y%m%d-%H%M).zip
# Vérifier le fichier crééls -lh /var/lib/forgejo/backups/
# Relancer le servicesudo systemctl start forgejo.serviceUn backup d’une instance vide pèse environ 2 Mo. Avec des dépôts réels, la taille correspond à la somme des dépôts + les données LFS.
Backup à chaud (service en cours)
Section intitulée « Backup à chaud (service en cours) »Forgejo permet de créer un backup sans arrêter le service. Ce mode convient aux instances très actives qui ne peuvent pas tolérer une interruption, au prix d’un risque (très faible) d’incohérence des données en cours d’écriture.
sudo -u git forgejo dump \ -w /var/lib/forgejo \ -c /etc/forgejo/app.ini \ -f /var/lib/forgejo/backups/forgejo-hot-$(date +%Y%m%d-%H%M).zipVérifier le contenu d’un backup
Section intitulée « Vérifier le contenu d’un backup »# Lister les fichiers dans le ZIPunzip -l /var/lib/forgejo/backups/forgejo-dump-20260328-1200.zip | head -30
# Vérifier que les éléments essentiels sont présentsunzip -l /var/lib/forgejo/backups/forgejo-dump-20260328-1200.zip | grep -E "app.ini|forgejo-db.sql|repos/"Automatiser avec cron
Section intitulée « Automatiser avec cron »Créez un script de backup et planifiez-le avec cron.
Script de backup
Section intitulée « Script de backup »sudo tee /usr/local/bin/forgejo-backup.sh << 'EOF'#!/bin/bashset -e
BACKUP_DIR="/var/lib/forgejo/backups"FORGEJO_WORK="/var/lib/forgejo"FORGEJO_CONF="/etc/forgejo/app.ini"RETENTION_DAYS=30LOG="/var/log/forgejo-backup.log"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Début du backup Forgejo" >> "$LOG"
# Arrêt du servicesystemctl stop forgejo.service
# BackupBACKUP_FILE="${BACKUP_DIR}/forgejo-$(date +%Y%m%d-%H%M).zip"sudo -u git forgejo dump \ -w "$FORGEJO_WORK" \ -c "$FORGEJO_CONF" \ -f "$BACKUP_FILE"
# Redémarragesystemctl start forgejo.service
# Nettoyage des anciens backupsfind "$BACKUP_DIR" -name "forgejo-*.zip" -mtime "+${RETENTION_DAYS}" -delete
SIZE=$(du -sh "$BACKUP_FILE" | cut -f1)echo "[$(date '+%Y-%m-%d %H:%M:%S')] Backup terminé : $BACKUP_FILE ($SIZE)" >> "$LOG"EOF
sudo chmod 750 /usr/local/bin/forgejo-backup.shPlanification cron (toutes les nuits à 2h)
Section intitulée « Planification cron (toutes les nuits à 2h) »# Ouvrir le crontab root (le script utilise systemctl qui nécessite root)sudo crontab -eAjoutez la ligne :
0 2 * * * /usr/local/bin/forgejo-backup.shVérifier les logs de sauvegarde
Section intitulée « Vérifier les logs de sauvegarde »cat /var/log/forgejo-backup.logRestaurer depuis un backup
Section intitulée « Restaurer depuis un backup »-
Préparer la restauration
La restauration écrase les données existantes. Si votre instance est en production, assurez-vous d’avoir communiqué une fenêtre de maintenance.
Fenêtre de terminal sudo systemctl stop forgejo.service -
Extraire le backup
Le répertoire d’extraction doit appartenir à l’utilisateur
git, sinon la restauration produira des fichiers avec de mauvaises permissions.Fenêtre de terminal BACKUP_FILE="/var/lib/forgejo/backups/forgejo-20260328-1200.zip"RESTORE_DIR="/tmp/forgejo-restore"# Créer le répertoire avec les bons droitssudo rm -rf "$RESTORE_DIR"sudo mkdir "$RESTORE_DIR"sudo chown git:git "$RESTORE_DIR"# Extrairesudo -u git unzip -q "$BACKUP_FILE" -d "$RESTORE_DIR"# Vérifierls "$RESTORE_DIR"# Doit afficher : app.ini data/ repos/ forgejo-db.sql -
Restaurer la configuration
Fenêtre de terminal sudo cp "$RESTORE_DIR/app.ini" /etc/forgejo/app.inisudo chown git:git /etc/forgejo/app.inisudo chmod 640 /etc/forgejo/app.ini -
Restaurer les données
rsync -apréserve les permissions et écrase les fichiers existants :Fenêtre de terminal sudo rsync -a --chown=git:git "$RESTORE_DIR/data/" /var/lib/forgejo/data/Si le répertoire
repos/du backup est distinct dedata/forgejo-repositories/:Fenêtre de terminal sudo rsync -a --chown=git:git "$RESTORE_DIR/repos/" \/var/lib/forgejo/data/forgejo-repositories/ -
Relancer le service et vérifier
Fenêtre de terminal sudo systemctl start forgejo.servicesudo systemctl status forgejo.service# Test HTTPcurl -o /dev/null -sw "%{http_code}" http://localhost:3000/# Doit afficher 200 -
Nettoyer les fichiers temporaires
Fenêtre de terminal sudo rm -rf /tmp/forgejo-restore
Stratégie de rétention
Section intitulée « Stratégie de rétention »| Volume de changements | Fréquence backup | Rétention |
|---|---|---|
| Petite instance, peu de commits | Quotidien | 30 jours |
| Instance active (>10 développeurs) | 2x/jour | 14 jours + backup hebdo 3 mois |
| Instance critique | Toutes les heures (hot) | 7 jours + backup quotidien 1 mois |
Externalisez les backups : copiez les ZIP vers un stockage distant (S3, NFS, autre serveur) pour vous protéger contre la perte du serveur Forgejo lui-même.
Dépannage
Section intitulée « Dépannage »permission denied lors de forgejo dump
Section intitulée « permission denied lors de forgejo dump »ls -la /var/lib/forgejo/backups/# Vérifier que le répertoire appartient à gitsudo chown git:git /var/lib/forgejo/backupsunzip: cannot create file lors de la restauration
Section intitulée « unzip: cannot create file lors de la restauration »# Vérifier les droits du répertoire d'extractionls -la /tmp/forgejo-restore/sudo chown git:git /tmp/forgejo-restore/La restauration ne trouve pas les dépôts
Section intitulée « La restauration ne trouve pas les dépôts »Vérifiez que REPOSITORY_ROOT dans app.ini correspond au chemin où vous avez restauré
les dépôts :
sudo grep -A5 "^\[repository\]" /etc/forgejo/app.ini# ROOT = /var/lib/forgejo/data/forgejo-repositoriesÀ retenir
Section intitulée « À retenir »forgejo dumpproduit un ZIP complet : config, DB SQL, dépôts, LFS, avatars- Le répertoire de destination du backup doit appartenir à l’utilisateur
git - Le service doit être arrêté pour un backup cohérent (surtout avec SQLite)
- La restauration suit le principe : extraire (en tant que
git) → copierapp.ini→ rsyncdata/→ démarrer - Avec PostgreSQL/MySQL, la base de données n’est pas dans le ZIP — sauvegardez-la séparément
- Externaliser les backups est indispensable pour se protéger d’une perte serveur