vigie : la console de supervision porte enfin un nom de fonction

icinga.<tenant>.internal devient vigie.<tenant>.internal, sur les trois
locataires a la fois. Le mot avait ete ecarte pour Grafana precisement parce
qu il connote la guette du danger : c est le metier d Icinga.

Quatrieme recopie du meme FQDN a tomber : serveur_oauth2_proxy_redirect_url
etait posee a la main dans les group_vars de chaque instance. Elle derive
maintenant de serveur_oauth2_proxy_hostname. Le repli reste vide et non
fabrique : l assertion doit refuser un deploiement sans exposition, pas
inventer un nom que personne ne resout.

Deploye et VERIFIE sur Chezlepro : le SSO renvoie sur vigie, le certificat
servi porte observatoire et vigie et plus aucun ancien nom. Deployer nginx
pose le vhost mais laisse le SAN en arriere — c est client_pki qui reemet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
This commit is contained in:
Daniel Allaire 2026-09-10 21:05:47 -04:00
parent d1ae41cfdf
commit 53e2f78148
7 changed files with 50 additions and 7 deletions

View file

@ -1,5 +1,41 @@
# CHANGELOG — Set-OPS # CHANGELOG — Set-OPS
## 2026-09-10 (18) — `vigie` pour Icinga, et la quatrieme liste tombe
Suite du renommage precedent, decide par l'exploitant : `vigie` est le nom de la console de
supervision. Le mot avait ete ecarte pour Grafana precisement parce qu'il connote la guette
du danger — c'est le metier d'Icinga, pas celui d'un tableau de bord.
icinga.chezlepro.internal -> vigie.chezlepro.internal
icinga.technolibre.internal -> vigie.technolibre.internal
icinga.lab.chezlepro.internal -> vigie.lab.chezlepro.internal
Les trois locataires en meme temps : deux vocabulaires entre ecosystemes, c'est le defaut
qu'on vient de corriger.
### La quatrieme liste
`serveur_oauth2_proxy_redirect_url` etait posee A LA MAIN dans les group_vars de chaque
instance, avec le FQDN recopie du plan. Quatrieme recopie du meme nom, apres les SAN (deja
derives), les clients Keycloak (P66) et les noms publics des roles (P67).
Elle derive maintenant de `serveur_oauth2_proxy_hostname`, que `instancier` pose depuis
`expose:`. Le repli reste VIDE et non fabrique : l'assertion du role doit refuser un
deploiement sans exposition, pas inventer un nom que personne ne resout. La ligne a ete
retiree des trois instances.
### Ce qu'il faut savoir pour le prochain renommage
Changer une exposition ne suffit pas a refaire le certificat de l'edge. Deployer
`serveur_nginx` pose le vhost mais laisse le SAN en arriere ; c'est `client_pki` qui
reemet. L'ordre eprouve deux fois aujourd'hui :
serveur_powerdns -> serveur_keycloak -> le service -> serveur_nginx -> client_pki
Le certificat servi a ete VERIFIE apres coup, pas suppose : il porte `observatoire` et
`vigie`, et plus aucun des deux anciens noms. Aucune garde ne compare encore le SAN SERVI aux
expositions du plan — ce serait un controle a la demande, pas une preuve statique.
## 2026-09-10 (17) — La console d'observabilite s'appelle pareil des deux cotes ## 2026-09-10 (17) — La console d'observabilite s'appelle pareil des deux cotes
Deux ecosystemes, deux noms pour le meme service : `grafana.chezlepro.internal` chez le Deux ecosystemes, deux noms pour le meme service : `grafana.chezlepro.internal` chez le

View file

@ -225,7 +225,7 @@ le côté humain **est** la preuve de l'affirmation « exploitable sans IA » (c
| # | Ce qu'on éprouve | Le geste (avec l'attendu) | Type | Preuve auto | | # | Ce qu'on éprouve | Le geste (avec l'attendu) | Type | Preuve auto |
|---|---|---|---|---| |---|---|---|---|---|
| 1 | Ouvre Icinga Web 2 | (https://icinga.chezlepro.internal, via le SSO) : la liste des hôtes et services supervisés, avec leur état (vert/jaune/rouge). | 👁 observe | — | | 1 | Ouvre Icinga Web 2 | (https://vigie.chezlepro.internal, via le SSO) : la liste des hôtes et services supervisés, avec leur état (vert/jaune/rouge). | 👁 observe | — |
| 2 | Vois l'impact | Menu *Business Processes* → « Supervision Chezlepro » : un processus qui agrège des checks (load, procs, ping…) en un état roulé. C'est l'impact, pas une case. | 👁 observe | — | | 2 | Vois l'impact | Menu *Business Processes* → « Supervision Chezlepro » : un processus qui agrège des checks (load, procs, ping…) en un état roulé. C'est l'impact, pas une case. | 👁 observe | — |
| 3 | Casse & répare | Provoque l'échec d'un check (ex. arrête un service surveillé) : l'état passe CRITICAL, et le processus BPM qui en dépend rougit (l'impact remonte). Répare : tout reverdit. Tu *sens* la différence entre *mesurer* et *superviser/alerter*. | 🔨 casse-répare | — | | 3 | Casse & répare | Provoque l'échec d'un check (ex. arrête un service surveillé) : l'état passe CRITICAL, et le processus BPM qui en dépend rougit (l'impact remonte). Répare : tout reverdit. Tu *sens* la différence entre *mesurer* et *superviser/alerter*. | 🔨 casse-répare | — |

View file

@ -44,7 +44,7 @@
| P29 | Authentification : chaque role declare sa position | AFF-111 | ✅ OK | 32 role(s) serveur declares (interne-sans-auth 2, ldap-direct 2, sans-auth-humaine 21, socle-identite 2, web-sso 5) ; 2 lacune(s) nommee(s) : serveur_loki, serv | | P29 | Authentification : chaque role declare sa position | AFF-111 | ✅ OK | 32 role(s) serveur declares (interne-sans-auth 2, ldap-direct 2, sans-auth-humaine 21, socle-identite 2, web-sso 5) ; 2 lacune(s) nommee(s) : serveur_loki, serv |
| P30 | SDN EVPN : zones, VNets et sous-reseaux derives | AFF-112 | ✅ OK | CONFORME : SDN EVPN, 3 zone(s), 15 VNet(s), 15 sous-reseau(x), aucune collision. | | P30 | SDN EVPN : zones, VNets et sous-reseaux derives | AFF-112 | ✅ OK | CONFORME : SDN EVPN, 3 zone(s), 15 VNet(s), 15 sous-reseau(x), aucune collision. |
| P31 | Documentation : tout ce que le depot FAIT est nomme | — | ✅ OK | 59 scripts expliques et atteignables, 116 cibles make documentees, 67 roles avec README. | | P31 | Documentation : tout ce que le depot FAIT est nomme | — | ✅ OK | 59 scripts expliques et atteignables, 116 cibles make documentees, 67 roles avec README. |
| P32 | Intrants exiges par les roles : tous fournis | — | ✅ OK | CONFORME : 38 exigence(s) de role, toutes satisfaites (138 cle(s) declaree(s) par l'instance). | | P32 | Intrants exiges par les roles : tous fournis | — | ✅ OK | CONFORME : 38 exigence(s) de role, toutes satisfaites (137 cle(s) declaree(s) par l'instance). |
| P33 | Aucune collision de port entre roles co-localises | — | ✅ OK | CONFORME : 34 revendication(s) de port, aucune collision entre roles co-localises (36 groupes). | | P33 | Aucune collision de port entre roles co-localises | — | ✅ OK | CONFORME : 34 revendication(s) de port, aucune collision entre roles co-localises (36 groupes). |
| P34 | Chaque document declare son lecteur | — | ✅ OK | 44 document(s) declarent leur lecteur (36 genere(s) exempte(s)). | | P34 | Chaque document declare son lecteur | — | ✅ OK | 44 document(s) declarent leur lecteur (36 genere(s) exempte(s)). |
| P35 | Toute application exigeant une base en a une au plan | — | ✅ OK | 5 application(s) exigeant une base l'ont toutes (4 entree(s) au registre). | | P35 | Toute application exigeant une base en a une au plan | — | ✅ OK | 5 application(s) exigeant une base l'ont toutes (4 entree(s) au registre). |
@ -72,7 +72,7 @@
| P57 | Comptes en prose : les chiffres du depot sur lui-meme | — | ✅ OK | Les comptes ecrits en prose correspondent a la mesure (67 preuves, 67 roles, 41 groupes). | | P57 | Comptes en prose : les chiffres du depot sur lui-meme | — | ✅ OK | Les comptes ecrits en prose correspondent a la mesure (67 preuves, 67 roles, 41 groupes). |
| P58 | Habilitations : chaque service dit a quel GROUPE, et par quoi | — | ✅ OK | 8 habilitation(s) declarees, toutes nommant un groupe, un mecanisme connu et une raison ; les `role-realm` sont projetees. | | P58 | Habilitations : chaque service dit a quel GROUPE, et par quoi | — | ✅ OK | 8 habilitation(s) declarees, toutes nommant un groupe, un mecanisme connu et une raison ; les `role-realm` sont projetees. |
| P59 | Enumerations annoncees : le nombre correspond a ce qui suit | — | ✅ OK | 2 enumeration(s) annoncee(s) correspondent a ce qu'elles annoncent (formes non ambigues seulement). | | P59 | Enumerations annoncees : le nombre correspond a ce qui suit | — | ✅ OK | 2 enumeration(s) annoncee(s) correspondent a ce qu'elles annoncent (formes non ambigues seulement). |
| P60 | Wiki publie : la forge sert ce que le depot dit | AFF-002 | ✅ OK | Le wiki publie correspond au depot : `wiki/` n'a pas bouge depuis `2450c9e` (publie le 2026-09-10). | | P60 | Wiki publie : la forge sert ce que le depot dit | AFF-002 | ✅ OK | Le wiki publie correspond au depot : `wiki/` n'a pas bouge depuis `d1ae41c` (publie le 2026-09-10). |
| P61 | Schema du plan : il decrit tout ce que les plans contiennent | AFF-033 | ✅ OK | Le schema decrit 47 champ(s) sur 6 registres ; il couvre tout ce que les plans reels contiennent, et la FORME de chaque champ (scalaire / objet / table) corresp | | P61 | Schema du plan : il decrit tout ce que les plans contiennent | AFF-033 | ✅ OK | Le schema decrit 47 champ(s) sur 6 registres ; il couvre tout ce que les plans reels contiennent, et la FORME de chaque champ (scalaire / objet / table) corresp |
| P62 | Schema du plan : il decrit tout ce que le MOTEUR accepte | AFF-033 | ✅ OK | Les 4 validateurs n'acceptent aucun champ que le schema ignore (applications:8, bases_donnees:4, domaines_publics:5, serveurs:3 champ(s) lus par validateur). | | P62 | Schema du plan : il decrit tout ce que le MOTEUR accepte | AFF-033 | ✅ OK | Les 4 validateurs n'acceptent aucun champ que le schema ignore (applications:8, bases_donnees:4, domaines_publics:5, serveurs:3 champ(s) lus par validateur). |
| P63 | cloud-init nait avec la VM et ne lui survit pas | — | ✅ OK | cloud-init est au gabarit (la premiere seconde), absent du socle (pas de va-et-vient), et retire par le durcissement — avec la garde qui verifie que le reseau s | | P63 | cloud-init nait avec la VM et ne lui survit pas | — | ✅ OK | cloud-init est au gabarit (la premiere seconde), absent du socle (pas de va-et-vient), et retire par le durcissement — avec la garde qui verifie que le reseau s |

View file

@ -1,5 +1,5 @@
--- ---
# Ecrit par `make wiki-publier`, lu par la preuve P60. Ne pas editer a la main. # Ecrit par `make wiki-publier`, lu par la preuve P60. Ne pas editer a la main.
remote: ssh://git@forge.genese.internal/genome/set-ops-public.wiki.git remote: ssh://git@forge.genese.internal/genome/set-ops-public.wiki.git
source: 2450c9e source: d1ae41c
date: 2026-09-10 date: 2026-09-10

View file

@ -26,7 +26,14 @@ serveur_oauth2_proxy_app_idp: "keycloak"
serveur_oauth2_proxy_issuer: "https://keycloak.{{ domaine_interne }}/realms/{{ serveur_oauth2_proxy_realm }}" serveur_oauth2_proxy_issuer: "https://keycloak.{{ domaine_interne }}/realms/{{ serveur_oauth2_proxy_realm }}"
serveur_oauth2_proxy_client_id: "" # OBLIGATOIRE (par instance) serveur_oauth2_proxy_client_id: "" # OBLIGATOIRE (par instance)
serveur_oauth2_proxy_client_secret: "" # OBLIGATOIRE (voûte) serveur_oauth2_proxy_client_secret: "" # OBLIGATOIRE (voûte)
serveur_oauth2_proxy_redirect_url: "" # OBLIGATOIRE (https://<app>/oauth2/callback) # DERIVE de l'exposition que le plan declare pour l'application protegee.
# `instancier` pose `serveur_oauth2_proxy_hostname` depuis `expose:` ; l'URL de retour
# s'en deduit. Une valeur posee dans les group_vars gagne encore — et le repli reste
# vide, pour que l'assertion refuse un deploiement sans exposition plutot que de
# fabriquer un nom que personne ne resout.
serveur_oauth2_proxy_redirect_url: >-
{{ ('https://' ~ serveur_oauth2_proxy_hostname ~ '/oauth2/callback')
if (serveur_oauth2_proxy_hostname | default('') | length > 0) else '' }}
# Application protégée (upstream local). # Application protégée (upstream local).
serveur_oauth2_proxy_upstream: "" # OBLIGATOIRE (ex. http://127.0.0.1:8080) serveur_oauth2_proxy_upstream: "" # OBLIGATOIRE (ex. http://127.0.0.1:8080)

View file

@ -19,7 +19,7 @@ Un seul endroit gère les certificats → simple et cohérent.
## ② Comment Set-OPS le fait ## ② Comment Set-OPS le fait
`serveur_nginx` déployé sur l'**edge** (`infra-edge`) est le reverse-proxy. Le point élégant : `serveur_nginx` déployé sur l'**edge** (`infra-edge`) est le reverse-proxy. Le point élégant :
l'**exposition est auto-dérivée**. Déclarer `expose: [icinga.chezlepro.internal]` sur une app l'**exposition est auto-dérivée**. Déclarer `expose: [vigie.chezlepro.internal]` sur une app
génère **tout** : génère **tout** :
``` ```

View file

@ -49,7 +49,7 @@ Tu as appris **supervision active vs observabilité passive, l'état, l'alerting
## ④ À toi de jouer ## ④ À toi de jouer
1. **Ouvre Icinga Web 2** (`https://icinga.chezlepro.internal`, via le SSO) : la liste des hôtes 1. **Ouvre Icinga Web 2** (`https://vigie.chezlepro.internal`, via le SSO) : la liste des hôtes
et services **supervisés**, avec leur **état** (vert/jaune/rouge). et services **supervisés**, avec leur **état** (vert/jaune/rouge).
2. **Vois l'impact.** Menu *Business Processes* → « **Supervision Chezlepro** » : un processus qui 2. **Vois l'impact.** Menu *Business Processes* → « **Supervision Chezlepro** » : un processus qui
**agrège** des checks (load, procs, ping…) en un état roulé. C'est l'impact, pas une case. **agrège** des checks (load, procs, ping…) en un état roulé. C'est l'impact, pas une case.