diff --git a/README.md b/README.md index eb73618..f93adcd 100644 --- a/README.md +++ b/README.md @@ -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.