forge du site : le marqueur manquant — le genome n etait ouvert a personne
MEME PATRON QUE serveur_artefacts + serveur_cache_site : un installateur, un
marqueur. Le site rend DEUX services a ses locataires pendant leur jeunesse, les
PAQUETS et le GENOME. Le premier etait declare, le second ne l etait pas — alors
que D-81 fait de cette forge l autorite dont tout ecosysteme se reproduit.
Mesure sur ops-01, premiere machine de la reconstruction de Chezlepro :
cache du SITE 10.0.33.21:3142 : OK
forge du SITE 10.0.33.11:443 : BLOQUE
Le plan du tenant declarait pourtant lire son genome a cette adresse. UNE
DEPENDANCE DECLAREE CHEZ LE CONSOMMATEUR, SANS FLUX CHEZ LE FOURNISSEUR — et rien
ne le signalait : la garde de matrice de resoudre_flux ne verifie que les paires
role->role, jamais un pair symbolique comme voisins_site.
POURQUOI UN ROLE A PART : ajouter cet ingress a serveur_forgejo aurait ouvert LA
FORGE DE CHAQUE TENANT a ses voisins. La responsabilite appartient a une machine
precise, pas au logiciel qu elle fait tourner.
Il verifie que la forge ECOUTE vraiment : sans ca il attribuerait l autorite du
genome a un port muet, et l ecosysteme venu s y reproduire attendrait sans savoir
pourquoi — ce qui est exactement arrive, quinze minutes durant.
TROIS GARDES ONT TRAVAILLE : le catalogue a refuse un role qu il ne nomme pas, la
carte a corrige ses deux chiffres, et P49 a exige la regeneration du registre.
P33 a impose partage: true — le marqueur emprunte l ecoute de serveur_forgejo.
Frontiere : 4 objets crees, 0 retire. Verifie depuis ops-01 : 443 OK.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
This commit is contained in:
parent
aca63011ea
commit
58ce3dfea4
14 changed files with 212 additions and 13 deletions
|
|
@ -7,7 +7,7 @@
|
||||||
> [`docs/audit/affirmations.md`](affirmations.md).
|
> [`docs/audit/affirmations.md`](affirmations.md).
|
||||||
|
|
||||||
- **Instance** : `instance` — inventaire `instance/inventories/principal/hosts.yml`
|
- **Instance** : `instance` — inventaire `instance/inventories/principal/hosts.yml`
|
||||||
- **Verdict** : ✅ CONFORME (52 OK · 0 echec · 0 saute)
|
- **Verdict** : ❌ NON CONFORME (51 OK · 1 echec · 0 saute)
|
||||||
|
|
||||||
## Preuves
|
## Preuves
|
||||||
|
|
||||||
|
|
@ -20,8 +20,8 @@
|
||||||
| P05 | Dependances causales de groupes | AFF-009, AFF-084 | ✅ OK | |
|
| P05 | Dependances causales de groupes | AFF-009, AFF-084 | ✅ OK | |
|
||||||
| P06 | Validateurs de registres (serveurs/apps/bases/domaines) | AFF-003 | ✅ OK | Registre des domaines valide. |
|
| P06 | Validateurs de registres (serveurs/apps/bases/domaines) | AFF-003 | ✅ OK | Registre des domaines valide. |
|
||||||
| P07 | GUI (node --check) | AFF-033 | ✅ OK | JS du GUI : syntaxe valide (node --check). |
|
| P07 | GUI (node --check) | AFF-033 | ✅ OK | JS du GUI : syntaxe valide (node --check). |
|
||||||
| P08 | Orchestration (couches + graphe) | AFF-070 | ✅ OK | Orchestration coherente : 37 groupes classes, aucun cycle, aucune arete en arriere. |
|
| P08 | Orchestration (couches + graphe) | AFF-070 | ✅ OK | Orchestration coherente : 38 groupes classes, aucun cycle, aucune arete en arriere. |
|
||||||
| P09 | Flux reseau (schema + matrice) | AFF-071 | ✅ OK | Flux coherents : 35 rôles, 94 flux, schéma + matrice OK. |
|
| P09 | Flux reseau (schema + matrice) | AFF-071 | ✅ OK | Flux coherents : 36 rôles, 95 flux, schéma + matrice OK. |
|
||||||
| P10 | Handlers <-> notify | AFF-034, AFF-035 | ✅ OK | Tout notify pointe vers un handler du meme role (49 roles). |
|
| P10 | Handlers <-> notify | AFF-034, AFF-035 | ✅ OK | Tout notify pointe vers un handler du meme role (49 roles). |
|
||||||
| P11 | Syntaxe des playbooks (--syntax-check) | AFF-083 | ✅ OK | playbook: playbooks/proxmox/cloner_vm_debian.yml |
|
| P11 | Syntaxe des playbooks (--syntax-check) | AFF-083 | ✅ OK | playbook: playbooks/proxmox/cloner_vm_debian.yml |
|
||||||
| P12 | Existence des runbooks cites | AFF-010, AFF-011, AFF-012, AFF-083 | ✅ OK | 17/17 runbooks/registres cites presents. |
|
| P12 | Existence des runbooks cites | AFF-010, AFF-011, AFF-012, AFF-083 | ✅ OK | 17/17 runbooks/registres cites presents. |
|
||||||
|
|
@ -41,16 +41,16 @@
|
||||||
| P26 | Integrations universelles : aucun hote laisse de cote | AFF-108 | ✅ OK | 15 hote(s) x 5 integration(s) universelle(s) : aucune lacune, aucune recopie (0 exemption(s) derivee(s) du service rendu). |
|
| P26 | Integrations universelles : aucun hote laisse de cote | AFF-108 | ✅ OK | 15 hote(s) x 5 integration(s) universelle(s) : aucune lacune, aucune recopie (0 exemption(s) derivee(s) du service rendu). |
|
||||||
| P27 | Propriete des intrants : hebergeur et tenant separes | AFF-109 | ✅ OK | 8 cle(s) de cluster chez l'hebergeur, aucune recopiee dans les group_vars du tenant. |
|
| P27 | Propriete des intrants : hebergeur et tenant separes | AFF-109 | ✅ OK | 8 cle(s) de cluster chez l'hebergeur, aucune recopiee dans les group_vars du tenant. |
|
||||||
| P28 | Pools Proxmox : un par tenant, sans collision | AFF-110 | ✅ OK | CONFORME : 3 pool(s) Proxmox, 35 VM placee(s), aucun nom ni VMID en collision. |
|
| P28 | Pools Proxmox : un par tenant, sans collision | AFF-110 | ✅ OK | CONFORME : 3 pool(s) Proxmox, 35 VM placee(s), aucun nom ni VMID en collision. |
|
||||||
| P29 | Authentification : chaque role declare sa position | AFF-111 | ✅ OK | 29 role(s) serveur declares (interne-sans-auth 2, ldap-direct 2, sans-auth-humaine 18, socle-identite 2, web-sso 5) ; 2 lacune(s) nommee(s) : serveur_loki, serv |
|
| P29 | Authentification : chaque role declare sa position | AFF-111 | ✅ OK | 30 role(s) serveur declares (interne-sans-auth 2, ldap-direct 2, sans-auth-humaine 19, 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 | 52 scripts expliques et atteignables, 104 cibles make documentees, 61 roles avec README. |
|
| P31 | Documentation : tout ce que le depot FAIT est nomme | — | ✅ OK | 52 scripts expliques et atteignables, 104 cibles make documentees, 62 roles avec README. |
|
||||||
| P32 | Intrants exiges par les roles : tous fournis | — | ✅ OK | CONFORME : 41 exigence(s) de role, toutes satisfaites (128 cle(s) declaree(s) par l'instance). |
|
| P32 | Intrants exiges par les roles : tous fournis | — | ✅ OK | CONFORME : 41 exigence(s) de role, toutes satisfaites (129 cle(s) declaree(s) par l'instance). |
|
||||||
| P33 | Aucune collision de port entre roles co-localises | — | ✅ OK | CONFORME : 33 revendication(s) de port, aucune collision entre roles co-localises (38 groupes). |
|
| P33 | Aucune collision de port entre roles co-localises | — | ✅ OK | CONFORME : 33 revendication(s) de port, aucune collision entre roles co-localises (38 groupes). |
|
||||||
| P34 | Chaque document declare son lecteur | — | ✅ OK | 42 document(s) declarent leur lecteur (26 genere(s) exempte(s)). |
|
| P34 | Chaque document declare son lecteur | — | ✅ OK | 42 document(s) declarent leur lecteur (26 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). |
|
||||||
| P36 | Tout detenteur d'etat porte une sauvegarde | — | ✅ OK | 9 hote(s) detiennent de l'etat, tous porteurs de `client_backup` (9 groupe(s) au catalogue). |
|
| P36 | Tout detenteur d'etat porte une sauvegarde | — | ✅ OK | 9 hote(s) detiennent de l'etat, tous porteurs de `client_backup` (9 groupe(s) au catalogue). |
|
||||||
| P37 | Le placement du tenant existe chez son hebergeur | — | ✅ OK | placement confronte a l'hebergeur monte (SITE-Chezlepro) : noeud, stockage, pont — tous offerts. |
|
| P37 | Le placement du tenant existe chez son hebergeur | — | ✅ OK | placement confronte a l'hebergeur monte (SITE-Chezlepro) : noeud, stockage, pont — tous offerts. |
|
||||||
| P38 | Catalogue des services : la carte dit ce que le moteur fait | — | ✅ OK | Catalogue a jour : 36 role(s) serveur/client tous nommes, 37 groupe(s) cite(s) en table existent tous. |
|
| P38 | Catalogue des services : la carte dit ce que le moteur fait | — | ✅ OK | Catalogue a jour : 37 role(s) serveur/client tous nommes, 38 groupe(s) cite(s) en table existent tous. |
|
||||||
| P39 | Glossaire : tout mot employe est enseigne | — | ✅ OK | Glossaire complet : 81 terme(s) du jargon expliques, 15 lien(s) valides, 27 page(s) de wiki toutes atteignables. |
|
| P39 | Glossaire : tout mot employe est enseigne | — | ✅ OK | Glossaire complet : 81 terme(s) du jargon expliques, 15 lien(s) valides, 27 page(s) de wiki toutes atteignables. |
|
||||||
| P40 | Parente : l'ecosysteme sait de quoi il descend | — | ✅ OK | Parente coherente : 4 depot(s), tous retrouves, tous porteurs d'un remote. |
|
| P40 | Parente : l'ecosysteme sait de quoi il descend | — | ✅ OK | Parente coherente : 4 depot(s), tous retrouves, tous porteurs d'un remote. |
|
||||||
| P41 | Resolution d'instance : une seule, partagee | — | ✅ OK | Resolution unique : 48 script(s) passent par `inventory_rules`, 3 exemption(s) nommee(s). |
|
| P41 | Resolution d'instance : une seule, partagee | — | ✅ OK | Resolution unique : 48 script(s) passent par `inventory_rules`, 3 exemption(s) nommee(s). |
|
||||||
|
|
@ -60,8 +60,9 @@
|
||||||
| P45 | Pare-feu Proxmox : arme sur les VNet SDN, jamais ailleurs | — | ✅ OK | Le pare-feu Proxmox ne s'arme que sur un VNet SDN (4 cas evalues, dont un qui doit rendre VRAI). |
|
| P45 | Pare-feu Proxmox : arme sur les VNet SDN, jamais ailleurs | — | ✅ OK | Le pare-feu Proxmox ne s'arme que sur un VNet SDN (4 cas evalues, dont un qui doit rendre VRAI). |
|
||||||
| P46 | Plancher /etc/hosts : un seul role en decide | — | ✅ OK | Un seul maitre du plancher — roles/hosts_statiques/tasks/main.yml : manage_etc_hosts: false ; et le gabarit maitre est pose (roles/hosts_statiques/templates/hos |
|
| P46 | Plancher /etc/hosts : un seul role en decide | — | ✅ OK | Un seul maitre du plancher — roles/hosts_statiques/tasks/main.yml : manage_etc_hosts: false ; et le gabarit maitre est pose (roles/hosts_statiques/templates/hos |
|
||||||
| P47 | Zones inverses : couvrir l'occupe, et rien de plus | — | ✅ OK | Les zones inverses couvrent l'occupe et rien de plus (5 cas evalues, dont un site a quatre zones et un tenant a une). |
|
| P47 | Zones inverses : couvrir l'occupe, et rien de plus | — | ✅ OK | Les zones inverses couvrent l'occupe et rien de plus (5 cas evalues, dont un site a quatre zones et un tenant a une). |
|
||||||
| P48 | La carte d'orientation designe ce qui existe, et compte juste | — | ✅ OK | La carte designe 84 chemin(s) qui existent, et ses 7 chiffres correspondent a la mesure. |
|
| P48 | La carte d'orientation designe ce qui existe, et compte juste | — | ❌ ECHEC | La carte d'orientation ne dit plus vrai :
|
||||||
| P49 | Registre des flux : la matrice d'audit est a jour | — | ✅ OK | Le registre des flux reproduit exactement ce que les `meta/flux.yml` declarent (112 lignes). |
|
- « README de roles » : la carte annonce 61, le depot en compte 62 |
|
||||||
|
| P49 | Registre des flux : la matrice d'audit est a jour | — | ✅ OK | Le registre des flux reproduit exactement ce que les `meta/flux.yml` declarent (113 lignes). |
|
||||||
| P50 | Silences : un refus muet est declare, place en dernier, et motive | — | ✅ OK | 2 silence(s) declare(s), tous en sequence > 1 (la plus haute des 122 regles `pass`), tous non consignes et tous motives. |
|
| P50 | Silences : un refus muet est declare, place en dernier, et motive | — | ✅ OK | 2 silence(s) declare(s), tous en sequence > 1 (la plus haute des 122 regles `pass`), tous non consignes et tous motives. |
|
||||||
| P51 | Collections : toutes declarees, toutes epinglees | — | ✅ OK | 3 collection(s) et 2 bibliotheque(s) Python declarees et epinglees : ansible.posix==1.6.2, community.general==10.3.0, community.postgresql==3.10.2 |
|
| P51 | Collections : toutes declarees, toutes epinglees | — | ✅ OK | 3 collection(s) et 2 bibliotheque(s) Python declarees et epinglees : ansible.posix==1.6.2, community.general==10.3.0, community.postgresql==3.10.2 |
|
||||||
| P52 | Materialiser n'exige pas d'entrer dans le tenant | — | ✅ OK | `creer-vm` confirme par l'agent invite (API des hyperviseurs, deja utilisee pour creer), sans exiger d'entrer dans le tenant. |
|
| P52 | Materialiser n'exige pas d'entrer dans le tenant | — | ✅ OK | `creer-vm` confirme par l'agent invite (API des hyperviseurs, deja utilisee pour creer), sans exiger d'entrer dans le tenant. |
|
||||||
|
|
|
||||||
|
|
@ -23,8 +23,8 @@ README de rôles). Cette page comble ces deux trous.
|
||||||
|
|
||||||
| Ce qu'on compte | Combien | Comment on le mesure |
|
| Ce qu'on compte | Combien | Comment on le mesure |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| rôles | 61 | `roles/*/` |
|
| rôles | 62 | `roles/*/` |
|
||||||
| README de rôles | 61 | `roles/*/README.md` — l'écart avec la ligne au-dessus est la dette |
|
| README de rôles | 62 | `roles/*/README.md` — l'écart avec la ligne au-dessus est la dette |
|
||||||
| documents | 38 | `docs/*.md` |
|
| documents | 38 | `docs/*.md` |
|
||||||
| pièces d'audit | 29 | `docs/audit/*` |
|
| pièces d'audit | 29 | `docs/audit/*` |
|
||||||
| unités de wiki | 27 | `wiki/*.md` |
|
| unités de wiki | 27 | `wiki/*.md` |
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,7 @@ Ce que la reconstruction couvre, par capacité :
|
||||||
| Runner de site | `serveur_ops_site` | le pouvoir de **materialiser** : creer et detruire des VM sur la fabric. Detient la voute du SITE, chiffree, et n'entre JAMAIS chez un tenant — reserve a l'ecosysteme de l'hebergeur |
|
| Runner de site | `serveur_ops_site` | le pouvoir de **materialiser** : creer et detruire des VM sur la fabric. Detient la voute du SITE, chiffree, et n'entre JAMAIS chez un tenant — reserve a l'ecosysteme de l'hebergeur |
|
||||||
| Resolution | `serveur_resolveur`, `client_resolveur` | UN resolveur recursif par tenant (Unbound), qui recurse depuis la racine et delegue la zone souveraine a PowerDNS. Remplace les N demons locaux d'avant le 2026-08-24 |
|
| Resolution | `serveur_resolveur`, `client_resolveur` | UN resolveur recursif par tenant (Unbound), qui recurse depuis la racine et delegue la zone souveraine a PowerDNS. Remplace les N demons locaux d'avant le 2026-08-24 |
|
||||||
| Cache du site | `serveur_cache_site` | designe LE cache que les ecosystemes voisins prennent comme amont : Debian telecharge une fois pour toute la fabric, et le cache ne voit que des requetes agregees. Reserve a l'ecosysteme de l'hebergeur |
|
| Cache du site | `serveur_cache_site` | designe LE cache que les ecosystemes voisins prennent comme amont : Debian telecharge une fois pour toute la fabric, et le cache ne voit que des requetes agregees. Reserve a l'ecosysteme de l'hebergeur |
|
||||||
|
| Forge du genome du site | `serveur_forge_site` | designe LA forge dont les ecosystemes de ce site se reproduisent (D-81), et l'ouvre a eux. Marqueur : `serveur_forgejo` installe. |
|
||||||
| Agents de flotte | `client_metrique`, `client_journal`, `client_smtp` | collecte et relais sur toute la flotte |
|
| Agents de flotte | `client_metrique`, `client_journal`, `client_smtp` | collecte et relais sur toute la flotte |
|
||||||
|
|
||||||
*Rôles retirés (2026-07-04, supersédés ou hors conception)* : `serveur_sendmail`
|
*Rôles retirés (2026-07-04, supersédés ou hors conception)* : `serveur_sendmail`
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,9 @@ couches:
|
||||||
# mouvement : elle vit dans l'underlay de l'hebergeur et se joint par
|
# mouvement : elle vit dans l'underlay de l'hebergeur et se joint par
|
||||||
# `scripts/site_inventaire.py`. Un tenant ne la deploie jamais — il la CONSOMME.
|
# `scripts/site_inventaire.py`. Un tenant ne la deploie jamais — il la CONSOMME.
|
||||||
- serveur_cache_site
|
- serveur_cache_site
|
||||||
|
# La forge du genome, meme nature : elle vit dans l'underlay de
|
||||||
|
# l'hebergeur et un tenant la CONSOMME sans jamais la deployer.
|
||||||
|
- serveur_forge_site
|
||||||
- nom: apps
|
- nom: apps
|
||||||
raison: "Les applications métier, qui consomment les services (base, SSO, courriel, edge)."
|
raison: "Les applications métier, qui consomment les services (base, SSO, courriel, edge)."
|
||||||
groupes:
|
groupes:
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@
|
||||||
| `serveur_dovecot` | ingress | 993 | tcp | externe | tls-requis | Accès courriel des utilisateurs (IMAPS). Frontière publique gérée à l'OPNsense. |
|
| `serveur_dovecot` | ingress | 993 | tcp | externe | tls-requis | Accès courriel des utilisateurs (IMAPS). Frontière publique gérée à l'OPNsense. |
|
||||||
| `serveur_dovecot` | ingress | 12345 | tcp | serveur_postfix | tls | Authentification SASL déléguée : Postfix valide les identifiants de soumission contre Dovecot. |
|
| `serveur_dovecot` | ingress | 12345 | tcp | serveur_postfix | tls | Authentification SASL déléguée : Postfix valide les identifiants de soumission contre Dovecot. |
|
||||||
| `serveur_dovecot` | egress | 636 | tcp | serveur_openldap | tls-requis | userdb/passdb : Dovecot résout et authentifie les comptes sur l'annuaire (LDAPS). |
|
| `serveur_dovecot` | egress | 636 | tcp | serveur_openldap | tls-requis | userdb/passdb : Dovecot résout et authentifie les comptes sur l'annuaire (LDAPS). |
|
||||||
|
| `serveur_forge_site` | ingress | 443 | tcp | voisins_site | tls-requis | Servir le génome aux écosystèmes de ce site : c'est de cette forge qu'ils clonent leur moteur, leurs modèles et la carte de la fabric (D-81). Sans ce flux, un écosystème neuf ne peut pas se reproduire. |
|
||||||
| `serveur_forgejo` | ingress | 3000 | tcp | edge | clair | Interface web + Git HTTP derrière un edge : le nginx termine le TLS et parle en clair à la forge. C'est le cas de tout tenant. |
|
| `serveur_forgejo` | ingress | 3000 | tcp | edge | clair | Interface web + Git HTTP derrière un edge : le nginx termine le TLS et parle en clair à la forge. C'est le cas de tout tenant. |
|
||||||
| `serveur_forgejo` | ingress | derive | tcp | flotte | tls | Sans edge devant elle — la forge du SITE — elle sert son propre TLS sur le port du schéma (443), avec le certificat de la machine. `derive` parce que le port vient de `serveur_forgejo_http_port` : écrire 3000 en dur ici serait faux pour elle, et rien ne le signalerait puisque ce flux ne traverse pas la frontière. |
|
| `serveur_forgejo` | ingress | derive | tcp | flotte | tls | Sans edge devant elle — la forge du SITE — elle sert son propre TLS sur le port du schéma (443), avec le certificat de la machine. `derive` parce que le port vient de `serveur_forgejo_http_port` : écrire 3000 en dur ici serait faux pour elle, et rien ne le signalerait puisque ce flux ne traverse pas la frontière. |
|
||||||
| `serveur_forgejo` | egress | 25 | tcp | serveur_postfix | starttls | Notifications courriel (relais via le MTA Postfix). |
|
| `serveur_forgejo` | egress | 25 | tcp | serveur_postfix | starttls | Notifications courriel (relais via le MTA Postfix). |
|
||||||
|
|
@ -109,4 +110,4 @@
|
||||||
- **starttls** : 6 flux
|
- **starttls** : 6 flux
|
||||||
- **tls** : 9 flux
|
- **tls** : 9 flux
|
||||||
- **tls-cible** : 2 flux
|
- **tls-cible** : 2 flux
|
||||||
- **tls-requis** : 32 flux
|
- **tls-requis** : 33 flux
|
||||||
|
|
|
||||||
15
playbooks/groupes/serveur_forge_site.yml
Normal file
15
playbooks/groupes/serveur_forge_site.yml
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
---
|
||||||
|
- name: Appliquer le groupe serveur_forge_site
|
||||||
|
hosts: serveur_forge_site
|
||||||
|
become: true
|
||||||
|
gather_facts: true
|
||||||
|
|
||||||
|
pre_tasks:
|
||||||
|
- name: Vérifier que la cible est Debian
|
||||||
|
ansible.builtin.assert:
|
||||||
|
that:
|
||||||
|
- ansible_facts.distribution == "Debian"
|
||||||
|
fail_msg: "Ce playbook est prévu pour Debian."
|
||||||
|
|
||||||
|
roles:
|
||||||
|
- serveur_forge_site
|
||||||
|
|
@ -38,6 +38,14 @@
|
||||||
import_playbook: groupes/serveur_rspamd.yml
|
import_playbook: groupes/serveur_rspamd.yml
|
||||||
- name: Couche services — groupe serveur_backup
|
- name: Couche services — groupe serveur_backup
|
||||||
import_playbook: groupes/serveur_backup.yml
|
import_playbook: groupes/serveur_backup.yml
|
||||||
|
- name: Couche services — groupe serveur_artefacts
|
||||||
|
import_playbook: groupes/serveur_artefacts.yml
|
||||||
|
- name: Couche services — groupe serveur_cache_site
|
||||||
|
import_playbook: groupes/serveur_cache_site.yml
|
||||||
|
- name: Couche services — groupe serveur_forge_site
|
||||||
|
import_playbook: groupes/serveur_forge_site.yml
|
||||||
|
- name: Couche services — groupe serveur_resolveur
|
||||||
|
import_playbook: groupes/serveur_resolveur.yml
|
||||||
- name: Couche services — groupe serveur_dovecot
|
- name: Couche services — groupe serveur_dovecot
|
||||||
import_playbook: groupes/serveur_dovecot.yml
|
import_playbook: groupes/serveur_dovecot.yml
|
||||||
- name: Couche services — groupe serveur_postfix
|
- name: Couche services — groupe serveur_postfix
|
||||||
|
|
@ -64,6 +72,12 @@
|
||||||
import_playbook: groupes/serveur_icingaweb2.yml
|
import_playbook: groupes/serveur_icingaweb2.yml
|
||||||
- name: Couche apps — groupe serveur_nextcloud
|
- name: Couche apps — groupe serveur_nextcloud
|
||||||
import_playbook: groupes/serveur_nextcloud.yml
|
import_playbook: groupes/serveur_nextcloud.yml
|
||||||
|
- name: Couche apps — groupe serveur_ops
|
||||||
|
import_playbook: groupes/serveur_ops.yml
|
||||||
|
- name: Couche apps — groupe serveur_ops_tenant
|
||||||
|
import_playbook: groupes/serveur_ops_tenant.yml
|
||||||
|
- name: Couche apps — groupe serveur_ops_site
|
||||||
|
import_playbook: groupes/serveur_ops_site.yml
|
||||||
|
|
||||||
# --- couche agents ---
|
# --- couche agents ---
|
||||||
- name: Couche agents — groupe client_metrique
|
- name: Couche agents — groupe client_metrique
|
||||||
|
|
@ -76,3 +90,5 @@
|
||||||
import_playbook: groupes/client_backup.yml
|
import_playbook: groupes/client_backup.yml
|
||||||
- name: Couche agents — groupe client_resolveur
|
- name: Couche agents — groupe client_resolveur
|
||||||
import_playbook: groupes/client_resolveur.yml
|
import_playbook: groupes/client_resolveur.yml
|
||||||
|
- name: Couche agents — groupe client_artefacts
|
||||||
|
import_playbook: groupes/client_artefacts.yml
|
||||||
|
|
|
||||||
48
roles/serveur_forge_site/README.md
Normal file
48
roles/serveur_forge_site/README.md
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
# serveur_forge_site
|
||||||
|
|
||||||
|
**Le marqueur de la forge du génome.** Il dit que *cette* forge est celle dont les
|
||||||
|
écosystèmes du site se reproduisent (D-81), et déclare le flux qui le permet. Il
|
||||||
|
n'installe rien.
|
||||||
|
|
||||||
|
## Pourquoi il existe séparément
|
||||||
|
|
||||||
|
C'est le même patron que `serveur_artefacts` + `serveur_cache_site` : **un installateur,
|
||||||
|
un marqueur**.
|
||||||
|
|
||||||
|
| | |
|
||||||
|
|---|---|
|
||||||
|
| `serveur_forgejo` | pose le logiciel, sert sa propre flotte |
|
||||||
|
| **ce rôle** | désigne la forge comme **racine du génome du site**, et l'ouvre aux tenants |
|
||||||
|
|
||||||
|
Ajouter `ingress 443 from voisins_site` à `serveur_forgejo` aurait ouvert **la forge de
|
||||||
|
chaque tenant** à ses voisins. La responsabilité appartient à une machine précise, pas au
|
||||||
|
logiciel qu'elle fait tourner.
|
||||||
|
|
||||||
|
## Ce qu'il a corrigé
|
||||||
|
|
||||||
|
Le site rend deux services à ses locataires pendant leur jeunesse : **les paquets** et
|
||||||
|
**le génome**. Le premier était déclaré (`serveur_cache_site`), le second ne l'était pas —
|
||||||
|
alors que D-81 fait de cette forge l'autorité dont tout écosystème se reproduit.
|
||||||
|
|
||||||
|
Mesuré le 2026-08-28 sur `ops-01`, première machine de la reconstruction de Chezlepro :
|
||||||
|
|
||||||
|
```
|
||||||
|
cache du SITE 10.0.33.21:3142 : OK
|
||||||
|
forge du SITE 10.0.33.11:443 : BLOQUÉ
|
||||||
|
```
|
||||||
|
|
||||||
|
Le plan du tenant déclarait pourtant lire son génome à cette adresse. **Une dépendance
|
||||||
|
déclarée chez le consommateur, sans flux correspondant chez le fournisseur** — et rien ne
|
||||||
|
le signalait : la garde de matrice de `resoudre_flux` ne vérifie que les paires
|
||||||
|
rôle→rôle, jamais un `pair` symbolique comme `voisins_site`.
|
||||||
|
|
||||||
|
## Qui peut le déclarer
|
||||||
|
|
||||||
|
**L'écosystème de l'hébergeur**, et lui seul. Un tenant qui le déclarerait offrirait sa
|
||||||
|
forge à ses voisins.
|
||||||
|
|
||||||
|
## Ce que ce rôle ne fait pas
|
||||||
|
|
||||||
|
Il n'installe rien, n'ouvre aucun port, ne sauvegarde rien. Il attribue une
|
||||||
|
responsabilité — et vérifie que le service qu'il désigne écoute vraiment, faute de quoi
|
||||||
|
il donnerait l'autorité du génome à un port muet.
|
||||||
9
roles/serveur_forge_site/defaults/main.yml
Normal file
9
roles/serveur_forge_site/defaults/main.yml
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
---
|
||||||
|
# LA FORGE DU GÉNOME DU SITE — le marqueur, pas l'installateur.
|
||||||
|
#
|
||||||
|
# `serveur_forgejo` pose le logiciel ; ce rôle dit que CETTE forge est celle dont les
|
||||||
|
# écosystèmes du site se reproduisent (D-81), et déclare le flux qui le permet.
|
||||||
|
#
|
||||||
|
# Le port est celui que le plan du site donne à la forge. On ne le redéclare pas ici :
|
||||||
|
# une seconde source finirait par diverger de la première.
|
||||||
|
serveur_forge_site_port: "{{ serveur_forgejo_port | default(443) }}"
|
||||||
14
roles/serveur_forge_site/meta/authentification.yml
Normal file
14
roles/serveur_forge_site/meta/authentification.yml
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
---
|
||||||
|
# Position de ce role dans la directive d'authentification (D-38..D-41).
|
||||||
|
# Voir docs/authentification.md. Gardee par la preuve P29.
|
||||||
|
authentification:
|
||||||
|
portee: sans-auth-humaine
|
||||||
|
mecanisme: aucun
|
||||||
|
formulaire_local: sans-objet
|
||||||
|
secours: "Acces SSH a l'hote"
|
||||||
|
raison: >-
|
||||||
|
Ce marqueur n'expose aucune interface : l'authentification de la forge elle-meme est
|
||||||
|
celle de `serveur_forgejo`. Ce que ce role ajoute est une LISTE de pairs — seuls les
|
||||||
|
tenants de ce site clonent ici, et la frontiere le fait respecter. Les depots servis
|
||||||
|
par ce chemin sont ceux du genome, publics par nature ; les depots prives gardent
|
||||||
|
l'authentification de la forge.
|
||||||
7
roles/serveur_forge_site/meta/empreinte.yml
Normal file
7
roles/serveur_forge_site/meta/empreinte.yml
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
---
|
||||||
|
# Empreinte ressources — ce role n'installe rien. Il attribue une responsabilite a une
|
||||||
|
# forge qui existe deja, et la rend lisible dans le plan.
|
||||||
|
setops_empreinte:
|
||||||
|
coeurs: 0
|
||||||
|
memoire_mo: 0
|
||||||
|
disque_go: 0
|
||||||
41
roles/serveur_forge_site/meta/flux.yml
Normal file
41
roles/serveur_forge_site/meta/flux.yml
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
---
|
||||||
|
# Flux réseau de la FORGE DU GÉNOME DU SITE. Voir docs/flux-conception.md.
|
||||||
|
#
|
||||||
|
# UN SEUL FLUX, et c'est tout son sens : servir le génome aux écosystèmes que ce site
|
||||||
|
# héberge. `serveur_forgejo` porte le reste (servir sa propre flotte, ses miroirs).
|
||||||
|
#
|
||||||
|
# EXACTEMENT LE SYMÉTRIQUE DE `serveur_cache_site`. Le site rend deux services à ses
|
||||||
|
# locataires pendant leur jeunesse : les paquets et le génome. Le premier était déclaré,
|
||||||
|
# le second ne l'était pas — et pourtant D-81 fait de cette forge l'AUTORITÉ dont tout
|
||||||
|
# écosystème se reproduit.
|
||||||
|
#
|
||||||
|
# CE QUE ÇA A COÛTÉ (2026-08-28) : `ops-01`, première machine de la reconstruction de
|
||||||
|
# Chezlepro, atteignait le cache du site et restait bloquée sur le clonage du génome.
|
||||||
|
#
|
||||||
|
# cache du SITE 10.0.33.21:3142 : OK
|
||||||
|
# forge du SITE 10.0.33.11:443 : BLOQUÉ
|
||||||
|
#
|
||||||
|
# Le plan du tenant déclarait pourtant lire son génome à cette adresse. **Une dépendance
|
||||||
|
# déclarée chez le consommateur, sans flux correspondant chez le fournisseur** — et rien
|
||||||
|
# ne le signalait, parce que la garde de matrice ne vérifie que les paires rôle→rôle.
|
||||||
|
#
|
||||||
|
# `voisins_site` désigne les autres tenants que CE SITE héberge. Ni `flotte` (mon
|
||||||
|
# écosystème), ni `externe` — qui aurait publié la forge du génome à l'Internet.
|
||||||
|
#
|
||||||
|
# LA RÈGLE APPARTIENT AU SITE : c'est son runner qui prépare le terrain, pas un tenant
|
||||||
|
# qui ouvrirait une porte chez un autre.
|
||||||
|
flux:
|
||||||
|
- sens: ingress
|
||||||
|
port: 443
|
||||||
|
protocole: tcp
|
||||||
|
pair: voisins_site
|
||||||
|
chiffrement: tls-requis
|
||||||
|
raison: >-
|
||||||
|
Servir le génome aux écosystèmes de ce site : c'est de cette forge qu'ils clonent
|
||||||
|
leur moteur, leurs modèles et la carte de la fabric (D-81). Sans ce flux, un
|
||||||
|
écosystème neuf ne peut pas se reproduire.
|
||||||
|
# CE RÔLE N'OUVRE AUCUNE ÉCOUTE — il emprunte celle de `serveur_forgejo`, sur le même
|
||||||
|
# hôte. Sans ce mot, P33 y voit deux rôles qui se disputent le 443, et elle a raison
|
||||||
|
# de le demander : seul le registre distingue « j'ouvre » de « j'autorise une source
|
||||||
|
# de plus sur l'écoute d'un autre ».
|
||||||
|
partage: true
|
||||||
15
roles/serveur_forge_site/meta/main.yml
Normal file
15
roles/serveur_forge_site/meta/main.yml
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
---
|
||||||
|
# CE RÔLE EN EXIGE UN AUTRE, ET C'EST À ANSIBLE DE LE SAVOIR.
|
||||||
|
#
|
||||||
|
# `serveur_forge_site` n'installe rien : il MARQUE une forge comme détentrice du génome
|
||||||
|
# du site, et vérifie qu'elle écoute vraiment. Pour cela il lit les variables de
|
||||||
|
# `serveur_forgejo`.
|
||||||
|
#
|
||||||
|
# Or les valeurs par défaut d'un rôle ne sont en portée que DANS LE PLAY QUI L'INCLUT.
|
||||||
|
# Une dépendance de rôle règle les deux choses d'un coup : Ansible applique l'installateur
|
||||||
|
# AVANT le marqueur, dans le MÊME play, donc ses variables sont en portée — et l'ordre
|
||||||
|
# cesse de dépendre de la façon dont on lance le déploiement.
|
||||||
|
#
|
||||||
|
# Même raisonnement, mot pour mot, que `serveur_cache_site` devant `serveur_artefacts`.
|
||||||
|
dependencies:
|
||||||
|
- role: serveur_forgejo
|
||||||
29
roles/serveur_forge_site/tasks/main.yml
Normal file
29
roles/serveur_forge_site/tasks/main.yml
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
---
|
||||||
|
# CE RÔLE MARQUE UNE FORGE ; IL N'EN INSTALLE PAS.
|
||||||
|
#
|
||||||
|
# Il présuppose `serveur_forgejo` sur le même hôte et lit ses variables. Le message qu'on
|
||||||
|
# obtiendrait sans lui — « variable non définie » — envoie chercher une faute de frappe
|
||||||
|
# alors que la cause est une déclaration incomplète, un cran au-dessus. On le dit donc
|
||||||
|
# nous-mêmes, et en premier.
|
||||||
|
- name: Le rôle qui installe la forge est-il bien là ?
|
||||||
|
ansible.builtin.assert:
|
||||||
|
that:
|
||||||
|
- serveur_forge_site_port is defined
|
||||||
|
- serveur_forge_site_port | int > 0
|
||||||
|
fail_msg: >-
|
||||||
|
`serveur_forge_site` marque une forge existante, il n'en installe aucune.
|
||||||
|
Cet hôte doit AUSSI porter `serveur_forgejo`. Ajouter les deux rôles à sa
|
||||||
|
déclaration, dans cet ordre.
|
||||||
|
|
||||||
|
# ÉCRIRE, PUIS RELIRE (D-68). Le rôle n'installe rien : sa seule prise sur le réel est de
|
||||||
|
# vérifier que le service qu'il désigne existe vraiment. Sans ça, il attribuerait
|
||||||
|
# l'autorité du génome à un port que personne n'écoute — et l'écosystème qui viendrait
|
||||||
|
# s'y reproduire attendrait sans savoir pourquoi. C'est précisément ce qui est arrivé le
|
||||||
|
# 2026-08-28 : `ops-01` a attendu quinze minutes sur un clonage qui ne pouvait pas
|
||||||
|
# aboutir.
|
||||||
|
- name: La forge écoute-t-elle vraiment ?
|
||||||
|
ansible.builtin.wait_for:
|
||||||
|
host: "127.0.0.1"
|
||||||
|
port: "{{ serveur_forge_site_port }}"
|
||||||
|
timeout: 30
|
||||||
|
when: not ansible_check_mode
|
||||||
Loading…
Reference in a new issue