📚 Cet article fait partie de notre cluster self-hosting pour PME africaines. Pour la vue d’ensemble — choix VPS Hetzner, Coolify, sécurité, sauvegarde 3-2-1, monitoring, 30 outils auto-hébergés — consultez notre guide pilier self-hosting 2026.
Pour les développeurs et PME africaines qui veulent garder leur code source chez eux plutôt que sur GitHub (souveraineté, contrôle, indépendance), Forgejo et Gitea sont les deux options self-hosted dominantes en 2026 (informations vérifiées en avril 2026, susceptibles d’évoluer). Forks issus de la même base, ces deux projets offrent une plateforme Git complète : repos privés/publics, issues, pull requests, wiki, releases, registry packages, CI/CD intégré (Forgejo Actions / Gitea Actions). Voici le guide pratique pour héberger votre propre forge Git.
Ce guide général couvre l’écosystème. Les articles connexes détaillent : installer Forgejo sur Coolify, Forgejo Actions pour CI/CD, Gitea vs Forgejo vs GitHub, migrer de GitHub vers Forgejo.
Forgejo vs Gitea : quelle différence
- Gitea est le projet historique (depuis 2016, fork de Gogs), supporté par une entreprise commerciale
- Forgejo est un fork communautaire de Gitea créé fin 2022 par Codeberg, suite à des désaccords sur la gouvernance. Compatible binaire avec Gitea.
- Les deux partagent la même base de code à ~95 %. Forgejo intègre rapidement des fonctionnalités communautaires que Gitea peut être plus lent à valider.
Recommandation 2026 : Forgejo pour la majorité des nouveaux déploiements, gouvernance communautaire saine. Gitea reste valide si vous l’utilisez déjà ou préférez le projet historique. Voir notre comparatif détaillé.
Pourquoi self-host votre forge Git
- Souveraineté complète : votre code source reste chez vous
- Coût fixe : 5 €/mois VPS Hetzner pour autant de repos et utilisateurs que vous voulez
- Pas de limites : pas de comptage minutes CI ou stockage LFS
- Données client confidentielles : critique pour cabinets, conseils, entités gouvernementales
- Performance locale :
git cloneultra-rapide vs GitHub depuis Afrique - Conformité : RGPD, CDP Sénégal, exigences sectorielles
Fonctionnalités
- Repos Git (HTTP/HTTPS, SSH)
- Issues, milestones, labels
- Pull requests avec review
- Wiki par repo
- Releases (binaires + assets)
- Container Registry (Docker images)
- Package Registry (npm, PyPI, Composer, Cargo, etc.)
- CI/CD intégré (Actions, runners)
- OAuth2 / OIDC SSO
- Webhooks, API REST complète
- Mirroring (push vers GitHub par exemple)
Prérequis
- VPS Linux 2 vCPU / 2 Go RAM minimum (4 Go recommandés si CI/CD activé)
- Domaine pointant sur le VPS
- Reverse proxy avec HTTPS (Caddy, Traefik via Coolify)
- Base SQLite ou PostgreSQL (Postgres recommandé en prod)
- Niveau intermédiaire
- Temps : 30 min Coolify, 2-4h installation manuelle complète
Étape 1 — Installer via Coolify (le plus simple)
Coolify a Forgejo dans sa marketplace. Voir notre tutoriel Coolify Forgejo. En 10 minutes vous avez une instance fonctionnelle avec HTTPS.
Étape 2 — Installer manuellement (Docker)
# docker-compose.yml
version: "3"
services:
forgejo:
image: codeberg.org/forgejo/forgejo:7
container_name: forgejo
environment:
- USER_UID=1000
- USER_GID=1000
- FORGEJO__database__DB_TYPE=postgres
- FORGEJO__database__HOST=db:5432
- FORGEJO__database__NAME=forgejo
- FORGEJO__database__USER=forgejo
- FORGEJO__database__PASSWD=secret
restart: always
networks:
- forgejo
volumes:
- ./forgejo-data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "127.0.0.1:3000:3000"
- "2222:22"
depends_on:
- db
db:
image: postgres:16
restart: always
environment:
- POSTGRES_USER=forgejo
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=forgejo
networks:
- forgejo
volumes:
- ./postgres-data:/var/lib/postgresql/data
networks:
forgejo:
docker compose up -d
Étape 3 — Reverse proxy Caddy
# /etc/caddy/Caddyfile
git.exemple.sn {
reverse_proxy 127.0.0.1:3000
}
Étape 4 — Configuration initiale
- Ouvrir
https://git.exemple.sn - Wizard d’installation : choisir Postgres, configurer admin
- Créer le compte admin (premier utilisateur enregistré devient admin)
- Settings → Disable open registration si forge privée
- Settings → Enable webhooks, OAuth2 si besoin
Étape 5 — Activer Forgejo Actions
Forgejo Actions est compatible 90 % avec GitHub Actions. Vous pouvez réutiliser vos workflows YAML quasi tels quels. Voir notre tutoriel CI/CD Forgejo.
Étape 6 — Migrer depuis GitHub
Forgejo a un import GitHub natif (avec issues, PR, wiki, releases). Voir notre tutoriel migration GitHub → Forgejo.
Étape 7 — Backups
# Backup quotidien : data + DB
#!/bin/bash
DATE=$(date +%Y%m%d)
docker exec forgejo /bin/bash -c "su git -c 'forgejo dump -c /data/gitea/conf/app.ini'"
docker cp forgejo:/data/gitea/forgejo-dump-*.zip /tmp/
aws s3 cp /tmp/forgejo-dump-*.zip s3://backups/forgejo/
rm /tmp/forgejo-dump-*.zip
Adaptation Afrique de l’Ouest
Pour une PME ouest-africaine de 5-20 développeurs, Forgejo sur VPS Hetzner CX23 (4 €/mois) remplace efficacement GitHub Team (4 USD/user/mois soit 20-80 USD pour la même équipe). Économie annuelle de 200-1000 USD, plus la souveraineté du code. Latence Afrique vers Helsinki ~150 ms, acceptable pour git push/pull.
Erreurs fréquentes
| Erreur | Cause | Solution |
|---|---|---|
| SSH push échoue | Port 22 conflit avec OS SSH | Mapper SSH Forgejo sur 2222 |
| Webhook timeout | Réseau lent | Augmenter timeout webhooks |
| Out of memory | VPS < 2 Go | Désactiver indexer ou monter en gamme |
| Backup volumineux | LFS objects | Backup séparé LFS storage |
Lectures complémentaires
- Installer Forgejo sur Coolify
- Forgejo Actions CI/CD
- Gitea vs Forgejo vs GitHub
- Migrer GitHub vers Forgejo
- Documentation Forgejo : forgejo.org/docs
Hébergement recommandé pour les lecteurs
Si vous n’avez pas encore d’hébergeur, Hostinger est celui que nous utilisons et que nous recommandons après plusieurs années d’usage.
Lien d affiliation. Si vous achetez via ce lien, le blog reçoit une petite commission sans surcoût pour vous.
Étape 1 — Choisir entre Forgejo et Gitea en 2026
Forgejo est le fork communautaire de Gitea, né fin 2022 quand Gitea Ltd a transformé le projet en société commerciale. Pour une équipe à Dakar, Lomé ou Bamako qui veut héberger son code en local et garder la maîtrise totale (souveraineté technique réelle, pas de dépendance à GitHub), les deux logiciels sont quasi identiques en usage. La différence : Forgejo est gouverné par Codeberg e.V., association à but non lucratif allemande, et garantit que le code reste open source AGPLv3 sans clause CLA. Gitea reste sous licence MIT mais avec une roadmap pilotée par une entreprise.
Recommandation pratique : nouveau projet en 2026 → Forgejo. Migration depuis un Gitea existant → restez sur Gitea ou basculez sur Forgejo (la migration est triviale, le format de base est identique). Les commandes ci-dessous fonctionnent à l’identique sur les deux.
Étape 2 — Installer Forgejo avec Docker Compose et Postgres
L’installation propre tourne sur un VPS à 4 Go RAM minimum (10 EUR par mois soit 6 560 FCFA au taux fixe). On évite SQLite en production : Postgres encaisse bien mieux les pics de CI et le multi-utilisateur.
mkdir forgejo && cd forgejo
mkdir -p data postgres
cat > docker-compose.yml <<'EOF'
services:
forgejo:
image: codeberg.org/forgejo/forgejo:9
container_name: forgejo
environment:
USER_UID: 1000
USER_GID: 1000
FORGEJO__database__DB_TYPE: postgres
FORGEJO__database__HOST: db:5432
FORGEJO__database__NAME: forgejo
FORGEJO__database__USER: forgejo
FORGEJO__database__PASSWD: ${DB_PASS}
restart: always
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "127.0.0.1:3000:3000"
- "0.0.0.0:222:22"
depends_on:
db:
condition: service_healthy
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: forgejo
POSTGRES_USER: forgejo
POSTGRES_PASSWORD: ${DB_PASS}
volumes:
- ./postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U forgejo"]
interval: 5s
EOF
echo "DB_PASS=$(openssl rand -base64 24)" > .env
docker compose up -d
docker compose logs -f forgejo | head -40
Au bout de 30 secondes, les logs doivent afficher « Listen: http://0.0.0.0:3000 ». Ouvrez http://127.0.0.1:3000 via tunnel SSH ou directement si DNS/proxy en place : l’écran d’installation Forgejo s’affiche. Renseignez le chemin de base, validez Postgres, créez le compte admin (jamais « admin » ni « root » comme login).
Étape 3 — Mettre Forgejo derrière Caddy avec HTTPS
Le port 3000 ne doit pas être exposé directement. Caddy gère HTTPS Let’s Encrypt automatique et on accède via git.votre-domaine.com.
sudo tee /etc/caddy/Caddyfile <<'EOF'
git.votre-domaine.com {
reverse_proxy 127.0.0.1:3000
encode gzip zstd
request_body {
max_size 1GB
}
header {
Strict-Transport-Security "max-age=31536000"
}
}
EOF
sudo systemctl reload caddy
curl -I https://git.votre-domaine.com
Le request_body max_size 1GB est crucial : sans cette directive, le push d’un dépôt avec gros assets (par exemple un projet React Native Android avec apk de release) échoue avec « 413 Request Entity Too Large ». La réponse curl doit afficher HTTP/2 200 et un certificat valide. Si HTTP/1.1, vérifiez que Caddy 2.7+ est installé.
Étape 4 — Configurer SSH pour push/pull Git
Le port SSH du conteneur est mappé sur le 222 de l’hôte. On configure les utilisateurs côté Forgejo pour qu’ils ajoutent leur clef publique dans Settings → SSH/GPG Keys.
# Sur la machine du dev
ssh-keygen -t ed25519 -C "dev@votre-org" -f ~/.ssh/forgejo_ed25519
cat ~/.ssh/forgejo_ed25519.pub
# Coller dans Forgejo Settings → SSH Keys
# Configurer SSH pour utiliser la clef et le port 222
cat >> ~/.ssh/config <<'EOF'
Host git.votre-domaine.com
Port 222
User git
IdentityFile ~/.ssh/forgejo_ed25519
EOF
# Test
ssh -T git@git.votre-domaine.com
Le test doit retourner « Hi votre-login! You’ve successfully authenticated, but Forgejo does not provide shell access. » Ce message d’erreur est en réalité un succès : Forgejo bloque le shell par sécurité mais accepte l’authentification Git. Si vous voyez « Permission denied », la clef publique n’est pas correctement copiée — vérifiez qu’il n’y a pas de retour chariot.
Étape 5 — Mettre en place les runners CI Forgejo Actions
Forgejo Actions reproduit la syntaxe GitHub Actions. Pour exécuter les workflows, il faut un ou plusieurs runners. Le plus simple : un runner Docker sur le même VPS pour les petits projets, des runners dédiés sur d’autres machines pour scaler.
# Récupérer le token d'enregistrement depuis Site Administration → Runners
export RUNNER_TOKEN="xxxxxxxx"
docker run -d --name forgejo-runner \
--restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v forgejo-runner-data:/data \
-e FORGEJO_INSTANCE_URL=https://git.votre-domaine.com \
-e FORGEJO_RUNNER_REGISTRATION_TOKEN=$RUNNER_TOKEN \
code.forgejo.org/forgejo/runner:6 register --no-interactive --name vps-runner
docker logs forgejo-runner --tail 20
Les logs doivent afficher « runner registered successfully » puis « Starting runner daemon ». De retour dans Site Administration → Runners, le runner apparaît « online » (point vert). Créez ensuite un fichier .forgejo/workflows/ci.yml dans un dépôt test avec un simple echo "hello" : il doit s’exécuter sous 30 secondes au prochain push.
Étape 6 — Migrer un dépôt depuis GitHub ou GitLab
Forgejo offre une migration native qui rapatrie code, issues, pull requests, milestones et labels. C’est l’occasion pour beaucoup d’équipes basées en Afrique de l’Ouest de quitter GitHub Free (limites de minutes Actions) sans perdre l’historique.
# Dans Forgejo : + → New Migration → GitHub
# Renseigner :
# - URL : https://github.com/votre-org/votre-repo
# - Token GitHub (Personal Access Token avec scopes repo, read:org)
# - Cocher : Issues, Pull Requests, Releases, Labels, Milestones, Wiki
# Pour une migration en CLI (gros volumes, plusieurs dépôts) :
docker exec -u 1000 forgejo forgejo admin migrate-storage \
--type repos --storage local
La migration d’un repo de 500 Mo avec 200 issues prend environ 4 à 8 minutes selon la connexion. Vérifiez ensuite la complétude : nombre de commits identique (git log --oneline | wc -l), issues fermées toujours fermées, releases avec leurs assets binaires. Une issue manquante = un token GitHub avec un scope insuffisant, à régénérer.
Étape 7 — Sauvegarder Forgejo correctement
Trois éléments à sauvegarder : la base Postgres, le dossier data/ (qui contient les dépôts Git en bare), et le fichier de configuration data/gitea/conf/app.ini.
cat > /opt/forgejo-backup.sh <<'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d-%H%M)
DEST=/opt/backups/forgejo
mkdir -p $DEST
# Dump Postgres
docker compose -f /home/ubuntu/forgejo/docker-compose.yml exec -T db \
pg_dump -U forgejo forgejo | gzip > $DEST/db-$DATE.sql.gz
# Snapshot dossier data (dépôts Git + config)
tar czf $DEST/data-$DATE.tar.gz -C /home/ubuntu/forgejo data
# Rotation 14 jours
find $DEST -name "*.gz" -mtime +14 -delete
EOF
chmod +x /opt/forgejo-backup.sh
echo "0 2 * * * /opt/forgejo-backup.sh" | sudo crontab -
Le lendemain, vérifiez la taille des deux fichiers : le dump Postgres fait au minimum 200 Ko (vide = problème de connexion), l’archive data au minimum la somme des dépôts hébergés. Restauration : décompresser data dans un répertoire vierge, restaurer le dump avec gunzip -c | psql, redémarrer la stack.
Étape 8 — Mettre à jour Forgejo en sécurité
Forgejo suit un cycle de release semestriel pour les versions majeures et mensuel pour les patches. Mettre à jour = changer le tag dans docker-compose.yml puis pull + restart.
cd ~/forgejo
/opt/forgejo-backup.sh
sed -i 's|forgejo:9|forgejo:9.0.3|' docker-compose.yml # version exacte
docker compose pull
docker compose up -d
docker compose logs -f forgejo | grep -E "version|migration"
Les logs doivent afficher la nouvelle version et « Database migrated to current version ». Une migration qui échoue laisse le service en boucle de redémarrage : restaurez immédiatement la version précédente avec sed -i 's|forgejo:9.0.3|forgejo:9|' + docker compose up -d, puis ouvrez une issue sur codeberg.org/forgejo/forgejo.
Pour automatiser le déploiement de vos applications depuis Forgejo, voyez notre tutoriel Forgejo Actions deploy VPS. Pour comparer avec GitLab CE auto-hébergé, consultez le comparatif Forgejo vs GitLab CE.