Développement Web

Forgejo / Gitea self-hosted 2026 : guide complet (forge Git souveraine)

11 دقائق للقراءة

📚 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 clone ultra-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

  1. Ouvrir https://git.exemple.sn
  2. Wizard d’installation : choisir Postgres, configurer admin
  3. Créer le compte admin (premier utilisateur enregistré devient admin)
  4. Settings → Disable open registration si forge privée
  5. 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

ErreurCauseSolution
SSH push échouePort 22 conflit avec OS SSHMapper SSH Forgejo sur 2222
Webhook timeoutRéseau lentAugmenter timeout webhooks
Out of memoryVPS < 2 GoDésactiver indexer ou monter en gamme
Backup volumineuxLFS objectsBackup séparé LFS storage

Lectures complémentaires

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.

Profiter de l’offre →

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.

مشاركة