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.