README : remettre le texte en phase avec la machine

Le document decrivait six machines dont un courriel et un PostgreSQL, et
federe: false. Le plan en declare cinq -- pki, dns, edge, forge, ops -- sans
courriel, Forgejo sur SQLite, et la federation basculee au deploiement. Toute la
liste "ce qui reste a faire" etait faite.

Ajoute ce qui n'existait pas quand il a ete ecrit : le poste d'exploitation et
ses deux symlinks, l'etat des cinq depots du genome (deux miroirs, trois figes),
et la ligne entre ce que le poste reproduit seul et ce qui exige une cle humaine.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-08-23 12:45:05 -04:00
parent c6035a2d57
commit d9ed37cc47

141
README.md
View file

@ -5,16 +5,24 @@
## Ce qu'il est ## Ce qu'il est
Patient 0 est le **plus petit écosystème complet** : PKI, DNS, edge, courriel, Patient 0 est le **plus petit écosystème complet** : une PKI, un DNS, un edge, une
PostgreSQL, et une **forge**. Six machines. Sa raison d'être tient en une phrase : **forge**, et un **poste d'exploitation**. Cinq machines. Sa raison d'être tient en une
phrase :
> porter les dépôts qui fabriquent les écosystèmes, et les servir à ses enfants. > porter les dépôts qui fabriquent les écosystèmes, et les servir à ses enfants.
Aujourd'hui, ce rôle est tenu par `eregion.chezlepro.ca` — une machine **hors flotte**, Un tenant ordinaire existe pour ses gens : Chezlepro héberge de l'identité, du courriel,
montée à la main, que Set-OPS ne déploie pas, ne sauvegarde pas et ne prouve pas. Tout ce de la collaboration. Patient 0 n'héberge que **la lignée**.
qui fabrique Chezlepro dépend d'elle. Patient 0 la remplace par un écosystème **bâti par
le moteur, sauvegardé par le moteur, vérifié par le harnais**. On ne déplace pas le point ## Ce qu'il remplace
unique de défaillance : on l'élimine.
Aujourd'hui encore, tout ce qui fabrique Chezlepro dépend de `eregion.chezlepro.ca` — une
machine **hors flotte**, montée à la main, que Set-OPS ne déploie pas, ne sauvegarde pas
et ne prouve pas. C'est un point unique de défaillance, situé exactement là où il fait le
plus mal : à la racine.
Patient 0 le remplace par un écosystème **bâti par le moteur, sauvegardé par le moteur,
vérifié par le harnais**. On ne déplace pas le point unique de défaillance : on l'élimine.
## La boucle, et comment elle se casse ## La boucle, et comment elle se casse
@ -29,36 +37,115 @@ patient 0 (la forge mère) · le poste de l'exploitant · restic hors cluste
N'importe quel survivant réamorce les autres. Une famille, pas un maître. N'importe quel survivant réamorce les autres. Une famille, pas un maître.
## État au 2026-08-23 : matérialisé
Les cinq machines tournent. L'adressage dérive du seul seed `index: 29` — supernet
`10.29.0.0/16`, zones en `10.29.(15+zone).0/24`, VLAN `1290+zone`.
| machine | fonction | adresse | ce qu'elle porte |
|---|---|---|---|
| `infra-edge-01` | infra-edge | `10.29.16.11` | nginx — publie `forge.genese.internal` |
| `infra-dns-01` | infra-dns | `10.29.19.11` | PowerDNS autoritatif |
| `infra-pki-01` | infra-pki | `10.29.19.21` | step-ca — l'autorité interne |
| `ops-01` | ops | `10.29.19.41` | le **poste d'exploitation** |
| `forge-01` | forge | `10.29.21.11` | Forgejo — le génome |
**Forgejo tourne sur SQLite**, pas sur une VM PostgreSQL dédiée : une base qu'une
poignée de personnes sollicite ne justifie pas un serveur, une zone, un secret et une
sauvegarde de plus. Moins de surface sur la machine dont tout descend.
**Ni courriel ni base de données centrale.** Le plan en a porté au stade projet ; ils ont
été retirés. Patient 0 n'a pas d'usagers à notifier.
**Sauvegarde** : `infra-pki-01` et `forge-01` poussent leur état vers
`eregion.chezlepro.ca` — les deux seules machines qui détiennent quelque chose
d'irremplaçable (les clés de l'AC, les dépôts).
**Il est hébergé par la fabric de Chezlepro** (`SITE-Chezlepro`), au même titre qu'un
autre tenant. Il n'a pas d'underlay à lui.
## Le génome, sur sa forge
Les dépôts vivent sous l'organisation `genome` :
| dépôt | miroir de l'amont |
|---|---|
| `set-ops-public` | **oui** — toutes les 8 h |
| `ops-patient0` | **oui** — toutes les 8 h |
| `site-chezlepro` | non — figé au poussage |
| `set-ops-modeles` | non — figé au poussage |
| `ops-chezlepro` | non, et privé — le plan d'un tenant voisin, sans usage ici |
Les deux miroirs suivent `forge.alliance-boreale.ca`. Les trois autres attendent un jeton
amont en **lecture seule** : un jeton capable d'écrire chez le parent inverserait le sens
de la filiation, et ne sera pas posé ici.
L'étiquette signée `v2026.08.21` a traversé le miroir intacte — la provenance reste
vérifiable depuis l'enfant.
## Le poste d'exploitation
`ops-01` porte `/opt/setops` : Ansible épinglé (core 2.18), le génome cloné **depuis sa
propre forge**, et les deux symlinks de D-80.
```
Set-OPS-public/instance -> OPS-Patient0 quel tenant on pilote
Set-OPS-public/underlay.yml -> SITE-Chezlepro/… sur quelle fabric il repose
```
Ce qu'il **n'a pas**, et n'aura jamais : le mot de passe de la voûte, saisi à
l'exécution ; le fichier de voûte lui-même, hors dépôt ; `underlay.vault.yml`, les
secrets du monde physique. Il lit la **carte** de la fabric, jamais ses **clés**.
D'où une ligne nette, mesurée depuis la machine :
```
make instancier DIFF VIDE : le plan reproduit exactement l'inventaire actuel
make underlay-plan refusé — aucune voûte
```
Il reproduit sa propre structure sans aucun secret. Il ne touche pas à la fabric sans
qu'un humain apporte la clé.
## Ce que ce dépôt contient, et ce qu'il ne contiendra jamais ## Ce que ce dépôt contient, et ce qu'il ne contiendra jamais
| | | | | |
|---|---| |---|---|
| `plan/` | les six machines, leurs zones, leurs applications | | `plan/` | les cinq machines, leurs zones, leurs applications |
| `inventories/production/group_vars/` | les intrants, le placement Proxmox, le **gabarit** de voûte | | `inventories/production/group_vars/` | les intrants, le placement Proxmox, le **gabarit** de voûte |
| `inventories/production/hosts.yml` | **généré** depuis le plan — ne jamais l'éditer à la main | | `inventories/production/hosts.yml` | **généré** depuis le plan — ne jamais l'éditer à la main |
| le mot de passe de la voûte | **jamais**. Ni ici, ni dans aucun dépôt : c'est le seul objet que la reproduction exige d'un humain | | `parente.yml` | de quels dépôts, à quels commits, cet écosystème descend |
| la voûte et son mot de passe | **jamais**. Ni ici, ni dans aucun dépôt : c'est le seul objet que la reproduction exige d'un humain |
Conséquence à connaître, et qui n'est pas un défaut :
```
la STRUCTURE se reconstruit depuis la forge
les SECRETS se restaurent depuis la sauvegarde (restic)
```
Deux sources distinctes, qu'un même incident n'atteint pas ensemble.
## Deux réglages à connaître ## Deux réglages à connaître
**`index: 29`** — tout l'adressage en dérive (`10.29.0.0/16`, VLAN 1291-1296). Choisi **`index: 29`** — tout l'adressage en dérive. Choisi libre : 13 est le lab, 17 Chezlepro,
libre : 13 est le lab, 17 Chezlepro, 23 Technolibre. Les index bas (1, 11) ont déjà forcé 23 Technolibre. Les index bas (1, 11) ont déjà forcé deux renumérotages, ils tombaient
deux renumérotages, ils tombaient dans des plages occupées par du matériel. dans des plages occupées par du matériel.
**`federe: false`** — patient 0 est **exclu des devis du site** tant qu'il n'est pas **`federe: true`** — patient 0 est pris en compte par les devis du site : la frontière,
matérialisé : ni la frontière, ni le SDN, ni le pare-feu de l'hyperviseur ne lui réservent le SDN et le pare-feu de l'hyperviseur lui réservent ses zones. Il est resté à `false`
quoi que ce soit. C'est délibéré et temporaire. À basculer à `true` le jour où on le tant qu'il n'était qu'un plan, et a été basculé **avant** `make sdn-appliquer` — sinon
déploie, **avant** `make sdn-appliquer` — sinon ses zones n'existeront nulle part. ses VLAN n'auraient existé nulle part.
## Ce qui reste à faire avant de le matérialiser ## Ce qui reste devant
- [ ] **Les trois miroirs privés**, dès qu'un jeton amont en lecture seule existe.
- [ ] **Décider où il vit.** Sur `asgard`, la perte du cluster emporte patient 0 *et* - [ ] **Décider où il vit.** Sur `asgard`, la perte du cluster emporte patient 0 *et*
Chezlepro d'un coup. Ailleurs, la famille survit à la perte du cluster. Chezlepro d'un coup. Ailleurs, la famille survit à la perte du cluster. Le
Le déménagement tient en quatre valeurs (`group_vars/proxmox.yml`) et un symlink. déménagement tient en quatre valeurs (`group_vars/proxmox.yml`) et un symlink.
- [ ] **Créer la voûte réelle** : - [ ] **Une source d'artefacts.** Sa forge héberge du code, pas des binaires. Les
`ansible-vault create inventories/production/group_vars/all/vault.yml`, collections Ansible sont réglées (cache du contrôleur, poussé par SSH) ; Forgejo,
en couvrant les noms du gabarit (`vault.yml.example`). step-ca et les autres viennent encore du dehors. Un enfant coupé de l'internet ne
- [ ] **Basculer `federe: true`**, puis `make instancier``make instancier-appliquer`. se construit pas.
- [ ] `make placement-plan` — confronter les quatre valeurs au cluster **avant** de - [ ] **Son propre résolveur.** Les hôtes interrogent Quad9 et non `infra-dns-01` :
cloner quoi que ce soit : quarante minutes de déploiement ne se rattrapent pas. l'écosystème fait tourner un DNS que personne n'utilise.
- [ ] Déployer, puis y **pousser les quatre dépôts** du génome (moteur, instances,
hébergeur, modèles) et inscrire la parenté de chacun.