Une règle qu'aucune garde ne vérifie finit par ne plus être vraie — c'est ce qui était arrivé aux 28 lignes d'intégration recopiées. Chaque rôle serveur_* porte un meta/authentification.yml, confronté à son code par P29. web-sso 5, socle-identite 2 (keycloak/openldap : ils SONT la chaîne d'identité), ldap-direct 2, interne-sans-auth 2, sans-auth-humaine 12. La preuve refuse l'oubli ET le mensonge. Éprouvée par sabotage sur sept cas : déclaration supprimée, portée inventée, secours retiré, posture de formulaire retirée, raison retirée, ldap-direct mensonger, réglage retiré des defaults. Les deux derniers passaient dans la première version : - le mensonge passait à cause d'un commentaire. Je cherchais le mot « ldap » dans le rôle, et serveur_grafana/defaults/main.yml contient « désactiver quelqu'un dans LDAP » : de la prose validait une déclaration fausse. La preuve exige maintenant un indice nommé — variable <rôle>_oidc / <rôle>_ldap, ou URI ldap:// - le réglage retiré passait parce que le gabarit citait encore la variable alors que plus rien ne lui donnait de valeur. La preuve lit defaults/main.yml en YAML et exige que la clé y soit définie, pas mentionnée. Elle a aussi forcé une valeur : oauth2-proxy était déclaré « formulaire local fermé » alors qu'il n'a aucun compte local. D'où formulaire_local: aucun, qui distingue « il n'y en a jamais eu » de « il y en a un, il est fermé ». Correction d'une note de la veille : Prometheus et Loki ne sont PAS exposés publiquement (aucun expose au plan). Seuls six groupes le sont. Le risque est intra-tenant, pas frontalier. Les deux lacunes sont comptées à chaque exécution, pas masquées. AFF-111, D-42. 29 preuves OK, ansible-lint (production) sur 375 fichiers. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| defaults | ||
| handlers | ||
| meta | ||
| tasks | ||
| templates | ||
| README.md | ||
serveur_web_dorsal
Hébergement de webapps dynamiques (runtime + service systemd), derrière l'edge. Deuxième brique de la plateforme webapp de Set-OPS : 100 % natif — venv/paquets
- systemd + nginx, zéro conteneur. Codifié depuis le spike du 2026-07-05 (monregistraire : FastAPI + uvicorn + SQLite).
Patron
Pour chaque app déclarée dans serveur_web_dorsal_apps :
git clone(depth 1) →/srv/webapp/<nom>;- venv Python +
pip install -r requirements.txt; - unité systemd (l'app écoute en
127.0.0.1:<port>, userwebapp, durcie : NoNewPrivileges, PrivateTmp) ; - vhost nginx local qui fronte l'app (
server_name→127.0.0.1:<port>).
L'app reste en localhost (sûr) ; l'edge proxie server_name → nginx local → app.
Exposé via applications.yml (port 80, pas le port interne de l'app).
Déclaration (group_vars du groupe serveur_web_dorsal)
serveur_web_dorsal_apps:
- nom: registraire
server_name: "registraire.{{ domaine_interne }}"
depot: "https://forge.{{ domaine_interne }}/…/monregistraire.git"
branche: main
port: 8001
commande: ".venv/bin/uvicorn app.main:app --host 127.0.0.1 --port 8001"
env: { IMMOS_DB_PATH: /var/lib/registraire/immos.db }
data_dir: /var/lib/registraire # état local (SQLite), optionnel
Et une app groupe: serveur_web_dorsal, hote: <noeud>, port: 80, expose: [registraire.<domaine>].
BD
Les apps à état local (SQLite) : data_dir persistant. Les apps à BD réseau
(PostgreSQL) : déclarer la base dans bases-donnees.yml et passer le DSN via env
(resoudre_base) — même motif que les autres services Set-OPS.
Runtimes
Éprouvé sur Python (FastAPI/uvicorn). Node/autres : adapter commande + les
paquets de runtime (le patron systemd + nginx + git reste identique).
Validation
ansible-lint profil production + --syntax-check. Éprouvé sur web-frontal-01
(monregistraire servi via l'edge, HTTPS step-ca, API fonctionnelle).