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
Patient 0 est le **plus petit écosystème complet** : PKI, DNS, edge, courriel,
PostgreSQL, et une **forge**. Six machines. Sa raison d'être tient en une phrase :
Patient 0 est le **plus petit écosystème complet** : une PKI, un DNS, un edge, une
**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.
Aujourd'hui, ce rôle est tenu par `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. Tout ce
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
unique de défaillance : on l'élimine.
Un tenant ordinaire existe pour ses gens : Chezlepro héberge de l'identité, du courriel,
de la collaboration. Patient 0 n'héberge que **la lignée**.
## Ce qu'il remplace
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
@ -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.
## É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
| | |
|---|---|
| `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/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
**`index: 29`** — tout l'adressage en dérive (`10.29.0.0/16`, VLAN 1291-1296). Choisi
libre : 13 est le lab, 17 Chezlepro, 23 Technolibre. Les index bas (1, 11) ont déjà forcé
deux renumérotages, ils tombaient dans des plages occupées par du matériel.
**`index: 29`** — tout l'adressage en dérive. Choisi libre : 13 est le lab, 17 Chezlepro,
23 Technolibre. Les index bas (1, 11) ont déjà forcé deux renumérotages, ils tombaient
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
matérialisé : ni la frontière, ni le SDN, ni le pare-feu de l'hyperviseur ne lui réservent
quoi que ce soit. C'est délibéré et temporaire. À basculer à `true` le jour où on le
déploie, **avant** `make sdn-appliquer` — sinon ses zones n'existeront nulle part.
**`federe: true`** — patient 0 est pris en compte par les devis du site : la frontière,
le SDN et le pare-feu de l'hyperviseur lui réservent ses zones. Il est resté à `false`
tant qu'il n'était qu'un plan, et a été basculé **avant** `make sdn-appliquer` — sinon
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*
Chezlepro d'un coup. Ailleurs, la famille survit à la perte du cluster.
Le déménagement tient en quatre valeurs (`group_vars/proxmox.yml`) et un symlink.
- [ ] **Créer la voûte réelle** :
`ansible-vault create inventories/production/group_vars/all/vault.yml`,
en couvrant les noms du gabarit (`vault.yml.example`).
- [ ] **Basculer `federe: true`**, puis `make instancier``make instancier-appliquer`.
- [ ] `make placement-plan` — confronter les quatre valeurs au cluster **avant** de
cloner quoi que ce soit : quarante minutes de déploiement ne se rattrapent pas.
- [ ] 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.
Chezlepro d'un coup. Ailleurs, la famille survit à la perte du cluster. Le
déménagement tient en quatre valeurs (`group_vars/proxmox.yml`) et un symlink.
- [ ] **Une source d'artefacts.** Sa forge héberge du code, pas des binaires. Les
collections Ansible sont réglées (cache du contrôleur, poussé par SSH) ; Forgejo,
step-ca et les autres viennent encore du dehors. Un enfant coupé de l'internet ne
se construit pas.
- [ ] **Son propre résolveur.** Les hôtes interrogent Quad9 et non `infra-dns-01` :
l'écosystème fait tourner un DNS que personne n'utilise.