Some checks are pending
verifier / verifier (push) Waiting to run
Doute de l'exploitant sur patient 0 : « je doute de la pertinence de pgsql ». Mesure plutot que discussion. REDIS NE SERVAIT A RIEN : le role serveur_forgejo ne le mentionne ni dans son app.ini, ni dans ses defauts, et ne declare aucun lien. Heritage du modele `forge`. Retire du plan. POSTGRESQL ETAIT EXIGE PAR LE ROLE : DB_TYPE = postgres en dur, resoudre_base sans condition. Le doute etait fonde, le moteur ne savait pas faire autrement. INTERRUPTEUR `serveur_forgejo_bd: postgres|sqlite`. En sqlite la base devient un FICHIER sous serveur_forgejo_data. Ce que ca change ailleurs : rien. Le job de sauvegarde `serveur_forgejo` emporte deja ce dossier ; PGSSLROOTCERT etait deja conditionne au mode TLS ; et P35 lit desormais l'interrupteur (convention `<role>_bd`, group_vars de l'instance puis defaut du role), donc n'attend aucune entree de registre. Une valeur inconnue est REFUSEE au debut du role plutot que de retomber en silence sur PostgreSQL. PATIENT 0 PASSE DE SIX A QUATRE MACHINES (Dovecot, Redis, PostgreSQL et sa VM). Sur la machine dont tout descend, chaque service en moins est une chose de moins a defendre, a sauvegarder et a rebatir. Et l'effet depasse patient 0 : une offre `forge` pour un petit organisme cesse d'exiger une VM PostgreSQL. LA NEUVIEME. En verifiant P35 sur patient 0, elle a rendu un verdict JUSTE SUR LE MAUVAIS ECOSYSTEME : `plan = RACINE / "instance" / "plan"`, le symlink en dur. Neuvieme resolution d'instance codee en dur en cinq jours. Ce n'est plus une serie de bogues, c'est une piece manquante : une resolution unique et partagee, a faire en une fois et de tete reposee. Enseigne : SQLite au glossaire (P39 l'exige desormais), et le README du role documente l'interrupteur et ce qu'il ne change pas. make verifier 40/40 ; make ci 40/40 ; lint et syntaxe du role verts. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
88 lines
3.2 KiB
Django/Jinja
88 lines
3.2 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]
|
|
{% if serveur_forgejo_bd == 'sqlite' %}
|
|
; Un FICHIER, pas un serveur. Il vit dans les donnees de Forgejo, donc la sauvegarde
|
|
; existante l'emporte deja — rien de special a prevoir.
|
|
DB_TYPE = sqlite3
|
|
PATH = {{ serveur_forgejo_db_chemin }}
|
|
{% else %}
|
|
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') }}
|
|
{% endif %}
|
|
|
|
[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 %}
|
|
|