Aller au contenu
Culture DevOps medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Sauvegarder et restaurer Gitea

6 min de lecture

gitea dump sauvegarde l’intégralité d’une instance — dépôts Git, base de données, configuration, fichiers LFS — en une seule archive ZIP. Le service peut rester actif pendant la sauvegarde. La restauration est manuelle mais déterministe.

Cette procédure a été testée sur Gitea 1.25.5 avec SQLite3 comme base de données. Les étapes sont identiques pour PostgreSQL ou MySQL, sauf pour la restauration de la base.

L’archive générée par gitea dump contient :

ContenuChemin sourceRôle
Dépôts GitREPOSITORY ROOTTous les dépôts bare
Base de donnéesdata/gitea.dbDonnées applicatives (users, issues, PRs…)
Fichiers LFSdata/lfs/Objets Git LFS
Configurationapp.iniParamètres de l’instance
Paquetsdata/packages/Registre de paquets
Donnéesdata/Autres données (avatars, attachements…)
Fenêtre de terminal
# Créer le répertoire dédié aux archives
sudo mkdir -p /var/lib/gitea/backups
sudo chown git:git /var/lib/gitea/backups
sudo chmod 750 /var/lib/gitea/backups

La sauvegarde s’exécute en tant qu’utilisateur git, avec la variable d’environnement GITEA_WORK_DIR pointant vers le répertoire de travail.

Fenêtre de terminal
# Backup avec le service actif (pas d'interruption)
sudo -u git GITEA_WORK_DIR=/var/lib/gitea \
gitea dump \
--config /etc/gitea/app.ini \
--work-path /var/lib/gitea \
--file /var/lib/gitea/backups/gitea-$(date +%Y%m%d-%H%M%S).zip \
--type zip

La commande affiche la progression et se termine par :

Finish dumping in file /var/lib/gitea/backups/gitea-20260328-194600.zip

Vérifiez le contenu de l’archive :

Fenêtre de terminal
sudo -u git unzip -l /var/lib/gitea/backups/gitea-20260328-194600.zip | head -20

Ajoutez une tâche cron pour l’utilisateur git afin d’automatiser les sauvegardes quotidiennes.

Fenêtre de terminal
# Éditer la crontab de l'utilisateur git
sudo crontab -u git -e

Ajoutez cette ligne pour un backup quotidien à 2h00 du matin :

# Backup Gitea quotidien à 2h00 — conservation 30 jours
0 2 * * * GITEA_WORK_DIR=/var/lib/gitea /usr/local/bin/gitea dump \
--config /etc/gitea/app.ini \
--work-path /var/lib/gitea \
--file /var/lib/gitea/backups/gitea-$(date +\%Y\%m\%d).zip \
--type zip \
&& find /var/lib/gitea/backups -name "gitea-*.zip" -mtime +30 -delete

Vérifiez que la crontab est visible :

Fenêtre de terminal
sudo crontab -u git -l

La restauration recrée une instance identique à partir de l’archive. Elle suppose que Gitea est déjà installé (binaire + service systemd), mais non configuré (pas d’app.ini).

  1. Arrêter le service

    Fenêtre de terminal
    sudo systemctl stop gitea.service
  2. Vider les répertoires de données existants

    Fenêtre de terminal
    sudo rm -rf /var/lib/gitea/data
    sudo rm -rf /etc/gitea/app.ini
  3. Extraire l’archive

    Fenêtre de terminal
    # Créer un répertoire temporaire pour l'extraction
    sudo -u git mkdir -p /tmp/gitea-restore
    sudo -u git unzip /var/lib/gitea/backups/gitea-20260328-194600.zip \
    -d /tmp/gitea-restore
  4. Restaurer la configuration

    Fenêtre de terminal
    sudo cp /tmp/gitea-restore/app.ini /etc/gitea/app.ini
    sudo chown root:git /etc/gitea/app.ini
    sudo chmod 660 /etc/gitea/app.ini # 660 pour le 1er démarrage post-restauration
  5. Restaurer les dépôts Git

    Fenêtre de terminal
    sudo -u git cp -r /tmp/gitea-restore/repos/* \
    /var/lib/gitea/data/gitea-repositories/
  6. Restaurer la base de données (SQLite)

    Fenêtre de terminal
    sudo -u git cp /tmp/gitea-restore/data/gitea.db \
    /var/lib/gitea/data/gitea.db
  7. Restaurer les données (LFS, paquets, avatars)

    Fenêtre de terminal
    sudo -u git cp -r /tmp/gitea-restore/data/* /var/lib/gitea/data/
    sudo chown -R git:git /var/lib/gitea/data
  8. Redémarrer et vérifier

    Fenêtre de terminal
    sudo systemctl start gitea.service
    sleep 5
    sudo systemctl is-active gitea.service
    # active
    curl -o /dev/null -s -w "%{http_code}\n" http://localhost:3000/
    # 200
  9. Durcir les permissions

    Fenêtre de terminal
    sudo chmod 640 /etc/gitea/app.ini
    sudo chmod 750 /etc/gitea
    sudo systemctl restart gitea.service
  10. Nettoyer les fichiers temporaires

    Fenêtre de terminal
    rm -rf /tmp/gitea-restore

Pour une stratégie robuste, transférez les archives vers un stockage distant après chaque backup.

Fenêtre de terminal
# Exemple avec rsync vers un serveur distant
rsync -az --progress \
/var/lib/gitea/backups/ \
backup-user@backup.example.com:/backups/gitea/
# Exemple avec rclone vers S3 / Backblaze B2 / etc.
rclone copy /var/lib/gitea/backups/ remote:bucket/gitea-backups/
  • gitea dump sauvegarde tout (dépôts + base + config + LFS) en une seule commande
  • Le service peut rester actif pendant le backup — pas d’interruption de service
  • La restauration nécessite que Gitea soit déjà installé mais non initialisé
  • Les tokens SECRET_KEY et INTERNAL_TOKEN sont dans l’archive — protégez-la
  • Conservation recommandée : 30 jours de backups quotidiens + 4 semaines de backups hebdomadaires

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn