Set-OPS-Public/roles/serveur_forgejo/templates/app.ini.j2
Daniel Allaire ffb515cf3c idempotence : Prometheus trie ses cibles, Forgejo conserve son secret JWT
Prometheus : intersect rend un ENSEMBLE, dont l'ordre d'iteration n'est pas
stable d'un processus a l'autre. Le fichier se rendait differemment a chaque
passage — memes cibles, ordre different — et le service redemarrait pour rien.
Trie sur les hotes.

Forgejo : JWT_SECRET est genere par le service et ajoute par lui a la fin
d'app.ini. Le gabarit ne le portait pas, donc chaque rendu l'EFFACAIT et
Forgejo en generait un nouveau. Ce n'etait pas du bruit : chaque deploiement
invalidait les jetons OAuth2 emis par la forge. Le role le relit et le repose ;
meme empreinte avant/apres, changed=0 aux 2e et 3e passages.

Trois erreurs de methode de ma part dans cette enquete :
- conclu « diff vide donc contenu identique » alors que no_log masquait le diff
- applique un replace sur le gabarit SANS verifier qu'il avait pris (la section
  [oauth2] n'existait pas), affiche un succes, et interprete trois passages sur
  cette base
- garde une expression Jinja indiagnosticable en place a cause de no_log

Verifier l'effet, pas l'intention — un replace qui ne trouve rien reussit
silencieusement, exactement comme kcadm -s sur une map.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 14:44:03 -04:00

81 lines
2.9 KiB
Django/Jinja

; Gere par Set-OPS (role serveur_forgejo). Ne pas editer a la main.
APP_NAME = {{ serveur_forgejo_app_name }}
RUN_USER = {{ serveur_forgejo_utilisateur }}
RUN_MODE = prod
WORK_PATH = {{ serveur_forgejo_data }}
[server]
DOMAIN = {{ serveur_forgejo_hostname }}
ROOT_URL = https://{{ serveur_forgejo_hostname }}/
HTTP_ADDR = {{ serveur_forgejo_http_addr }}
HTTP_PORT = {{ serveur_forgejo_http_port }}
SSH_DOMAIN = {{ serveur_forgejo_hostname }}
[database]
DB_TYPE = postgres
HOST = {{ serveur_forgejo_db_host }}:{{ serveur_forgejo_db_port | default(5432) }}
NAME = {{ serveur_forgejo_entree.base }}
USER = {{ serveur_forgejo_entree.proprietaire }}
PASSWD = {{ serveur_forgejo_db_password }}
SSL_MODE = {{ serveur_forgejo_db_sslmode | default('disable') }}
[security]
INSTALL_LOCK = true
SECRET_KEY = {{ serveur_forgejo_secret_key }}
INTERNAL_TOKEN = {{ serveur_forgejo_internal_token }}
[service]
{% if serveur_forgejo_oidc_actif %}
; Identites depuis l'annuaire via le SSO uniquement : pas d'inscription locale,
; mais auto-enregistrement des utilisateurs OIDC.
DISABLE_REGISTRATION = false
ALLOW_ONLY_EXTERNAL_REGISTRATION = true
{# `| bool` obligatoire : sans lui, une valeur transmise en CHAINE (« false » via
`-e`, ou un group_vars non typé) est vraie au sens Jinja et le bloc ne sort JAMAIS —
la connexion locale resterait ouverte en silence. Verifie par rendu reel. #}
{% if not serveur_forgejo_connexion_locale | bool %}
; Connexion interne fermee : le SSO est le seul chemin. Le compte local
; survit et se rattrape par `forgejo admin user change-password` (sudo).
ENABLE_INTERNAL_SIGNIN = false
ENABLE_BASIC_AUTHENTICATION = false
{% endif %}
{% else %}
DISABLE_REGISTRATION = true
{% endif %}
{% if serveur_forgejo_oidc_actif %}
[oauth2_client]
ENABLE_AUTO_REGISTRATION = true
USERNAME = preferred_username
ACCOUNT_LINKING = auto
{% endif %}
[mailer]
ENABLED = true
PROTOCOL = smtp
SMTP_ADDR = {{ serveur_forgejo_smtp }}
SMTP_PORT = 25
FROM = forge@{{ domaine_interne }}
[ui]
DEFAULT_THEME = {{ serveur_forgejo_theme }}
[ui.meta]
DESCRIPTION = {{ serveur_forgejo_meta_description }}
; --- Secret JWT : appartient au SERVICE, relu par le role -------------------------
; Forgejo genere ce secret au premier demarrage et l'ajoute lui-meme a la fin du
; fichier. Le gabarit ne le portait pas : chaque rendu l'EFFACAIT donc, Forgejo en
; generait un nouveau au redemarrage, et le passage suivant recommencait — autrement dit,
; chaque deploiement faisait tourner le secret JWT de la forge et invalidait les jetons
; qu'elle avait emis. Trouve par le passage d'idempotence du 2026-08-09 : seule ligne
; differente entre deux rendus.
;
; Le role le RELIT avant de rendre (tache « Relire le secret JWT ») et le repose ici.
; Vide au premier deploiement : Forgejo le genere alors, et les rendus suivants le
; conservent.
[oauth2]
{% if serveur_forgejo_jwt_secret | default("") %}
JWT_SECRET = {{ serveur_forgejo_jwt_secret }}
{% endif %}