Self-hosting10 min de lecture

Héberger Forgejo sur votre VPS : guide complet 2025

Forgejo est la forge Git libre et auto-hébergeable qui a émergé comme alternative communautaire à Gitea. Légère, compatible GitHub Actions et respectueuse de vos données, elle s'installe en moins d'une heure sur un VPS. Ce guide couvre l'intégralité du chemin : dimensionnement du serveur, déploiement Docker, configuration SSL, runners CI/CD, durcissement post-installation et mise à jour sans coupure.

Pourquoi choisir Forgejo pour votre forge Git auto-hébergée

Forgejo est né en 2022 d'un fork de Gitea, motivé par des inquiétudes sur la gouvernance du projet. Son développement est entièrement communautaire, sous licence MIT, sans dépendance à une société commerciale. Pour les équipes qui veulent contrôler leur code source, leur pipeline CI/CD et leurs artefacts sans passer par GitHub, GitLab ou Bitbucket, Forgejo représente la solution la plus légère du marché. L'interface est familière pour tout développeur ayant utilisé GitHub, la migration depuis Gitea est transparente et la compatibilité avec les GitHub Actions simplifie l'adoption.

Bénéfices concrets d'un Forgejo auto-hébergé

  • Souveraineté totale : votre code ne quitte jamais votre infrastructure
  • Compatible GitHub Actions via Forgejo Actions — réutilisez vos workflows existants
  • Empreinte mémoire très faible (256 Mo RAM pour une petite équipe)
  • Registre de paquets intégré : npm, PyPI, Maven, Helm, container OCI
  • Pas de limite sur le nombre de dépôts privés ni de collaborateurs
  • Fédération ActivityPub en cours de standardisation — interopérabilité future avec d'autres forges
  • Licences OSS, auditable, sans surprise de tarification
  • Mises à jour maîtrisées : vous choisissez quand migrer

Prérequis matériels et logiciels chiffrés

Avant de lancer Forgejo, dimensionnez votre VPS selon la taille réelle de votre équipe. Pour 1 à 5 développeurs avec quelques dizaines de dépôts, 1 vCPU et 1 Go de RAM suffisent ; Forgejo au repos consomme environ 80 Mo. Pour 5 à 20 développeurs avec CI/CD active, prévoyez 2 vCPU et 2 Go de RAM. Au-delà de 20 développeurs ou pour des dépôts de grande taille (monorepos, binaires), 4 vCPU et 4 Go de RAM garantissent une expérience fluide. Côté stockage, comptez le volume de vos dépôts Git plus 20 % de marge pour les artefacts et les sauvegardes.

Sur le plan réseau, trois ports doivent être ouverts dans votre pare-feu : le port 80 (HTTP, pour la validation Let's Encrypt), le port 443 (HTTPS, trafic web) et le port 2222 (SSH Git, pour éviter le conflit avec le SSH d'administration sur 22). Côté logiciel, vous avez besoin de Docker Engine ≥ 24, Docker Compose v2 et d'un nom de domaine pointant vers votre VPS.

Déployer Forgejo avec Docker et SSL

01

Préparer l'environnement

Créez les répertoires qui persisteront les données hors du conteneur :

mkdir -p /opt/forgejo/{data,config,db}
chown -R 1000:1000 /opt/forgejo

Créez le fichier /opt/forgejo/.env avec vos valeurs :

FORGEJO_DOMAIN=git.mondomaine.com
FORGEJO_SSH_PORT=2222
POSTGRES_PASSWORD=changez_ce_mot_de_passe
02

Créer le docker-compose.yml

services:
  forgejo:
    image: codeberg.org/forgejo/forgejo:latest
    restart: unless-stopped
    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=${POSTGRES_PASSWORD}
    volumes:
      - /opt/forgejo/data:/data
    ports:
      - "3000:3000"
      - "${FORGEJO_SSH_PORT:-2222}:22"
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      - POSTGRES_DB=forgejo
      - POSTGRES_USER=forgejo
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    volumes:
      - /opt/forgejo/db:/var/lib/postgresql/data
03

Démarrer les services

cd /opt/forgejo
docker compose up -d
docker compose logs -f forgejo

Attendez que la ligne Listen on :3000 apparaisse. Forgejo effectue ses migrations de schéma automatiquement au premier démarrage.

04

Configurer le reverse proxy et SSL avec Caddy

Caddy est le choix le plus simple pour obtenir un certificat Let's Encrypt automatique. Installez-le puis créez /etc/caddy/Caddyfile :

git.mondomaine.com {
  reverse_proxy localhost:3000
}

Démarrez Caddy : systemctl enable --now caddy. Le certificat TLS est émis et renouvelé automatiquement. Si vous préférez nginx, configurez un bloc proxy_pass http://127.0.0.1:3000; classique avec Certbot.

05

Finaliser la configuration de l'instance

Ouvrez https://git.mondomaine.com dans votre navigateur. L'assistant de configuration s'affiche une seule fois. Renseignez le domaine, l'URL SSH (ssh://git.mondomaine.com:2222), l'adresse e-mail de l'administrateur et désactivez l'inscription publique dès cet écran si votre forge est à usage privé. Une fois l'assistant validé, la configuration est verrouillée dans /opt/forgejo/data/gitea/conf/app.ini.

06

Installer un runner Forgejo Actions

Sur le même serveur ou une machine dédiée, récupérez le token dans *Administration du site → Runners*. Déployez le runner via Docker :

services:
  runner:
    image: code.forgejo.org/forgejo/act_runner:latest
    restart: unless-stopped
    environment:
      - FORGEJO_INSTANCE_URL=https://git.mondomaine.com
      - FORGEJO_RUNNER_TOKEN=votre_token
      - FORGEJO_RUNNER_NAME=runner-principal
      - FORGEJO_RUNNER_LABELS=ubuntu-latest:docker://node:20,docker:docker://docker:dind
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

Le runner apparaît dans l'interface dans la minute. Il peut exécuter des jobs en mode Docker (isolation complète, recommandé), Process (sans Docker, pour des tâches shell légères) ou Auto (détecte selon le label du workflow).

Écrire vos premiers workflows Forgejo Actions

La compatibilité avec la syntaxe GitHub Actions est très large. Créez le fichier .forgejo/workflows/ci.yml à la racine de votre dépôt :

on:
  push:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run tests
        run: |
          npm ci
          npm test

Les labels runs-on correspondent aux labels déclarés lors de l'enregistrement du runner. Vous pouvez définir plusieurs runners avec des labels différents (ex. arm64, gpu, high-memory) et cibler le bon environnement par job. Les artefacts et le cache fonctionnent avec les mêmes actions officielles que sur GitHub.

Sécurité post-installation : les réglages essentiels

Un Forgejo fraîchement installé est fonctionnel mais pas durci. Voici les six points à traiter impérativement avant d'ouvrir la forge à votre équipe.

Désactiver l'inscription publique. Dans *Administration du site → Paramètres → Utilisateurs*, décochez « Autoriser l'inscription d'utilisateurs ». Sur une forge interne, personne ne doit pouvoir créer un compte sans invitation.

Activer la 2FA pour les administrateurs. Chaque compte admin doit activer l'authentification à deux facteurs dans *Paramètres → Sécurité*. Forcez la 2FA pour l'ensemble des utilisateurs via le paramètre REQUIRE_SIGNIN_VIEW et les politiques de sécurité organisationnelle.

SSH par clé uniquement. Désactivez l'authentification par mot de passe dans /etc/ssh/sshd_config du serveur hôte (PasswordAuthentication no). Pour le SSH Git (port 2222), Forgejo n'accepte que les clés publiques enregistrées dans les profils utilisateurs — c'est son comportement par défaut.

Secrets de webhooks. Lors de la création de chaque webhook (vers votre CI externe, Slack, etc.), renseignez toujours le champ *Secret*. Forgejo signe la charge utile avec HMAC-SHA256 ; votre récepteur doit vérifier cette signature avant de traiter l'événement.

Packages privés. Si vous utilisez le registre de paquets intégré, configurez la visibilité par défaut sur *Privé* dans les paramètres d'organisation. Les tokens d'accès pour publier doivent avoir une portée minimale (packages:write uniquement, jamais un token admin global).

Pare-feu. Fermez tous les ports sauf 80, 443 et 2222. Le port 3000 (Forgejo interne) ne doit jamais être exposé directement ; il est consommé uniquement par le reverse proxy en loopback.

Mettre à jour Forgejo sans interruption

La procédure de mise à jour Docker est simple et ne nécessite que quelques secondes d'indisponibilité.

cd /opt/forgejo
# 1. Tirer la nouvelle image
docker compose pull forgejo

# 2. Sauvegarder la base avant toute migration
docker compose exec db pg_dump -U forgejo forgejo > backup-$(date +%Y%m%d).sql

# 3. Redémarrer le service
docker compose up -d forgejo

# 4. Vérifier les migrations de schéma
docker compose logs forgejo | grep -i migrat

Forge exécute ses migrations automatiquement au démarrage. Vérifiez que la ligne Finished successfully apparaît dans les logs. En cas d'erreur de migration, restaurez la sauvegarde SQL et signalez le problème sur le tracker Forgejo. Consultez les notes de version avant chaque saut de version majeure — les migrations entre versions majeures peuvent nécessiter une étape intermédiaire.

Migrer depuis Gitea en cinq minutes

Forgejo est un fork direct de Gitea : son schéma de base de données est compatible jusqu'à la version 1.21. Pour migrer, arrêtez Gitea, copiez son répertoire de données (/data ou /opt/gitea) vers /opt/forgejo/data, remplacez l'image dans votre docker-compose et redémarrez. Forgejo détecte automatiquement le schéma Gitea et applique ses propres migrations. Vos dépôts, utilisateurs, clés SSH, webhooks et issues sont intégralement conservés. Pour les versions Gitea plus récentes, vérifiez la matrice de compatibilité sur le wiki Forgejo avant de migrer.

Dépannage : les erreurs les plus fréquentes

Connexion SSH refusée sur le port 2222. Vérifiez d'abord que le port est bien publié par Docker (docker compose ps → colonne Ports). Ensuite, testez depuis le client : ssh -p 2222 [email protected]. Si la réponse est PTY allocation request failed, la connexion fonctionne — Forgejo répond Hi <utilisateur>! You've successfully authenticated. Si vous obtenez Connection refused, le pare-feu bloque le port : ufw allow 2222/tcp.

Runner affiché offline dans l'interface. Le runner contacte Forgejo en HTTPS sortant. Vérifiez que le conteneur runner peut résoudre et atteindre git.mondomaine.com. Un certificat auto-signé nécessite de monter votre CA dans le conteneur. Redémarrez le runner après avoir corrigé la connectivité : docker compose restart runner.

Push rejeté par un hook pre-receive. Forgejo peut rejeter un push si un hook de protection de branche est actif (revue de code requise, tests CI obligatoires) ou si une règle de taille de fichier est dépassée. Le message d'erreur git contient le détail. Pour les gros binaires (> 100 Mo), utilisez Git LFS : Forgejo supporte le protocole LFS nativement.

Interface lente après plusieurs mois. Lancez le garbage collector Git sur les dépôts actifs depuis l'administration : *Administration → Dépôts → Git Repositories → Run Git GC*. Pour automatiser, configurez la tâche planifiée dans app.ini sous [cron.run_task].

Fédération ActivityPub : ce que Forgejo prépare

Forgejo est le premier projet de forge Git à implémenter la fédération via le protocole ActivityPub (le même que Mastodon). En version 1.20+, vous pouvez déjà suivre un dépôt distant hébergé sur une autre instance Forgejo fédérée et recevoir les notifications d'issues et de pull requests dans votre timeline locale. La fédération complète — fork cross-instance, pull request inter-forge — est en cours de standardisation au sein du groupe ForgeFed. Si vos collaborateurs sont sur des forges différentes, cette évolution permettra à terme de contribuer sans créer de compte sur chaque instance.

Forgejo vs Gitea vs GitLab CE : choisir sa forge

CritèreForgejoGiteaGitLab CE
GouvernanceCommunauté (Codeberg e.V.)Société commerciale (Gitea Ltd)Société commerciale (GitLab Inc)
RAM minimale~80 Mo~80 Mo~4 Go
Compatibilité GitHub ActionsOui (Forgejo Actions)Oui (Gitea Act)Non (CI propriétaire)
Registre de paquetsOui (multi-format)OuiOui
Fédération ActivityPubEn cours (ForgeFed)NonNon
Migration depuis GitHubOui (miroir + import)OuiOui
Interface d'administrationSimple, intégréeSimple, intégréeComplète mais lourde
LicenceMITMITMIT (CE) / EE (payant)
Fréquence des releasesMensuelleMensuelleMensuelle

Votre forge Git souveraine sur un VPS ServOrbit

Avec un VPS Cloud équipé de Debian et Docker, déployez Forgejo, son service Actions et son registre de paquets en quelques minutes. Ressources dédiées, IPv4 incluse, aucun partage de ressources.

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.