Gitea et Forgejo : héberger son propre GitHub
Une forge Git complète — dépôts, issues, pull requests, CI — qui tient dans un binaire de 100 Mo et tourne sur un Raspberry Pi.
GitHub gratuit couvre large, mais dès qu'une équipe ou une entreprise a besoin de dépôts privés illimités avec des runners CI dédiés, la facture GitHub Enterprise grimpe vite. Gitea répond à un besoin plus simple : une forge Git complète, sans limite artificielle, hébergée sur un serveur que vous possédez. Forgejo est le fork communautaire de Gitea, né en 2022 après des désaccords sur la gouvernance du projet — les deux restent quasi identiques en usage, Forgejo ajoutant certaines fonctionnalités en avance de phase.
Gitea reproduit l'essentiel de GitHub : dépôts Git avec permissions fines, issues et labels, pull requests avec revue de code inline, wiki par dépôt, et un système d'Actions compatible avec la syntaxe GitHub Actions. La différence de poids : Gitea tourne en un seul binaire Go, consomme quelques dizaines de Mo de RAM, et démarre en quelques secondes — loin de l'empreinte de GitLab self-hosted, nettement plus lourd.
Installation avec Docker Compose
services:
gitea:
image: gitea/gitea:latest
restart: always
environment:
USER_UID: 1000
USER_GID: 1000
GITEA__database__DB_TYPE: postgres
GITEA__database__HOST: db:5432
GITEA__database__NAME: gitea
GITEA__database__USER: gitea
GITEA__database__PASSWD: giteapass
volumes:
- gitea_data:/data
- /etc/timezone:/etc/timezone:ro
ports:
- "3000:3000"
- "222:22"
depends_on:
- db
db:
image: postgres:16-alpine
restart: always
environment:
POSTGRES_USER: gitea
POSTGRES_PASSWORD: giteapass
POSTGRES_DB: gitea
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
gitea_data:
postgres_data:Le port 222:22 expose SSH sur un port dédié — évite le conflit avec le SSH natif de la machine hôte. Un git clone en SSH passe alors par ssh://git@monserveur:222/utilisateur/depot.git.
Premier accès sur http://votre-serveur:3000 : l'assistant d'installation confirme la config base de données puis crée le compte admin.
Migrer un dépôt depuis GitHub
Gitea intègre un outil de migration qui rapatrie tout — commits, issues, pull requests, wiki, labels, milestones — depuis GitHub, GitLab ou Bitbucket.
Nouveau dépôt > Migrer >
URL source : https://github.com/monorg/monrepo
Token d'accès : ghp_xxxxxxxxxxxx
Migrer issues/PR/wiki/labels : cochésPour une migration en masse scriptée, l'API REST de Gitea expose le même endpoint utilisé par l'interface :
curl -X POST "https://git.mondomaine.fr/api/v1/repos/migrate" \
-H "Authorization: token VOTRE_TOKEN_GITEA" \
-H "Content-Type: application/json" \
-d '{
"clone_addr": "https://github.com/monorg/monrepo",
"repo_name": "monrepo",
"mirror": false,
"issues": true,
"pull_requests": true
}'Gitea Actions — CI compatible GitHub Actions
Gitea Actions réutilise la même syntaxe YAML que GitHub Actions — un fichier .gitea/workflows/ci.yml presque identique à son équivalent .github/workflows/.
name: Tests
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm testPour exécuter ces workflows, il faut un runner Gitea (équivalent des runners GitHub) enregistré sur l'instance :
docker run -d \
--name gitea-runner \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v gitea-runner-data:/data \
-e GITEA_INSTANCE_URL="https://git.mondomaine.fr" \
-e GITEA_RUNNER_REGISTRATION_TOKEN="TOKEN_GENERE_DANS_ADMIN" \
gitea/act_runner:latestUne équipe qui migre un pipeline GitHub Actions existant vers Gitea n'a souvent qu'à changer le dossier .github en .gitea — la logique des steps reste identique dans la majorité des cas.
Permissions et organisations
Gitea structure les accès comme GitHub : organisations, équipes avec permissions par dépôt (lecture, écriture, admin), et protection de branches (revue obligatoire avant merge, checks CI requis).
Paramètres dépôt > Branches > Ajouter une règle
Branche : main
Exiger une pull request avant merge : oui
Exiger le statut CI "test" en succès : oui
Nombre de reviews requises : 1Gitea vs Forgejo vs GitLab CE
| Critère | Gitea | Forgejo | GitLab CE |
|---|---|---|---|
| Empreinte mémoire | Très légère (~100 Mo) | Très légère | Lourde (2+ Go) |
| CI intégrée | Actions (compatible GH) | Actions | GitLab CI (syntaxe propre) |
| Gouvernance | Entreprise + communauté | Fondation à but non lucratif | Entreprise (GitLab Inc.) |
| Registre de packages | Oui | Oui | Oui |
| Courbe d'apprentissage | Faible | Faible | Moyenne |
GitLab CE reste plus complet sur les fonctionnalités DevOps avancées (security scanning intégré, epics), mais son empreinte ressource le rend peu adapté à un petit VPS. Pour une équipe qui veut juste ses dépôts, ses issues et sa CI sans usine à gaz, Gitea ou Forgejo suffisent largement.
Sauvegardes
docker exec gitea gitea dump -c /data/gitea/conf/app.iniLa commande dump intégrée génère une archive complète — dépôts Git, base de données, configuration, avatars — en un seul fichier, la méthode recommandée par le projet plutôt qu'un simple tar du volume.
Gitea ne remplace pas GitHub pour la visibilité open-source ou la découverte de projets tiers — un dépôt privé reste privé, sans l'effet réseau d'une plateforme publique. Mais pour du code interne, sur un serveur qui a déjà Docker et un peu de discipline autour de Git, c'est une forge complète sans jamais dépendre d'un tiers pour son propre code.