serveur_ops : la difference entre une archive et une matrice
Un ecosysteme pouvait DETENIR son genome sans savoir l'executer. Le poste
d'exploitation porte Ansible epingle, le genome clone depuis SA PROPRE forge, et
une cle SSH qui n'appartient qu'a lui. Il n'emporte ni la voute ni son mot de
passe : la structure se reconstruit depuis la forge, les secrets depuis la
sauvegarde. Deux sources qu'un meme incident n'atteint pas ensemble.
Une machine neuve traverse tout le moteur sans rien heriter, et revele ce qu'un
etat anterieur masquait. Deux defauts silencieux en sont sortis.
setops_plan_dir pointait le lien `instance` en dur : neuf roles lisaient donc le
plan d'une AUTRE instance. Le plancher de patient 0 portait les FQDN de
Chezlepro, et son edge publiait server_name forge.chezlepro.internal. La
variable suit desormais l'inventaire reellement charge.
Trois instances sur quatre declaraient les SAN d'exposition de leur edge ; la
quatrieme et le modele public ne les avaient pas. La forge de patient 0 etait
donc publiee derriere le certificat auto-signe de Debian, sans que rien ne le
signale -- `git clone` fut le premier a refuser, a juste titre. P42 le reclame
maintenant pour tout ecosysteme qui declare un edge.
Le harnais a ecrit la moitie de ce role : 5 echecs sur la piece neuve, aucun
n'empechait le code de tourner, tous la rendaient invisible a la carte, au
graphe et au lecteur. 42 preuves, 0 echec.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 11:58:10 -04:00
|
|
|
---
|
|
|
|
|
# Flux réseau du poste d'exploitation. Voir docs/flux-conception.md.
|
|
|
|
|
#
|
|
|
|
|
# Le poste est presque tout en sortie : il va chercher son génome, puis il pilote. Rien
|
|
|
|
|
# ne s'y connecte, sinon l'administration elle-même.
|
|
|
|
|
flux:
|
la console d exploitation devient un service, et elle n avait aucune serrure
Le GUI n a aucune authentification : GET / sert la page a qui la demande, jeton
ecrit dedans, et POST /api exige ce jeton que la page vient de donner. Le jeton
garde contre le CSRF, pas contre un visiteur — la seule serrure est
--hote 127.0.0.1. Ce qu il offre a qui entre : deployer, creer, raser, editer le
plan. La fabric entiere.
Le service reste donc sur la boucle locale. Ce qui est publie est un nginx local
qui authentifie d abord : oidc par defaut (oauth2-proxy, donc un groupe
d annuaire qu on revoque sans deploiement), locale en repli pour un ecosysteme
sans annuaire. L authentification est posee au niveau du server, pas d un
location.
La sonde console-ops mesure une SERRURE : une requete anonyme doit etre REFUSEE.
Un 200 y est la pire des reponses, et il ne fait echouer personne.
P54 a attrape une contrainte ratee : serveur_ops est insemine par le SITE, qui
ne detient pas la voute du locataire. Le role ne nomme donc aucune voute — il
declare un parametre, et la couche qui detient le secret le remplit.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-14 19:27:28 -04:00
|
|
|
# LA CONSOLE D'EXPLOITATION, PUBLIEE PAR L'EDGE DE L'ECOSYSTEME (2026-09-14).
|
|
|
|
|
#
|
|
|
|
|
# `[edge, admin]` — la meme paire que `serveur_grafana` et `serveur_icingaweb2`, et
|
|
|
|
|
# pour la meme raison : sans edge, un ecosysteme n'aurait plus de console du tout.
|
|
|
|
|
#
|
|
|
|
|
# CE PORT N'EST PAS CELUI DU GUI. Le GUI ecoute `127.0.0.1:8765` et n'est joignable de
|
|
|
|
|
# nulle part ailleurs — c'est sa seule serrure, il sert sa page a qui la demande. Ce
|
|
|
|
|
# qui s'ouvre ici est le NGINX qui authentifie devant.
|
|
|
|
|
#
|
|
|
|
|
# LA REGLE N'EST EMISE QUE SI LE PLAN L'EXPOSE : un runner qui ne publie pas sa console
|
|
|
|
|
# n'a pas ce port ouvert, et `serveur_ops_gui_actif` reste faux.
|
2026-10-01 10:45:48 -04:00
|
|
|
#
|
|
|
|
|
# SEULEMENT EN MODE `locale` (2026-09-30) : c'est la que nginx EST le vestibule et ecoute
|
|
|
|
|
# sur le reseau. En `oidc`, il est lie a 127.0.0.1 (voir `serveur_ops_gui_nginx_bind`) et
|
|
|
|
|
# la regle etait « sans objet » — desormais elle n'est plus emise du tout.
|
la console d exploitation devient un service, et elle n avait aucune serrure
Le GUI n a aucune authentification : GET / sert la page a qui la demande, jeton
ecrit dedans, et POST /api exige ce jeton que la page vient de donner. Le jeton
garde contre le CSRF, pas contre un visiteur — la seule serrure est
--hote 127.0.0.1. Ce qu il offre a qui entre : deployer, creer, raser, editer le
plan. La fabric entiere.
Le service reste donc sur la boucle locale. Ce qui est publie est un nginx local
qui authentifie d abord : oidc par defaut (oauth2-proxy, donc un groupe
d annuaire qu on revoque sans deploiement), locale en repli pour un ecosysteme
sans annuaire. L authentification est posee au niveau du server, pas d un
location.
La sonde console-ops mesure une SERRURE : une requete anonyme doit etre REFUSEE.
Un 200 y est la pire des reponses, et il ne fait echouer personne.
P54 a attrape une contrainte ratee : serveur_ops est insemine par le SITE, qui
ne detient pas la voute du locataire. Le role ne nomme donc aucune voute — il
declare un parametre, et la couche qui detient le secret le remplit.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-14 19:27:28 -04:00
|
|
|
- sens: ingress
|
|
|
|
|
port: 8090
|
|
|
|
|
protocole: tcp
|
|
|
|
|
pair: [edge, admin]
|
2026-10-01 10:45:48 -04:00
|
|
|
seulement_si: {variable: serveur_ops_gui_auth, egal: locale}
|
la console d exploitation devient un service, et elle n avait aucune serrure
Le GUI n a aucune authentification : GET / sert la page a qui la demande, jeton
ecrit dedans, et POST /api exige ce jeton que la page vient de donner. Le jeton
garde contre le CSRF, pas contre un visiteur — la seule serrure est
--hote 127.0.0.1. Ce qu il offre a qui entre : deployer, creer, raser, editer le
plan. La fabric entiere.
Le service reste donc sur la boucle locale. Ce qui est publie est un nginx local
qui authentifie d abord : oidc par defaut (oauth2-proxy, donc un groupe
d annuaire qu on revoque sans deploiement), locale en repli pour un ecosysteme
sans annuaire. L authentification est posee au niveau du server, pas d un
location.
La sonde console-ops mesure une SERRURE : une requete anonyme doit etre REFUSEE.
Un 200 y est la pire des reponses, et il ne fait echouer personne.
P54 a attrape une contrainte ratee : serveur_ops est insemine par le SITE, qui
ne detient pas la voute du locataire. Le role ne nomme donc aucune voute — il
declare un parametre, et la couche qui detient le secret le remplit.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-14 19:27:28 -04:00
|
|
|
chiffrement: clair
|
|
|
|
|
raison: >-
|
|
|
|
|
Console d'exploitation servie par l'edge (TLS terminé à l'edge), et joignable
|
|
|
|
|
depuis le plan d'administration là où il n'y a pas d'edge. Le GUI lui-même reste
|
|
|
|
|
sur la boucle locale : c'est nginx qui authentifie devant.
|
serveur_ops : la difference entre une archive et une matrice
Un ecosysteme pouvait DETENIR son genome sans savoir l'executer. Le poste
d'exploitation porte Ansible epingle, le genome clone depuis SA PROPRE forge, et
une cle SSH qui n'appartient qu'a lui. Il n'emporte ni la voute ni son mot de
passe : la structure se reconstruit depuis la forge, les secrets depuis la
sauvegarde. Deux sources qu'un meme incident n'atteint pas ensemble.
Une machine neuve traverse tout le moteur sans rien heriter, et revele ce qu'un
etat anterieur masquait. Deux defauts silencieux en sont sortis.
setops_plan_dir pointait le lien `instance` en dur : neuf roles lisaient donc le
plan d'une AUTRE instance. Le plancher de patient 0 portait les FQDN de
Chezlepro, et son edge publiait server_name forge.chezlepro.internal. La
variable suit desormais l'inventaire reellement charge.
Trois instances sur quatre declaraient les SAN d'exposition de leur edge ; la
quatrieme et le modele public ne les avaient pas. La forge de patient 0 etait
donc publiee derriere le certificat auto-signe de Debian, sans que rien ne le
signale -- `git clone` fut le premier a refuser, a juste titre. P42 le reclame
maintenant pour tout ecosysteme qui declare un edge.
Le harnais a ecrit la moitie de ce role : 5 echecs sur la piece neuve, aucun
n'empechait le code de tourner, tous la rendaient invisible a la carte, au
graphe et au lecteur. 42 preuves, 0 echec.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 11:58:10 -04:00
|
|
|
- sens: egress
|
|
|
|
|
port: 443
|
|
|
|
|
protocole: tcp
|
|
|
|
|
pair: edge
|
|
|
|
|
chiffrement: tls-requis
|
|
|
|
|
raison: "Cloner et resynchroniser le génome depuis la forge de l'écosystème."
|
|
|
|
|
- sens: egress
|
|
|
|
|
port: 22
|
|
|
|
|
protocole: tcp
|
|
|
|
|
pair: flotte
|
|
|
|
|
chiffrement: ssh
|
|
|
|
|
raison: "Piloter la flotte — c'est la raison d'être du poste."
|
|
|
|
|
# L'HYPERVISEUR N'EST PAS DANS L'ÉCOSYSTÈME : il appartient au monde physique, de
|
|
|
|
|
# l'autre côté de la frontière. C'est donc un pair `externe`, et ce flux est le seul
|
|
|
|
|
# par lequel un écosystème peut en engendrer un autre.
|
|
|
|
|
- sens: egress
|
|
|
|
|
port: 8006
|
|
|
|
|
protocole: tcp
|
|
|
|
|
pair: externe
|
|
|
|
|
chiffrement: tls-requis
|
|
|
|
|
raison: "API de l'hyperviseur : créer et cloner les VM d'un écosystème descendant."
|
2026-08-24 18:55:44 -04:00
|
|
|
# LIRE LE GENOME CHEZ UN VOISIN. La forge du genome se mutualise par SITE : le moteur,
|
|
|
|
|
# les modeles et la fabric sont le meme contenu pour tous les tenants. Seul le plan
|
|
|
|
|
# `OPS-xxx` differe.
|
|
|
|
|
#
|
|
|
|
|
# La forge DE TRAVAIL d'un ecosysteme -- celle qui sert ses gens -- reste un service du
|
|
|
|
|
# tenant, et n'a rien a voir avec ce flux.
|
|
|
|
|
- sens: egress
|
|
|
|
|
port: 443
|
|
|
|
|
protocole: tcp
|
|
|
|
|
pair: voisins_site
|
|
|
|
|
chiffrement: tls-requis
|
|
|
|
|
raison: "Cloner le genome depuis la forge du site, quand cet ecosysteme n'heberge pas la sienne."
|