Set-OPS-Public/roles/serveur_forgejo/defaults/main.yml
Daniel Allaire 15cdb7d454
Some checks are pending
verifier / verifier (push) Waiting to run
patient 0 debout — et quatre defauts que seul un ecosysteme DIFFERENT pouvait montrer
Quatre machines, zero echec, la forge repond (service actif, ecoute 3000, HTTP 200).
forge-01 121 taches, infra-pki-01 109, infra-edge-01 92, infra-dns-01 84.

1. UN TIERS INTERMITTENT ARRETAIT TOUT. `packages.smallstep.com` repond une fois sur deux ;
   `get_url` abandonne a 10 s sans reprise. Mesure AVANT d'accuser le reseau : DNS
   resolvait, la poignee TLS aboutissait, 138 Ko depuis deb.debian.org passaient en 0,09 s,
   et le chemin acceptait 1450 octets en refusant 1500 — l'attendu exact en overlay. Le
   reseau n'y etait pour rien. Reprises posees sur les trois telechargements du chemin
   critique (serveur_step_ca, client_pki, serveur_forgejo). Une dizaine d'autres restent
   sans reprise : liste dans le CHANGELOG.

2. UN `register` A ECRASE UN CHEMIN DE FICHIER. En posant la reprise, j'ai enregistre dans
   `client_pki_cle`, nom que le role utilisait deja pour la cle privee. L'ecart s'est vu 70
   taches plus loin : `step ca certificate` recevait un dict serialise a la place du
   fichier et refusait « too many positional arguments ». Un register ecrit dans l'espace
   de noms de TOUT le role.

3. LE SSO SE DECLARAIT AU LIEU DE SE DERIVER. `serveur_forgejo_oidc_actif: true` en dur
   faisait cabler une source OAuth2 vers un Keycloak inexistant. Derive desormais de
   l'inventaire. Quatrieme manifestation en deux jours de la meme hypothese — le moteur
   supposait l'ecosysteme COMPLET — apres les intrants (P32), les bases (P35) et les
   dependances causales.

AUCUN de ces defauts n'etait visible sur Chezlepro, qui porte tout et tournait deja. Ils ne
pouvaient apparaitre qu'au premier ecosysteme DIFFERENT.

make verifier 41 OK, 0 echec, 0 saute ; make test inchange.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 02:53:44 -04:00

137 lines
8.2 KiB
YAML

---
# Version Forgejo : verifier/ajuster sur https://forgejo.org/download/
serveur_forgejo_version: "16.0.2"
serveur_forgejo_url: >-
https://codeberg.org/forgejo/forgejo/releases/download/v{{ serveur_forgejo_version }}/forgejo-{{ serveur_forgejo_version }}-linux-amd64
serveur_forgejo_binaire: "/usr/local/bin/forgejo"
serveur_forgejo_utilisateur: "git"
serveur_forgejo_data: "/var/lib/forgejo"
serveur_forgejo_config_dir: "/etc/forgejo"
serveur_forgejo_config: "/etc/forgejo/app.ini"
serveur_forgejo_service: "forgejo"
# Publication (derriere serveur_nginx, TLS a l'edge).
serveur_forgejo_hostname: "forge.{{ domaine_interne }}"
# --- Identité visuelle (branding, léger). serveur_forgejo_branding=true déploie le
# dossier custom/ (logo, favicon, accent aurore CSS, page d'accueil brandée).
serveur_forgejo_app_name: "Forgejo"
serveur_forgejo_theme: "forgejo-auto"
serveur_forgejo_meta_description: "Forge git souveraine."
serveur_forgejo_branding: false
# Adresse d'ecoute : 0.0.0.0 car l'edge nginx est sur un AUTRE hote (le distant doit
# joindre le backend). A restreindre par pare-feu (nftables) au reseau interne / a l'edge.
serveur_forgejo_http_addr: "0.0.0.0"
serveur_forgejo_http_port: 3000
# Base de donnees : resolue depuis le registre par le groupe consommateur.
serveur_forgejo_groupe: "serveur_forgejo"
serveur_forgejo_db_host: "" # dérivé (FQDN) par resoudre_base au déploiement
# Relais courriel.
serveur_forgejo_smtp: "infra-mail-01.{{ domaine_interne }}"
# Secrets OBLIGATOIRES (Ansible Vault).
serveur_forgejo_secret_key: "{{ vault_forgejo_secret_key | default('') }}" # rempli depuis la voute (vault_forgejo_secret_key)
serveur_forgejo_internal_token: "{{ vault_forgejo_internal_token | default('') }}" # rempli depuis la voute (vault_forgejo_internal_token)
serveur_forgejo_admin_user: "forgejo-admin"
serveur_forgejo_admin_email: "admin@{{ domaine_interne }}"
serveur_forgejo_admin_password: "{{ vault_forgejo_admin | default('') }}" # rempli depuis la voute (vault_forgejo_admin)
# --- Connexion locale (accès de secours) ---
# `false` = le formulaire identifiant/mot de passe n'est PAS proposé au repos ; le SSO
# Keycloak est le seul chemin annoncé. Le compte local continue d'exister : on l'atteint
# par `sudo` sur l'hôte (voir docs/authentification.md), qui est le mécanisme de secours
# retenu. Une porte de connexion ouverte en permanence contournerait la politique de mot
# de passe, le MFA et surtout la révocation centrale — désactiver quelqu'un dans LDAP
# laisserait le compte local valide, sans que rien ne le signale.
# Forgejo : `ENABLE_INTERNAL_SIGNIN` n'existe QUE depuis la v10 — verifie sur le
# suivi amont (issue 7476, close : « This option was added to Forgejo v10 »). Le
# role epingle 10.0.0, donc le reglage mord. Sur une version anterieure il serait
# ignore EN SILENCE : c'est le cas ou une garde vaut mieux qu'un commentaire.
serveur_forgejo_connexion_locale: false
# --- SSO OIDC (Keycloak, realm applicatif) — « Se connecter avec <organisation> » ---
# Requiert client_pki (confiance step_ca) + résolution de l'hôte Keycloak (plancher/DNS).
# Le client OIDC doit exister dans le realm (serveur_keycloak_clients).
# LE SSO SUIT L'EXISTENCE D'UN FOURNISSEUR D'IDENTITE — il ne se declare pas (2026-08-23).
#
# `true` en dur faisait echouer le deploiement de tout ecosysteme SANS Keycloak : la forge
# tentait de cabler une source OAuth2 vers un fournisseur qui n'existe pas. C'est la
# quatrieme fois en deux jours que la meme hypothese se paie — le moteur supposait
# l'ecosysteme COMPLET, apres les intrants (P32), les bases (P35) et les dependances
# causales.
#
# Derive de l'inventaire : un groupe `serveur_keycloak` sans hote, c'est un ecosysteme sans
# identite federee. Surchargeable pour un IdP externe au plan.
serveur_forgejo_oidc_actif: "{{ (groups['serveur_keycloak'] | default([])) | length > 0 }}"
serveur_forgejo_oidc_nom: "{{ organisation | default('organisation') | lower | replace(' ', '-') }}" # slug du callback : /user/oauth2/<nom>/callback
serveur_forgejo_oidc_client_id: "forgejo"
serveur_forgejo_oidc_client_secret: "{{ vault_forgejo_oidc | default('') }}" # voûte (vault_forgejo_oidc)
serveur_forgejo_oidc_realm: "{{ identite_realm | default('chezlepro') }}"
# DERIVE de l'exposition declaree au plan (role `resoudre_idp`). La valeur
# ci-dessous n'est qu'un REPLI : `keycloak.<domaine>` n'est publie nulle part.
serveur_forgejo_oidc_repli: >-
https://keycloak.{{ domaine_interne }}/realms/{{ serveur_forgejo_oidc_realm }}/.well-known/openid-configuration
serveur_forgejo_oidc_discovery: >-
{{ resoudre_idp_discovery | default(serveur_forgejo_oidc_repli) }}
# --- QUELLE BASE DE DONNEES ---------------------------------------------------
#
# `postgres` (defaut) : la base vit dans le registre du plan, sur un serveur dedie.
# `sqlite` : un FICHIER dans les donnees de Forgejo, aucun serveur, aucun
# secret de base, aucune VM. C'est le defaut documente de Forgejo
# pour une petite instance, et il tient tres bien quelques dizaines
# d'utilisateurs et des miroirs.
#
# POURQUOI CE CHOIX EXISTE (2026-08-22). Une offre `forge` pour un petit organisme
# exigeait une VM PostgreSQL entiere — un serveur, une zone, un secret, une sauvegarde —
# pour une base que trois personnes sollicitent. Le premier ecosysteme a en avoir profite
# est patient 0, qui porte le genome : moins de surface sur la machine dont tout descend.
#
# CE QUE `sqlite` CHANGE AILLEURS : rien a la sauvegarde — le job `serveur_forgejo` de
# `client_backup` emporte deja `serveur_forgejo_data`, ou le fichier se trouve. Et rien
# au registre : aucune entree de base n'est attendue (P35 le sait).
serveur_forgejo_bd: "postgres"
serveur_forgejo_db_chemin: "{{ serveur_forgejo_data }}/forgejo.db"
# TLS vers PostgreSQL (zero-confiance). 'disable' = compat ; 'verify-full' = chiffre + verifie
# le cert serveur contre le root_ca step-ca (via PGSSLROOTCERT dans l'unite systemd).
# Sans objet en `sqlite` : il n'y a pas de connexion reseau a chiffrer.
serveur_forgejo_db_sslmode: "disable"
serveur_forgejo_db_sslrootcert: "/etc/step/certs/root_ca.crt"
# --- Habilitation par groupe (D-66) -------------------------------------------
# Forgejo lit un claim de groupes dans le jeton OIDC et accorde l'administration
# aux membres d'un groupe nomme. Sans ces reglages, TOUT utilisateur authentifie
# obtient le niveau par defaut et l'administration reste au compte local de
# secours — ce que `meta/acces.yml` signalait comme `porte_par: aucun`.
#
# Le claim `groups` est celui que Keycloak emet pour les groupes projetes depuis
# LDAP (group-ldap-mapper). Voir docs/autorisation.md.
serveur_forgejo_oidc_groupe_claim: "groups"
serveur_forgejo_oidc_groupe_admin: "sysadmin"
# Empreinte du mot de passe admin APPLIQUE (rotation). Voir tasks/main.yml.
serveur_forgejo_marqueur_admin: "/etc/forgejo/.setops-admin-sha256"
# Cache d'artefacts DU CONTROLEUR (pas de la cible). Le controleur telecharge une fois,
# puis pousse par SSH : aucun flux nouveau, et l'artefact devient deployable hors ligne.
# Surchargeable par `setops_cache_artefacts` pour partager un cache commun.
serveur_forgejo_cache_local: "{{ setops_cache_artefacts | default(lookup('env', 'HOME') + '/.cache/setops') }}"
# SIGNATURE DU BINAIRE — Forgejo signe ses releases (PGP detachee, `.asc`) ET publie une
# somme sha256. Les deux ont ete verifiees avant epinglage.
#
# ON EPINGLE LA CLE PRIMAIRE, PAS LA SOUS-CLE QUI SIGNE. Forgejo fait tourner ses
# sous-cles de signature — 0F527CF9... pour la 12.0.0, 3BF4E813... pour la 16.0.2 — sous
# une primaire stable depuis 2022, et le dit explicitement sur sa page de telechargement
# (« the GPG key is updated on a regular basis »). Epingler la sous-cle ferait echouer la
# verification a chaque rotation LEGITIME, et on apprendrait a lever la garde pour
# avancer. La primaire survit aux rotations et refuse quand meme une cle etrangere.
#
# Cette empreinte a une SOURCE INDEPENDANTE du telechargement : forgejo.org/download la
# publie, et le binaire vient de codeberg.org. C'est ce qui manque a Keycloak.
serveur_forgejo_signature_empreinte: "EB114F5E6C0DC2BCDD183550A4B61A2DC5923710"
serveur_forgejo_signature_url: "{{ serveur_forgejo_url }}.asc"