Guide de déploiement

Migrer ses dépôts GitHub vers Gitea sur VPS

Déployer sur un VPS Cloud →

Déploiement9 min de lecture

Migrer ses dépôts GitHub vers Gitea sur VPS

Les pannes répétées de GitHub en août 2026 et la montée des coûts de GitHub Actions ont poussé des milliers d'équipes à chercher une sortie concrète. Gitea, installé sur un VPS avec un seul binaire, offre une API compatible et un runner CI natif. Ce guide vous mène de l'export GitHub à la première mise à jour `git push` sur votre propre forge, en moins d'une heure.

Pourquoi quitter GitHub pour une forge self-hosted

GitHub reste la référence, mais trois tendances ont convergé en 2026 pour rendre le départ concret plutôt que théorique.

Première tendance : les pannes. Plusieurs incidents documentés sur githubstatus.com ont affecté Git Operations et Actions en août 2026, bloquant des pipelines en production au pire moment. Le fil Hacker News « Alternatives to GitHub » a atteint 472 points et 299 commentaires le 2026-08-17 — signe que la question n'est plus académique.

Deuxième tendance : le coût des minutes CI. GitHub Actions est gratuit jusqu'à un certain quota mensuel sur les dépôts publics, mais toute équipe qui dépasse ce quota sur des dépôts privés paie à la minute — avec un multiplicateur selon l'OS du runner. Un runner Linux facture les minutes au tarif standard ; un runner macOS les facture au tarif le plus élevé. Ces détails sont consultables sur github.com/pricing.

Troisième tendance : la souveraineté du code. Certaines équipes préfèrent que le seul accès à leur dépôt soit root sur leur propre VM, pas un token SaaS révocable unilatéralement.

Ce que Gitea self-hosted apporte concrètement

  • Historique complet préservé : l'import via l'API Gitea consomme une archive tar.gz GitHub — commits, branches et tags intacts.
  • Issues et labels migrés : l'endpoint POST /api/v1/repos/migrate transfère issues, milestones et labels en une passe.
  • Runner CI natif : gitea-runner (basé sur act) comprend la syntaxe des workflows GitHub Actions — la plupart des pipelines fonctionnent sans réécriture.
  • Coût prévisible : un VPS avec 1 vCPU et 1 Go de RAM suffit pour une petite équipe ; le logiciel est open source, sans licence ni quota de minutes.
  • Webhooks compatibles : Gitea expose les mêmes événements (push, pull_request, release) que GitHub — les intégrations tierces (Slack, Woodpecker CI) restent câblées sans modification.
  • API token local : les accès se gèrent dans votre interface, jamais chez un tiers.

Prérequis

Avant de commencer, réunissez les éléments suivants.

Côté GitHub : un token d'accès personnel (Settings → Developer settings → Personal access tokens) avec les scopes repo et read:org. Gardez-le sous la main — vous l'utiliserez dans chaque appel curl.

Côté Gitea : une instance Gitea déjà installée (voir notre guide « Héberger Gitea sur votre propre VPS ») et un token admin (gitea-admin → Settings → Applications → Generate Token). Adresse de base notée https://git.votre-domaine.com.

Côté poste local : git 2.x, curl et jq installés. Comptez 1 Go de RAM minimum sur le VPS pour l'import de dépôts de taille courante.

Migration pas à pas

01

Créer l'organisation Gitea cible

Dans l'interface Gitea, allez dans + → New Organization, choisissez un nom identique à votre organisation GitHub (cela simplifiera la mise à jour des remotes).

Ou via l'API :

curl -s -X POST https://git.votre-domaine.com/api/v1/orgs \
  -H "Authorization: token VOTRE_TOKEN_GITEA" \
  -H "Content-Type: application/json" \
  -d '{"username":"mon-org","visibility":"private"}'
02

Lister et exporter les dépôts GitHub

Récupérez la liste de vos dépôts (paginée à 100 par page) :

curl -s -H "Authorization: token VOTRE_TOKEN_GITHUB" \
  "https://api.github.com/orgs/MON_ORG/repos?per_page=100&page=1" \
  | jq -r '.[].name' > repos.txt

L'endpoint GitHub utilisé ici est GET /repos/{owner}/{repo}/tarball/{ref} pour l'archive complète, et GET /orgs/{org}/repos pour l'inventaire. Vérifiez la documentation officielle à docs.github.com.

03

Importer chaque dépôt via l'API Gitea

L'endpoint POST /api/v1/repos/migrate de l'API Gitea v1 accepte une URL de source GitHub (documentation officielle : gitea.io). Pour chaque dépôt :

while IFS= read -r REPO; do
  curl -s -X POST https://git.votre-domaine.com/api/v1/repos/migrate \
    -H "Authorization: token VOTRE_TOKEN_GITEA" \
    -H "Content-Type: application/json" \
    -d "{\n      \\\"clone_addr\\\": \\\"https://github.com/MON_ORG/$REPO\\\",\n      \\\"auth_token\\\": \\\"VOTRE_TOKEN_GITHUB\\\",\n      \\\"uid\\\": 2,\n      \\\"repo_name\\\": \\\"$REPO\\\",\n      \\\"issues\\\": true,\n      \\\"labels\\\": true,\n      \\\"milestones\\\": true,\n      \\\"mirror\\\": false\n    }"
done < repos.txt

uid est l'identifiant numérique de votre organisation Gitea (visible dans l'API GET /api/v1/orgs/mon-org). Le champ mirror: false indique un import ponctuel — passez à true si vous voulez une synchronisation continue pendant la phase de transition.

04

Rediriger les remotes locaux

Pour chaque dépôt cloné sur votre poste :

git remote set-url origin https://git.votre-domaine.com/mon-org/mon-repo.git

Ou en SSH si vous avez ajouté votre clé publique dans Gitea (Settings → SSH / GPG Keys) :

git remote set-url origin [email protected]:mon-org/mon-repo.git

Vérifiez avec git remote -v puis testez un git fetch pour confirmer que le remote répond.

05

Mettre à jour les webhooks

Dans Gitea, pour chaque dépôt : Settings → Webhooks → Add Webhook. Collez l'URL de votre CI ou de votre service tiers (Slack, Woodpecker CI, etc.) en remplaçant github.com par git.votre-domaine.com.

Les événements disponibles (push, pull_request, issues, release) sont identiques à ceux de GitHub — les payloads ont la même structure de base pour la majorité des intégrations.

06

Migrer le pipeline CI vers gitea-runner

Installez le runner officiel sur votre VPS :

wget -O gitea-runner https://dl.gitea.com/act_runner/latest/act_runner-latest-linux-amd64
chmod +x gitea-runner
./gitea-runner register --no-interactive \
  --instance https://git.votre-domaine.com \
  --token VOTRE_TOKEN_RUNNER \
  --name vps-runner \
  --labels ubuntu-latest:docker://node:20-bullseye
./gitea-runner daemon &

Le token de runner se génère dans Gitea : Site Administration → Runners → Create new Runner Token.

Vos fichiers .github/workflows/*.yml existants sont compris par gitea-runner sans modification pour les actions courantes (actions/checkout, actions/setup-node, etc.). Renommez le dossier .github/workflows/ en .gitea/workflows/ pour activer le runner Gitea de façon propre (les deux chemins sont supportés, mais .gitea/ est le chemin natif).

Vérifications post-migration

Une fois la migration terminée, validez ces trois points avant de couper l'accès GitHub.

Clones SSH : depuis un poste fraîchement cloné, git clone [email protected]:mon-org/mon-repo.git doit aboutir sans prompt de mot de passe si votre clé publique est enregistrée dans Gitea.

Webhooks actifs : dans chaque dépôt, ouvrez Settings → Webhooks et cliquez Test Delivery. Un code 200 dans les logs de livraison confirme que votre CI reçoit les événements.

Historique intact : git log --oneline -10 sur le dépôt migré doit afficher les mêmes dix derniers commits que sur GitHub, dans le même ordre.

Si vous migrez plusieurs dizaines de dépôts, lancez les appels curl de migration en parallèle avec xargs -P 4 pour diviser le temps d'attente par quatre. Gitea gère les imports concurrents sans perte — la seule limite est la bande passante sortante de GitHub et entrante de votre VPS.

Dépannage — erreurs courantes

Voici les trois situations les plus fréquentes lors d'une migration.

01

SSH : `Permission denied (publickey)`

Symptôme : git clone [email protected]:… échoue avec Permission denied (publickey).

Vérification : dans Gitea, Settings → SSH / GPG Keys — la clé publique que vous utilisez doit y figurer. Ajoutez-la si elle est absente (cat ~/.ssh/id_ed25519.pub | pbcopy ou xclip).

Si la clé est présente mais l'erreur persiste, vérifiez que le port SSH de Gitea est bien 22 (ou le port configuré) : ssh -vT [email protected] -p 22 affichera la négociation et le message d'acceptation de Gitea si la clé est reconnue.

02

Remote : `fatal: repository not found`

Symptôme : git fetch renvoie fatal: repository 'https://git.votre-domaine.com/…' not found.

Diagnostic : git remote -v — vérifiez que l'URL pointe bien vers votre instance Gitea et non vers github.com. Si l'URL est correcte, connectez-vous à l'interface Gitea et confirmez que le dépôt existe sous le bon nom d'organisation. Un POST /api/v1/repos/migrate qui a échoué en silence laisse le dépôt absent sans message d'erreur dans le remote local.

03

Webhooks silencieux après migration

Symptôme : un git push ne déclenche pas de build dans votre CI.

Diagnostic : dans Gitea, Site Administration → System Settings → Git Hooks — activez la journalisation des hooks. Puis, dans le dépôt, Settings → Webhooks → dernière livraison : le champ « Response » affiche le code HTTP renvoyé par votre CI. Un 404 signifie que l'URL du webhook pointe vers une route inexistante ; un 401 signifie un secret HMAC mal configuré.

Activez le mode debug du runner : dans le fichier de configuration de gitea-runner, passez log_level à debug et relancez le daemon. Les logs afficheront la réception de chaque événement et le code d'activation du job.

Héberger Gitea sur un VPS ServOrbit

Gitea tourne confortablement sur un VPS avec 1 vCPU et 1 Go de RAM pour une petite équipe. Pour une organisation de dix développeurs avec une CI active, 2 vCPU et 2 Go sont un point de départ raisonnable — le runner et Gitea peuvent cohabiter sur la même VM à ce gabarit.

Si l'administration du serveur n'est pas votre priorité, l'option administration VPS de ServOrbit couvre exactement ce cas : mises à jour de sécurité, supervision et intervention en cas d'incident — vous gardez l'accès root, nous tenons la VM en état. Votre forge reste la vôtre, sans partager l'infrastructure avec d'autres équipes.

Déployez le template Gitea depuis la Marketplace, sélectionnez votre OS (Ubuntu ou Debian) et votre taille de VPS, et vous disposez d'une instance configurée en quelques minutes. Plans VPS à partir de {{vps.start.price}}.

Votre propre forge Git, sur votre VPS

Un VPS avec accès root, IPv4 dédiée et choix d'OS (Ubuntu, Debian, AlmaLinux) : la base pour héberger Gitea sans dépendance à un SaaS. Template Gitea disponible dans la Marketplace.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.