2.2 : Déployer Forgejo avec Docker Compose

Le fichier, d’abord

Voici le docker-compose.yml que nous allons décortiquer. C’est une configuration réelle, en production — pas un exemple de documentation.

services:
  forge-server:
    image: codeberg.org/forgejo/forgejo:15
    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_PASSWORD}
      - FORGEJO__server__DOMAIN=forge.nordika.local
      - FORGEJO__server__ROOT_URL=https://forge.nordika.local/
      - FORGEJO__server__DISABLE_SSH=true
    restart: always
    networks:
      - forgejo
      - nginx-proxy
    volumes:
      - ./forgejo:/data
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16-alpine
    container_name: forgejo-db
    restart: always
    environment:
      - POSTGRES_USER=forgejo
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=forgejo
    networks:
      - forgejo
    volumes:
      - ./postgres:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U forgejo"]
      interval: 10s
      timeout: 5s
      retries: 5

networks:
  forgejo:
    external: false
    driver: bridge
    enable_ipv6: false
    ipam:
      config:
        - subnet: 10.149.8.0/24
          gateway: 10.149.8.1
  nginx-proxy:
    external: true

Deux services, deux réseaux, une trentaine de lignes. Reprenons chaque bloc.

Le service Forgejo

L’image et son étiquette

image: codeberg.org/forgejo/forgejo:15

Deux choses à noter.

L’image ne vient pas du Docker Hub, mais du registre de Codeberg — l’association qui héberge le projet. C’est le registre officiel de Forgejo.

Derrière un pare-feu d’entreprise ? Si codeberg.org n’est pas joignable depuis votre VM, le projet met à disposition un miroir : remplacez codeberg.org par data.forgejo.org dans le nom de l’image. Et à partir de la section 10, vous pourrez de toute façon recopier cette image dans votre propre registre pour ne plus dépendre d’aucun service externe.

L’étiquette est une version majeure, pas latest. La convention de nommage de Forgejo est précise et vaut la peine d’être connue :

Étiquette Signification
15 La dernière version mineure de la branche 15 (15.0.1, puis 15.0.2…)
15.0 La dernière correction de la 15.0
latest La dernière publiée, majeure comprise

La distinction est capitale, et la documentation officielle est explicite sur ce point : passer d’une majeure à la suivante — de 15 à 16 par exemple — nécessite une opération manuelle et une vérification humaine. En revanche, rester sur l’étiquette 15 vous apporte automatiquement les correctifs mineurs et de sécurité.

Autrement dit : latest sur un service de production, c’est accepter qu’un docker compose pull de routine déclenche une migration majeure non préparée. En épinglant la majeure, la montée de version redevient une décision.

Note de version : cette formation utilise la branche 15. La branche 16 est disponible ; les principes exposés ici restent valables, seule la valeur de l’étiquette change. Vérifiez les notes de version avant de franchir le pas.

Nous reparlerons de cette discipline en section 10, quand vous produirez vos propres images, et en section 14, consacrée à la mise à jour de la forge.

Les identifiants système

- USER_UID=1000
- USER_GID=1000

Le processus dans le conteneur travaillera sous cet identifiant. Le dossier ./forgejo de l’hôte doit lui appartenir, sinon Forgejo ne pourra pas écrire.

C’est la cause numéro un des échecs de premier démarrage. Nous préparerons le terrain correctement plus bas.

Les variables FORGEJO__ : comprendre la convention

C’est le point le plus utile de cette leçon, parce qu’il vous rendra autonome sur toute la configuration à venir.

Forgejo se configure normalement par un fichier app.ini, structuré en sections :

[database]
DB_TYPE = postgres
HOST = db:5432

[server]
DOMAIN = forge.nordika.local

L’image Docker permet de piloter ce fichier par des variables d’environnement, selon une règle simple :

FORGEJO__<section>__<CLE>=<valeur>
        ↑↑        ↑↑
   deux underscores entre chaque partie

Ainsi :

Variable d’environnement Équivalent app.ini
FORGEJO__database__DB_TYPE section [database], clé DB_TYPE
FORGEJO__server__DOMAIN section [server], clé DOMAIN
FORGEJO__service__DISABLE_REGISTRATION section [service], clé DISABLE_REGISTRATION

Le double underscore est le séparateur — un simple underscore fait partie du nom de la clé (DB_TYPE). C’est l’erreur de saisie la plus fréquente.

📎 Ressources 2