Sauvegarde et restauration du serveur Gitea

Sauvegarde et restauration de Gitea, la bonne manière

Sommaire

Les sauvegardes de Gitea touchent trois éléments en mouvement — la base de données, les dépôts git et les fichiers de l’application — et depuis 2024, la commande intégrée gitea dump gère tous ces éléments d’un coup.

très belle photo d’un hdd ouvert

Dans l’article Test de Gitea, nous avons installé le serveur gitea. Voici la suite : comment réellement le sauvegarder et, plus important encore, le restaurer lorsque quelque chose se passe mal.

Pour la collection complète des outils de développement incluant les flux de travail Git et la gestion Docker, consultez Outils de développement : Le guide complet des flux de travail de développement modernes.

Si vous installez Gitea pour la première fois, consultez Choisir un serveur git libre auto-hébergé - Gitea est le gagnant ! pour les détails d’installation, et Gitea SSL avec Apache en tant que proxy inversé pour un déploiement sécurisé.

Quand réhearser cette procédure

Maintenant, tout simplement comme précaution contre des événements désastreux, est un bon moment pour réhearser la procédure de sauvegarde et de restauration - avant d’en avoir réellement besoin, et non après qu’un disque ait défailli.

Mieux vaut être prudent que de le regretter.

Où se trouvent les données

Une instance Gitea est réellement composée de trois composants qui doivent tous rester synchronisés :

  • le code (dépôts git)
  • le stockage de fichiers (pièces jointes, avatars, objets LFS, indexeurs)
  • la base de données (utilisateurs, problèmes, PR, paramètres)

Dans notre environnement de test, pris ensemble, ils prennent un peu plus de 700 Mo :

utilisation disque gitea

Étant donné que ces trois éléments se référencent mutuellement, la documentation officielle de Gitea est explicite sur la cohérence de la sauvegarde : l’instance doit être arrêtée pendant toute la durée de la sauvegarde, sinon un dépôt copié en plein milieu d’une migration peut finir désynchronisé par rapport à ce que la base de données considère comme ayant eu lieu. La restauration, pour la même raison, doit également se faire en une seule transaction.

La méthode simple - gitea dump

C’est la partie qui a changé par rapport à la version précédente de cet article : au lieu de jongler manuellement avec pg_dump, tar et des dossiers séparés, Gitea fournit une commande dump unique qui regroupe la base de données, les dépôts, les données LFS, les pièces jointes et la configuration dans une seule archive.

gitea dump -c /path/to/app.ini

Cela produit un fichier horodaté comme gitea-dump-1610949662.zip contenant :

  • app.ini - copie du fichier de configuration
  • custom/ - personnalisations sous custom/
  • data/ - pièces jointes, avatars, objets LFS, indexeurs (et le fichier SQLite, si c’est votre base de données)
  • repos/ - copie complète du répertoire des dépôts
  • gitea-db.sql - décharge SQL de la base de données
  • log/ - journaux (non nécessaires pour la restauration)

Des options utiles à connaître :

  • --file name / -f name - nom du fichier de sortie (- pour la sortie standard, pratique pour rediriger directement vers scp ou le stockage d’objets)
  • --type - format de sortie : zip (par défaut), tar, tar.gz, tar.xz, tar.zst, etc.
  • --database / -d - force le dialecte SQL dans gitea-db.sql (sqlite3, mysql, mssql, postgres) - utile lors de la migration entre moteurs de base de données
  • --skip-repository / -R, --skip-lfs-data, --skip-attachment-data, --skip-package-data, --skip-log, --skip-db - réduit la décharge à seulement ce dont vous avez besoin
  • --tempdir / -t - l’endroit où les fichiers intermédiaires sont stockés (par défaut /tmp ou $TMPDIR) - assurez-vous qu’il y a assez d’espace libre pour l’instance entière

Exécution de gitea dump sous Docker

La plupart des installations auto-hébergées exécutent Gitea via docker-compose, la commande doit donc être exécutée à l’intérieur du conteneur, en tant qu’utilisateur git, depuis le répertoire temporaire du conteneur :

cd ~/gitea-srv-local

# créer une décharge dans le conteneur en cours d'exécution
sudo docker exec -u git -it -w /tmp gitea bash -c \
  '/usr/local/bin/gitea dump -c /data/gitea/conf/app.ini'

# copier le zip résultant hors du conteneur
sudo docker cp gitea:/tmp/gitea-dump-*.zip ./gitea-backups/

-w /tmp est important : dump doit écrire et archiver son répertoire de travail temporaire, et son exécution dans un emplacement sans permissions d’écriture échouera avec une erreur de permission.

Ensuite, comme précédemment, récupérez l’archive depuis la machine :

scp uname@gitea-srv-ip-addr:~/gitea-srv-local/gitea-backups/gitea-dump-*.zip ~/gitea-backups/

Si vous préférez décharger la base de données avec les outils natifs (la documentation de Gitea recommande cela pour MySQL/PostgreSQL, étant donné que la décharge SQL basée sur XORM dans gitea dump présente des cas limites connus lors de la restauration), vous pouvez toujours le faire en parallèle :

sudo docker exec -t gitea-srv-local_db_1 bash -c \
  'pg_dump gitea -U gitea --file=/var/lib/postgresql/backups/gitea-db-$(date +%Y-%m-%d).sql'

Consultez l’Aide-mémoire PostgreSQL pour plus d’options pg_dump/pg_restore, et l’Aide-mémoire Docker Compose si la syntaxe docker exec/docker cp ci-dessus vous est familière.

Comment - Restaurer

Il n’y a toujours pas de commande unique de restauration - la documentation de Gitea est franche à ce sujet : il s’agit encore d’un processus manuel consistant à replacer les fichiers à leur place et à restaurer la décharge de la base de données. Mais ! Vérifiez toujours d’abord la documentation originale, car les chemins et les structures de conteneurs changent entre les versions.

# installer/démarrer un gitea neuf (même version que la sauvegarde) puis l'arrêter
sudo docker-compose down

# dézipper la décharge
unzip gitea-dump-1610949662.zip -d gitea-restore
cd gitea-restore

# restaurer les dépôts et les données dans les volumes utilisés par gitea
sudo cp -r repos/* ../gitea/git/
sudo cp -r data/* ../gitea/gitea/
sudo chown -R 1000:1000 ../gitea/git ../gitea/gitea

# redémarrer gitea
sudo docker-compose up -d

# restaurer la base de données
sudo docker exec -i gitea-srv-local_db_1 psql -U gitea gitea < gitea-db.sql

Si vous avez déchargé la base de données séparément avec pg_dump/pg_restore, restaurez cette décharge de la même manière que pour n’importe quelle autre instance Postgres - consultez l’Aide-mémoire PostgreSQL pour les commandes exactes.

Régénérer les hooks après la restauration

Si vous avez restauré vers une méthode d’installation différente (binaire vs Docker) ou un chemin différent, les git hooks intégrés dans chaque dépôt pointeront toujours vers les anciens chemins. Corrigez cela avec :

sudo docker exec -u git -it gitea bash -c '/usr/local/bin/gitea admin regenerate hooks'

Ignorer cette étape est la cause classique d’un échec de push juste après une restauration, sans erreur évidente dans l’interface.

Vérifier la restauration

Avant de considérer le travail comme terminé :

  1. Connectez-vous à l’interface et confirmez que les utilisateurs, les problèmes et les paramètres sont corrects.
  2. Clonez un dépôt et poussez un commit trivial pour confirmer que les hooks fonctionnent.
  3. Exécutez gitea doctor check (ajoutez --fix si quelque chose est signalé) pour détecter tôt les incohérences de chemin ou de permissions.

Restaurer un dépôt unique - restore-repo

L’autre élément véritablement nouveau depuis la dernière version de cet article est une paire de commandes pour la sauvegarde et la restauration au niveau des dépôts, distincte du flux de travail dump/restauration complet ci-dessus. Elles sont pratiques lorsque vous n’avez besoin de récupérer qu’un seul projet - par exemple, si quelqu’un a forcé la suppression d’un dépôt - au lieu de revenir en arrière sur tout le serveur.

dump-repo extrait un dépôt unique (plus, en option, ses problèmes, PR, wiki et autres métadonnées) vers un répertoire local :

gitea dump-repo \
  --git_service gitea \
  --clone_addr https://gitea.example.com/owner/repo.git \
  --auth_token <token> \
  --repo_dir /backup/repos/owner/repo \
  --units wiki,issues,labels,releases,milestones,pull_requests,comments

restore-repo rejoue ensuite ce répertoire dans une instance, vers un propriétaire/dépôt choisi :

gitea restore-repo \
  --repo_dir /backup/repos/owner/repo \
  --owner_name owner \
  --repo_name repo \
  --units issues,labels,milestones,pull_requests,comments

Les deux listes --units sont optionnelles - omettez-les et tout ce qui est pris en charge sera migré. Cette paire est en réalité un outil de migration (il fonctionne également contre GitHub/GitLab comme source via --git_service), mais il sert également bien d’alternative légère, par dépôt, à une gitea dump complète lorsqu’une restauration complète serait exagérée.

L’automatiser

Une décharge quotidienne plus une copie hors de la machine est un travail cron de deux lignes une fois que les étapes manuelles ci-dessus fonctionnent :

# /etc/cron.d/gitea-backup
0 2 * * * root docker exec -u git -w /tmp gitea gitea dump -c /data/gitea/conf/app.ini -f - > /home/uname/gitea-backups/gitea-dump-$(date +\%F).zip 2>> /var/log/gitea-backup.log

Associez-le à un nettoyage de rétention (find ~/gitea-backups -mtime +14 -delete) et à une copie hors-site via scp/rsync pour qu’une défaillance sur un seul hôte n’emporte pas les sauvegardes avec elle.

Dépannage

  • permission denied pendant dump - vous n’exécutez pas en tant qu’utilisateur git, ou --tempdir/-w pointe vers un répertoire que l’utilisateur du conteneur ne peut pas écrire.
  • La restauration réussit mais git push échoue - les hooks n’ont pas été régénérés ; exécutez gitea admin regenerate hooks.
  • Erreurs de restauration de la base de données sur une grande instance - préférez les outils natifs pg_dump/mysqldump au SQL intégré au zip de gitea dump ; il est connu pour avoir des bords rugueux lors de la restauration pour les schémas volumineux ou inhabituels.
  • Restauré vers une nouvelle version majeure - exécutez gitea doctor check --all --fix et vérifiez les notes de version pour les étapes de migration de cette version avant de supposer que la restauration est complète.

Pour référence rapide sur les commandes Git, consultez Aide-mémoire GIT : Les commandes GIT les plus utiles.

Liens utiles

S'abonner

Recevez de nouveaux articles sur les systèmes, l'infrastructure et l'ingénierie IA.