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>
127 lines
7.5 KiB
YAML
127 lines
7.5 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).
|
|
serveur_forgejo_oidc_actif: true
|
|
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"
|