Ajout de meta/supervision.yml a six roles, chacun deposant sa propre sonde selon le contrat des greffons Nagios. DEUX PRINCIPES POSES AU DOCUMENT DE CONCEPTION, parce que la premiere sonde les a imposes : 1. UNE SONDE DOIT POUVOIR ETRE MISE EN DEFAUT PAR PARAMETRE. Cible et seuils sont des variables du role : on la prouve rouge avec un port ferme ou un seuil impossible, sur une machine reelle, sans rien casser, et aussi souvent qu on veut. Une sonde qu on ne peut prouver qu en cassant un service ne sera prouvee qu une fois. 2. LA SONDE VIT LA OU VIT LA VERITE. « Ce noeud est-il collecte ? » est une sonde de serveur_prometheus, pas de client_metrique : une seule y voit les N noeuds, et surtout elle voit le cas SILENCIEUX — celui qui a cesse d etre collecte ne peut pas s en plaindre. LES SIX : cache-apt (artefacts, repond + place), resolution (resolveur, zone interne ET Internet — deux chemins distincts), forge (forgejo, son propre /api/healthz), collecte (prometheus, 15/15 cibles), tableaux (grafana, base ok), ingestion (loki, PRET a ingerer, pas seulement en ecoute). TROIS FOIS J AI ECRIT LA SONDE AVANT DE MESURER, ET TROIS FOIS ELLE A EU TORT. La forge : port 443 et chemin des depots INVENTES — elle ecoute en 3000 derriere l edge et n a legitimement aucun depot. Loki : j ai conclu « panne persistante » sur deux lectures prises a quelques secondes d intervalle, juste apres un redemarrage ; l anneau etait ACTIVE et la reponse est passee a ready moins d une minute plus tard. Le delai de stabilisation est desormais un AVERTISSEMENT nomme, pas une panne. On demande au service ce qu il pense de lui-meme quand il sait le dire (healthz, /ready, /api/health) plutot que d inventer un critere de l exterieur. make prouver : CONFORME. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
162 lines
9.7 KiB
YAML
162 lines
9.7 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.
|
|
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"
|
|
|
|
# --- 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.
|
|
serveur_forgejo_sonde_url: "http://127.0.0.1:{{ serveur_forgejo_http_port }}"
|