La supervision du SITE etait morte depuis 11:10 et rien ne le disait. icingadb refuse par pg_hba — hostssl impose cote serveur, connexion en clair cote client. icinga2 tournait, redis tournait, les sondes poussaient, et rien n atteignait la base : les verdicts se calculaient dans le vide. La cause est une seconde liste tenue a la main. tls_force allume hostssl ; chaque consommateur avait SON interrupteur a allumer dans les group_vars. Chezlepro avait les trois, le site avait le premier. serveur_forgejo disait pire que rien : sslmode disable ecrit en dur, le contraire de ce que le serveur imposait. resoudre_base expose resoudre_base_db_tls_force, lu dans les hostvars de la machine qui PORTE la base. Les trois interrupteurs en derivent. Un serveur qui ne declare rien ne force rien : on ne casse pas un ecosysteme qui n a pas bascule. P78 refuse une valeur ecrite chez un consommateur, et nomme les deux roles sans reglage TLS plutot que de rendre un vert muet sur eux. Apres : icingadb active, TLSv1.3 vu par PostgreSQL, 16 hotes et 88 services en base. Les cinq sondes des marqueurs du site, INCONNU faute de deploiement, rapportent leur phrase. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
178 lines
11 KiB
YAML
178 lines
11 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
|
|
|
|
# --- SERVIR TLS SOI-MEME, QUAND IL N'Y A PAS D'EDGE DEVANT (2026-08-25) --------
|
|
#
|
|
# Le patron habituel est un nginx d'edge qui termine le TLS et parle en clair a la forge
|
|
# sur la boucle locale. Le gabarit posait donc `ROOT_URL = https://…` sans jamais
|
|
# configurer de certificat : c'etait vrai PARCE QUE quelqu'un d'autre s'en chargeait.
|
|
#
|
|
# La forge du SITE n'a pas d'edge devant elle — le site n'en a pas — et elle porte LE
|
|
# GENOME. Le code qui fabrique tous les ecosystemes voyageait donc en clair sur le
|
|
# reseau, alors que l'AC du site tourne a trois adresses de la.
|
|
#
|
|
# `false` par defaut : chez un tenant, rien ne change, l'edge garde son role. C'est
|
|
# l'ecosysteme sans edge qui doit le demander.
|
|
serveur_forgejo_tls: false
|
|
# Le certificat de la MACHINE, pose par `client_pki` — pas un cert propre a la forge.
|
|
# Une machine, une identite : c'est ce que l'AC a signe, avec ses SAN.
|
|
serveur_forgejo_tls_cert: "/etc/step/certs/{{ ansible_fqdn | default(ansible_hostname) }}.crt"
|
|
serveur_forgejo_tls_cle: "/etc/step/certs/{{ ansible_fqdn | default(ansible_hostname) }}.key"
|
|
|
|
# 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.
|
|
# DÉRIVÉ DE CE QUE SERT LE SERVEUR, plus posé à la main. Voir `resoudre_base`.
|
|
# `disable` restait écrit en dur ici alors que le serveur pouvait exiger TLS : le
|
|
# consommateur affirmait le contraire de ce que le serveur imposait.
|
|
serveur_forgejo_db_sslmode: >-
|
|
{{ 'verify-full' if (resoudre_base_db_tls_force | default(false)) else '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"
|
|
|
|
# --- Sonde de supervision -----------------------------------------------------------
|
|
# L'ADRESSE VIENT DU ROLE, PAS D'UNE SUPPOSITION : la forge ecoute en clair sur son
|
|
# `http_port` (l'edge fait le TLS devant). Viser 443 en dur, comme la premiere version de
|
|
# la sonde, cassait sur toute forge derriere un edge — c'est-a-dire toutes celles des
|
|
# tenants.
|
|
#
|
|
# ET LE SCHEMA SUIT `serveur_forgejo_tls`, comme le port suit `http_port` (2026-09-10).
|
|
# La ligne corrigeait le port et laissait `http` en dur : au SITE, ou la forge sert son
|
|
# propre TLS sur 443, la sonde envoyait du clair a un port chiffre et recevait
|
|
# « Client sent an HTTP request to an HTTPS server » — un CRITICAL sur une forge qui
|
|
# servait parfaitement le genome au meme instant.
|
|
#
|
|
# Troisieme occurrence du meme defaut dans la meme journee (Grafana, Loki, ici) : un
|
|
# parametre corrige a moitie, dont la moitie restee en dur ne dit rien tant que le
|
|
# deploiement ne change pas de camp.
|
|
serveur_forgejo_sonde_schema: "{{ 'https' if serveur_forgejo_tls | bool else 'http' }}"
|
|
serveur_forgejo_sonde_url: >-
|
|
{{ serveur_forgejo_sonde_schema }}://127.0.0.1:{{ serveur_forgejo_http_port }}
|