diff --git a/AGENTS.md b/AGENTS.md index 14405b4..8216c08 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -41,7 +41,7 @@ readlink instance # doit pointer vers le dépôt de l'instance active find . -maxdepth 3 -type f | sort ``` -Lire ensuite `AGENTS.md`, `README.md`, `CHANGELOG.md` (les entrées récentes) et `ansible.cfg`. +Lire ensuite `AGENTS.md`, `README.md`, `docs/README.md` (l'index), `docs/architecture.md`, `CHANGELOG.md` (les entrées récentes) et `ansible.cfg`. Avant de modifier le moteur : `docs/conception/mecanismes.md`. **Arrêter et demander à l'opérateur** dans deux cas : @@ -135,7 +135,7 @@ Set-OPS se pilote par un **plan**. L'inventaire Ansible est **généré** à par **`` est une place, pas un nom.** Le moteur le résout dans l'ordre défini par `ORDRE_INVENTAIRE` dans `scripts/inventory_rules.py`. Ne coder aucun nom d'inventaire en dur, ni dans le code ni dans la doc. Dans une recette `make`, utiliser `$SETOPS_INVENTAIRE`, exporté par le `Makefile`. Depuis un shell nu, la variable n'existe pas : passer le chemin réel. -Référence : `docs/plan-et-generation.md`. +Référence : `docs/conception/plan-et-generation.md`. --- @@ -161,7 +161,7 @@ make underlay-plan make placement-plan Si l'agent ne peut pas joindre la flotte, le devis est déclaré **non exécuté** dans le rapport (section 2). Ne jamais le présumer vert. -Référence : `docs/devis-services.md`. +Référence : `docs/exploitation/devis-services.md`. --- @@ -453,7 +453,7 @@ Il ne s'active jamais dans le gabarit, mais sur un clone ou un serveur final, av **Ses règles ne s'écrivent pas à la main.** Chaque rôle déclare ce qu'il reçoit dans `meta/flux.yml`, puis `scripts/resoudre_flux.py` dérive les règles. Le même registre alimente l'hôte, l'hyperviseur et la frontière OPNsense. -Références : `docs/flux-conception.md`, `docs/registre-flux.md`. +Références : `docs/conception/flux-conception.md`, `docs/conception/registre-flux.md`. --- @@ -502,7 +502,7 @@ Le GUI, le générateur et la modélisation sont maison et souverains. Leur **p En cas de doute sur une fonction, **demander à l'opérateur** avant d'écrire du code. -Référence : `docs/positionnement.md`. +Référence : `docs/projet/positionnement.md`. --- @@ -534,16 +534,16 @@ Ce fichier ne contient aucun chiffre mesuré. Pour connaître l'état réel, int | Question | Source | |---|---| -| Quels rôles sont éprouvés en production ? | tableau de maturité de `docs/catalogue-services.md`. **Ne jamais présenter comme « en production » un rôle que ce tableau ne donne pas pour tel.** | +| Quels rôles sont éprouvés en production ? | tableau de maturité de `docs/projet/catalogue-services.md`. **Ne jamais présenter comme « en production » un rôle que ce tableau ne donne pas pour tel.** | | Combien de preuves, et lesquelles passent ? | `make prouver` | | Le système déployé est-il conforme au dépôt ? | les devis `make *-plan` (section 4) | | Le plan et l'inventaire concordent-ils ? | `make instancier` | | Quand la flotte a-t-elle été reconstruite, et avec quel résultat ? | `CHANGELOG.md` | -| Que dit la décision D-xx ? | | -| Que garde la preuve Pxx ? | | -| Comment est généré l'inventaire ? | `docs/plan-et-generation.md` | -| Quels seuils ? | `docs/positionnement.md` | -| Quels flux ? | `docs/flux-conception.md`, `docs/registre-flux.md` | +| Que dit la décision D-xx ? | `docs/projet/decisions-architecture.md` | +| Que garde la preuve Pxx ? | `scripts/prouver.py` (registre en fin de fichier), `docs/audit/affirmations.md` | +| Comment est généré l'inventaire ? | `docs/conception/plan-et-generation.md` | +| Quels seuils ? | `docs/projet/positionnement.md` | +| Quels flux ? | `docs/conception/flux-conception.md`, `docs/conception/registre-flux.md` | --- diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a8177f..b18c40a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,51 @@ +## 2026-10-15 (154) — La documentation, rangée par lecteur, avec trois portes d'entrée + +**95 preuves.** `make verifier` : 94 OK, 1 échec — P60, le wiki publié est en retard depuis +`cdac6d0` (14 octobre) ; `make publier` ne publie pas le wiki, il faut `make wiki-publier`. +Témoin des liens (chaque `docs/…` cité existe, chaque lien relatif d'un document mène à un +fichier) : 0 mort sur 1 078 fichiers, comme avant la refonte ; un déplacement non suivi, +essayé dans une copie, est signalé à 7 endroits. + +**Le README ne garde que le rôle du projet et le démarrage rapide** (60 lignes au lieu de 231). +La justification de l'AGPLv3 et le modèle libre + services passent dans +`docs/projet/positionnement.md` §6. + +**Trois portes d'entrée et un index**, dans `docs/` : +- `architecture.md` — composants, moteur / site / locataire, du plan au déploiement, ce qu'un + rôle déclare et ce que le moteur dérive, réseau, déclaré / dérivé / mesuré, sécurité ; cinq + schémas Mermaid ; +- `setup.md` — prérequis, instance, voûtes, Proxmox, gabarit, premier déploiement, pannes + connues au premier montage ; +- `usage.md` — conventions (`-plan`, `-appliquer`, `CONFIRMER`, `FORCE`), variables de `make` + et d'environnement, et les 154 cibles publiques rangées en 13 familles ; +- `README.md` — l'index : par situation, par lecteur, registres, « le dépôt en chiffres ». + +**Les documents sont rangés par lecteur** (`git mv`, l'histoire suit) : `conception/` (25, +le mainteneur), `exploitation/` (10, l'exploitant), `hebergement/` (6), `projet/` (6). Les +registres YAML lus par le code restent à la racine de `docs/`. 598 chemins réécrits dans 361 +fichiers (rôles, wiki, scripts, AGENTS.md) ; les liens relatifs entre documents sont recalculés. +Le CHANGELOG et les rapports de preuve datés ne sont pas réécrits : c'est l'histoire. + +**Fondus puis retirés** : `QUICKSTART.md` (→ README et `setup.md`), `SOLUTION.md` (historique, +déjà supplanté), `docs/architecture-set-ops.md` (→ `architecture.md`), `docs/carte-set-ops.md` +(§1 → l'index, §2 à 4 → `conception/mecanismes.md`). `docs/modeles_vm/debian13-proxmox.md` +devient `exploitation/gabarit-debian13-justification.md`, à côté de la procédure. + +**Les preuves suivent :** +- P48 lit l'index (chiffres et pointeurs) et `conception/mecanismes.md` (pointeurs) ; un + chiffre faux posé exprès est signalé. +- Les gardes qui lisent « tous les documents » ne parcouraient que le premier niveau de + `docs/` : elles passent par `_documents()`, sous-dossiers compris, hors audit. Sans cela, la + refonte leur aurait retiré quarante documents en silence. +- `preuve_runbooks` exige les quatre portes et `conception/mecanismes.md`. +- **Nouvelle garde** dans la preuve de l'outillage : chaque cible publique du `Makefile` est + citée dans `docs/usage.md`, et chaque cible citée existe. Une cible retirée et une cible + inventée, essayées, sont signalées. + +Au passage : la référence morte `docs/zero-confiance.md` (`client_pki`, fichier jamais écrit) +pointe vers le champ `chiffrement` de `conception/flux-conception.md` ; AGENTS.md §14 complète +ses deux « À COMPLÉTER » (décisions, preuves). + ## 2026-10-14 (153) — La doc du DNS rattrape les deux sites, avec ses schémas **95 preuves.** `make verifier` passe (site de Chezlepro). Documentation seulement : aucun diff --git a/Makefile b/Makefile index 69f2c25..c713d6d 100644 --- a/Makefile +++ b/Makefile @@ -184,7 +184,7 @@ ansible-runtime: ## Prepare le repertoire temporaire local d'Ansible (prerequis _instance-requise: @if [[ ! -f "$(SETOPS_INSTANCE)/plan/serveurs.yml" ]]; then \ printf '%s\n' "Aucune instance configuree : '$(SETOPS_INSTANCE)/plan' introuvable."; \ - printf '%s\n' "Demarre avec QUICKSTART.md. En bref :"; \ + printf '%s\n' "Demarre avec README.md (demarrage rapide) puis docs/setup.md. En bref :"; \ printf '%s\n' " cp -r exemples/modeles/ ../mon-instance && ln -s ../mon-instance instance"; \ printf '%s\n' " modeles disponibles : $$(ls exemples/modeles 2>/dev/null | grep -v '\.md' | tr '\n' ' ')"; \ exit 2; \ @@ -194,7 +194,7 @@ _instance-requise: aide: ## Affiche l'aide detaillee du moteur (au-dela de cette liste) @printf '%s\n' 'Set-OPS — moteur d ecosystemes numeriques souverains' @printf '%s\n' '' - @printf '%s\n' 'Nouveau ? -> QUICKSTART.md (de zero a ton ecosysteme sur Proxmox)' + @printf '%s\n' 'Nouveau ? -> README.md puis docs/setup.md (de zero a ton ecosysteme sur Proxmox)' @printf '%s\n' 'Flux: editer le plan -> make instancier -> make instancier-appliquer -> make deployer' @printf '%s\n' '' @printf '%s\n' 'VM' @@ -202,7 +202,7 @@ aide: ## Affiche l'aide detaillee du moteur (au-dela de cette liste) @printf '%s\n' ' make creer-vm HOTE=web-frontal-01' @printf '%s\n' ' Cloner seulement, sans passer par le plan:' @printf '%s\n' ' make cloner-vm HOTE=web-frontal-01 VMID=95301 VLAN=15 ADRESSE_IP=10.0.2.31 PASSERELLE=10.0.2.1' - @printf '%s\n' ' Configurer Proxmox et le Vault API (parametres: docs/config-proxmox.md):' + @printf '%s\n' ' Configurer Proxmox et le Vault API (parametres: docs/exploitation/config-proxmox.md):' @printf '%s\n' ' make config' @printf '%s\n' '' @printf '%s\n' 'Hotes' @@ -239,10 +239,10 @@ aide: ## Affiche l'aide detaillee du moteur (au-dela de cette liste) @printf '%s\n' '' @printf '%s\n' 'Flux reseau (pare-feu / audit)' @printf '%s\n' ' Matrice d audit + apercus nftables resolus (NON actives):' - @printf '%s\n' ' make flux # -> docs/registre-flux.md + instance/flux-genere/*.nft' + @printf '%s\n' ' make flux # -> docs/conception/registre-flux.md + instance/flux-genere/*.nft' @printf '%s\n' ' make flux-verifier # valide schema + coherence de matrice' @printf '%s\n' '' - @printf '%s\n' 'Remise au client — EN DEUX TEMPS (docs/remise-au-client.md)' + @printf '%s\n' 'Remise au client — EN DEUX TEMPS (docs/hebergement/remise-au-client.md)' @printf '%s\n' ' Temps 1, l IDENTITE : le client gouverne ses gens des le premier jour.' @printf '%s\n' ' make remise-recenser # ce qui partirait, sans rien ecrire' @printf '%s\n' ' make ca-racine ; make ca-empreinte # sa racine d AC, et le temoin a comparer' @@ -415,10 +415,10 @@ inseminer: ansible-runtime ## Le SITE amorce le runner d'un tenant — TENANT=`, la liste des machines et leurs parametres de clonage # viennent de `face-reseau.yml` que le locataire publie — rendus a l'octet pres comme # `parametres-proxmox` (P93) — et aucune instance n'est montee. Sans `TENANT`, l'ancienne lecture diff --git a/QUICKSTART.md b/QUICKSTART.md deleted file mode 100644 index 6e69de1..0000000 --- a/QUICKSTART.md +++ /dev/null @@ -1,133 +0,0 @@ -# Démarrage rapide — de zéro à ton écosystème souverain - -Tu débarques avec une **grappe Proxmox vierge** et tu veux monter ton écosystème -numérique. Voici le chemin, de bout en bout. Set-OPS est le **moteur** ; tu vas -créer **ton instance** à partir d'un modèle, puis déployer. - -> Concepts en 10 s : tu **décris un plan** (quelles VM, quels services), le moteur -> **génère l'inventaire**, et Ansible **déploie**. Tu n'édites jamais l'inventaire -> à la main. Détails : `docs/plan-et-generation.md`. - -## 0. Prérequis (à toi de fournir) -- une **grappe Proxmox** où tu es admin (API activée) ; -- une machine de pilotage Linux avec **Ansible**, **Python 3**, **make**, `git` - (et `node` pour le garde-fou JS du GUI, optionnel) ; -- un **token API Proxmox** ; -- une **paire de clés SSH** (la publique ira dans les VM via cloud-init) ; -- un **mot de passe Ansible Vault** (pour chiffrer tes secrets). - -## 1. Cloner le moteur -```bash -git clone Set-OPS && cd Set-OPS -``` - -## 2. Choisir un modèle et créer ton instance -Le dépôt public fournit **un modèle générique : `socle`** — quatre VM, le minimum -souverain : PKI (`step-ca`), DNS interne (PowerDNS), edge TLS (nginx) et **magasin -courriel** (Dovecot). C'est un magasin de boîtes, pas un relais : le MTA (`serveur_postfix`) -s'ajoute ensuite, comme les autres modules. Les -modèles **assemblés** par offre (`identite`, `observabilite`, `forge`, `collaboration`, -`presence-web`, `integral`) sont un actif à part, dans le dépôt privé `Set-OPS-modeles` -(cf. [`exemples/modeles/README.md`](exemples/modeles/README.md)). - -```bash -cp -r exemples/modeles/socle ../mon-instance # ton instance, ailleurs -ln -s ../mon-instance instance # le moteur la trouve via ce lien -``` -*(Alternative au symlink : `export SETOPS_INSTANCE=../mon-instance`.)* - -## 3. Renseigner ton instance (« tes couleurs ») - -> Les chemins ci-dessous disent `production/` parce que **c'est le nom que porte le modèle -> que tu viens de copier**. Ce n'est pas un nom imposé : le moteur cherche `principal` -> d'abord, `production` ensuite. Si tu lis ailleurs ``, c'est cette place-là. - -- `instance/inventories/production/group_vars/all/10-intrants.yml` → **`domaine_interne`** (ex. `monorg.internal`) ; -- `instance/plan/nomenclature.yml` → ton **supernet** (ex. `10.20.0.0/16`) ; -- `instance/plan/domaines.yml` → ton **domaine public** ; -- `instance/plan/serveurs.yml` → **placement Proxmox** (nœud, stockage, disque, mémoire, cœurs). - -Tu peux aussi le faire dans le GUI plus tard (`make inventaire-ui`). - -## 4. Configurer Proxmox et tes secrets -```bash -make config # renseigne API host/user/port, nœud, stockage, VMID du template... -``` -Chaque paramètre demandé est expliqué dans [`docs/config-proxmox.md`](docs/config-proxmox.md). -Tous tes secrets (token API + `vault_*`) vont dans **une voûte unique par instance** : -`instance/inventories/production/group_vars/all/vault.yml`, à partir du -gabarit [`exemples/vault.exemple.yml`](exemples/vault.exemple.yml), chiffrée avec -`ansible-vault`. - -**Une voûte, une clé** (depuis le 2026-08-28). Le mot de passe de ta voûte se dépose dans un -fichier dont le nom est **dérivé du dossier de ton instance**, en minuscules : - -```bash -# instance dans ../mon-instance -> clé dans ~/.config/setops-vault-mon-instance -install -m 600 /dev/null ~/.config/setops-vault-mon-instance -$EDITOR ~/.config/setops-vault-mon-instance # ta phrase de passe, une seule ligne -python3 scripts/voutes.py etat # vérifie que le moteur la trouve -``` - -Il n'y a **rien à exporter** : le `Makefile` construit `ANSIBLE_VAULT_IDENTITY_LIST` en -appelant `scripts/voutes.py`. Un seul `ANSIBLE_VAULT_PASSWORD_FILE` ne suffirait plus de -toute façon — créer une VM ouvre **deux** voûtes dans la même exécution : la tienne, et -celle de l'hébergeur qui détient le jeton Proxmox. - -## 5. Construire le golden template Debian 13 (UNE seule fois) -Une grappe vierge n'a aucun template. Crée une VM **Debian 13 vanille**, rends-la -joignable par Ansible, puis : -```bash -make preparer-modele # socle + durcissement + cloud-init + qemu-guest-agent... -make verifier-modele -make nettoyer-modele CONFIRMER=true -``` -Convertis ensuite la VM en **template Proxmox**. Son nom doit être celui que `make config` -a enregistré comme *nom logique du modèle* — **`modeleSetOPS`** par défaut -(`proxmox_clone_source_nom`). Un nom qui ne correspond pas se solde par un clonage qui ne -trouve pas sa source. Détails et procédure : `docs/vm-lifecycle.md` et -`docs/procedure-template-debian13-proxmox.md`. - -## 6. Générer ton inventaire depuis le plan -```bash -make instancier # montre ce que le plan produit (diff) -make instancier-appliquer FORCE=1 # 1re génération : écrit instance/inventories/production/hosts.yml -``` -Tes hôtes sont là, en état `planifie`. `make serveurs` te montre leurs VMID/IP dérivés. - -## 7. Créer les VM (clone du template + cloud-init) -Pour chaque hôte — `creer-vm` lit ses VMID/IP/VLAN/passerelle directement dans -l'inventaire généré (`make serveurs` te les montre) : -```bash -make creer-vm HOTE=infra-dns-01 -``` -*(Les valeurs de nœud/stockage/template viennent de `make config`. La création -suit désormais le plan de bout en bout : un seul argument, `HOTE`.)* - -## 8. Activer puis déployer -Passe l'hôte en `etat: actif` dans `instance/plan/serveurs.yml`, régénère, déploie : -```bash -make instancier-appliquer -make deployer HOTE=infra-dns-01 # configure l'hôte selon ses groupes -# ou, par couche : -make deployer-groupe GROUPE=serveur_powerdns -``` -Les déploiements de groupe ne ciblent **que** les hôtes actifs. - -## 9. Ensuite : tu vis dans le plan -Édite le plan (GUI `make inventaire-ui`, ou les registres `instance/plan/`), -`make instancier-appliquer`, `make deployer`. Tu ne touches jamais `hosts.yml`. - -## Valider à tout moment -```bash -make inventaire-verifier # registres + inventaire + garde-fous -make verifier # + ansible-lint + --syntax-check -``` -> Ces cibles chargent l'inventaire complet : pose d'abord la clé de ta voûte -> (étape 4), sinon Ansible s'arrête sur -> « Attempting to decrypt but no vault secrets found ». - ---- - -Ordre de mise en place des services : `docs/catalogue-services.md`. Modèle, -registres et règle d'or : `docs/plan-et-generation.md` et `AGENTS.md`. diff --git a/README.md b/README.md index da49795..41b53b1 100644 --- a/README.md +++ b/README.md @@ -1,231 +1,60 @@ # Set-OPS — moteur d'écosystèmes numériques souverains -**Set-OPS est un moteur Ansible générique** qui permet à un hébergeur de **construire et exploiter un écosystème numérique souverain** — DNS interne, AC/PKI, identité (LDAP + SSO), relais courriel, bases de données, observabilité, applications — sur sa propre grappe **Proxmox**, à partir d'un **plan déclaratif**. +Set-OPS construit et exploite un **écosystème numérique souverain** sur une grappe +**Proxmox**, à partir d'un **plan déclaratif** : DNS, AC interne, identité (LDAP + SSO), +courriel, bases de données, observabilité, forge, applications web. Logiciel libre +exclusivement ; ni Docker, ni Podman. -Le dépôt est le **moteur** (générique, partageable). Chaque déploiement réel est une **instance** (le plan + l'inventaire d'un hébergeur, dans son propre dépôt). Tu crées la tienne à partir d'un **modèle prêt à déployer** (`exemples/modeles/`). +- **Moteur** (ce dépôt) : rôles Ansible, playbooks, scripts de dérivation, preuves. +- **Écosystème** : un dépôt par locataire (`OPS-`) — son plan, son inventaire + généré, sa voûte. Un dépôt par site d'hébergement (`SITE-`) — son underlay, sa + frontière. +- **Plan → inventaire → déploiement** : on édite le plan, le moteur génère l'inventaire et + l'ordre de déploiement, Ansible applique. L'inventaire ne s'édite jamais à la main. +- **Sans IA** : la doc, `make` et le GUI suffisent à l'exploiter. -## Par où entrer — selon ce que tu viens faire +## Démarrage rapide -On n'arrive pas avec un *sujet*, on arrive avec une **situation**. Il y en a six : - -| Ta situation | Ta porte | -|---|---| -| « Je veux **monter** mon écosystème sur ma grappe Proxmox » | [`QUICKSTART.md`](QUICKSTART.md) | -| « Je **prête mon matériel** à quelqu'un qui déploiera dessus » | [`docs/preparer-un-site-hebergeur.md`](docs/preparer-un-site-hebergeur.md) | -| « Je vais **implanter un tenant existant sur un site neuf** » | [`docs/implanter-un-tenant-sur-un-site.md`](docs/implanter-un-tenant-sur-un-site.md) | -| « Je viens d'**hériter** d'un écosystème déjà déployé, je dois l'exploiter » | [`wiki/Reprendre-l-écosystème.md`](wiki/Reprendre-l-%C3%A9cosyst%C3%A8me.md) | -| « Je dois **modifier** le moteur » | [`docs/carte-set-ops.md`](docs/carte-set-ops.md) | -| « J'**apprends** le métier » | [`wiki/Home.md`](wiki/Home.md) | - -Et si tu veux d'abord savoir *ce que c'est* : continue simplement ci-dessous. - -> Le wiki (`wiki/`) est **publié depuis ce dépôt** vers la forge. Une page modifiée dans -> l'interface de la forge est détruite à la publication suivante : on lit là-bas, on écrit ici. - -**Souveraineté jusqu'au bout : Set-OPS s'exploite entièrement à la main** — la doc, `make` et le GUI suffisent, **sans aucune IA**. L'outil libère de la dépendance aux géants ; il ne la remplace pas par une dépendance à une IA. - ---- - -## Mission (la vision derrière l'outil) - -`Set-OPS` ne se limite plus à l'exploitation : il **définit et construit un écosystème numérique souverain** — une infrastructure interne auto-suffisante, sans dépendance SaaS, décrite en code et pilotée par des registres machine-lisibles qui font office de **source unique de vérité** (`instance/plan/serveurs.yml`, `instance/plan/applications.yml`, `instance/plan/bases-donnees.yml`, `instance/plan/domaines.yml`, `instance/plan/nomenclature.yml`, `docs/dependances-groupes.yml`). - -Piliers de l'écosystème : - -- **identité** — machines (PKI / certificats) et utilisateurs (annuaire + SSO) ; -- **confiance** — autorité de certification interne (ACME) ; -- **nommage et adressage** — DNS interne et nomenclature dérivable ; -- **données** — bases relationnelles et cache, avec registre des connexions ; -- **communication** — service de courriel souverain (boîtes LDAP, SMTP, IMAP, antispam, DKIM), et le relais des notifications système ; -- **observabilité et supervision** — métriques, journaux, tableaux de bord, supervision active ; -- **applicatif** — services internes (forge, etc.) et couche web. - -L'état voulu est **déclaratif et convergent** (appliqué par les groupes Ansible), **souverain** par conception, mais **piloté par l'opérateur** (pas d'auto-remédiation : la boucle n'est pas fermée). Ce n'est pas resté sur le papier : la flotte a été **rasée et remontée depuis zéro** le 2026-08-13, puis deux fois le 2026-09-02, sans échec. Le degré de maturité service par service est dans `docs/catalogue-services.md`. Le template Debian 13 reste la fondation, pas la finalité. - -Cadre et règles d'autorité : voir `AGENTS.md` (section « Mission et identité »). - -## Le plan : on édite, l'inventaire se génère - -`Set-OPS` se pilote par un **plan**, pas par l'édition directe de l'inventaire. -`instance/inventories//hosts.yml` est **généré** depuis le plan — **ne pas l'éditer à la main**. - -``` -éditer le PLAN → make instancier (revoir le diff) → make instancier-appliquer → make deployer -``` - -- **Plan** : `instance/plan/serveurs.yml` (les VM), `instance/plan/applications.yml` (les services et leurs liens), `instance/plan/bases-donnees.yml`, `instance/plan/domaines.yml`, dérivés via `instance/plan/nomenclature.yml`. -- **GUI** (`make inventaire-ui`) : vues **Serveurs** et **Applications** pour éditer, puis « Appliquer le plan » ; la vue **Inventaire** est en lecture seule. -- VMID / IP / VLAN sont **dérivés** de la `fonction` ; les groupes d'une VM sont dérivés des applications qui y tournent. - -Guide complet : **`docs/plan-et-generation.md`**. - -## Portée transverse - -Au-delà des piliers ci-dessus, le dépôt couvre des préoccupations transverses, communes à toutes les VM : - -- templates de VM Proxmox (la fondation) ; -- groupes de conformité et durcissement ; -- maintenance ; -- sauvegardes. - -## Premier chantier - -Template Debian 13 Proxmox : - -```text -playbooks/modeles_vm/debian13_proxmox_preparer.yml -playbooks/modeles_vm/debian13_proxmox_verifier.yml -playbooks/modeles_vm/debian13_proxmox_nettoyer.yml -``` - -## Principe - -Le template contient seulement le socle commun. Les services spécialisés sont installés -ensuite sur les clones, par les playbooks de groupes : edge nginx, PostgreSQL et Redis, -identité (OpenLDAP, Keycloak), courriel (Postfix, Dovecot, rspamd), observabilité -(Prometheus, Loki, Grafana), supervision (Icinga), forge (Forgejo), collaboration -(Nextcloud, Collabora), plateforme web. La liste qui fait foi est -[`docs/catalogue-services.md`](docs/catalogue-services.md). - -> **Ni MariaDB, ni Docker, ni Podman.** Cette section les a listés jusqu'au 2026-09-06, -> par recopie de la liste de ce que le *template* ne doit pas contenir. Le dépôt n'a pas de -> rôle MariaDB, et **plus aucun rôle n'a besoin de Docker** depuis la réécriture native de -> `serveur_collabora` — qui en était la dernière exception. Le conteneur n'est pas un -> détail d'implémentation ici : c'est un choix fondateur (voir `roles/serveur_collabora/README.md`). - -## Exploitation courante - -Un `Makefile` fournit les commandes d'exploitation principales. - -Afficher l'aide : +Prérequis : une grappe Proxmox et un jeton d'API, un poste Linux avec Python 3, Ansible, +`make` et `git`, une paire de clés SSH. ```bash -make -``` +git clone Set-OPS && cd Set-OPS -Valider le dépôt : +# 1. Un écosystème, depuis le modèle public, et la clé de sa voûte +make instance-creer NOM=OPS-MonOrg MODELE=socle +ln -s ../OPS-MonOrg instance +install -m 600 /dev/null ~/.config/setops-vault-ops-monorg # la phrase de passe, une ligne +# renseigner domaine_interne, nomenclature, domaines, placement : docs/setup.md §3 -```bash +# 2. Proxmox et le gabarit Debian 13 (une fois par grappe) +make config +make preparer-modele && make verifier-modele && make nettoyer-modele CONFIRMER=true + +# 3. Inventaire, VM, déploiement +make instancier && make instancier-appliquer FORCE=1 +make creer-vm HOTE=infra-dns-01 +make deployer HOTE=infra-dns-01 + +# 4. Vérifier make verifier ``` -Produire une **preuve de conformité** horodatée (rejoue les preuves du registre des -affirmations → `docs/audit/preuve-.md` ; mode d'emploi : `docs/audit/README.md`) : +Chaque étape, ses fichiers et ses pièges : [`docs/setup.md`](docs/setup.md). -```bash -make prouver -``` +## Documentation -Inspecter les inventaires : - -```bash -make inventaire -make hote-afficher HOTE=web-frontal-01 -``` - -Ouvrir l'interface locale de gestion d'inventaire : - -```bash -make inventaire-ui -``` - -Planifier une VM passe désormais par le **plan**, pas par l'édition de l'inventaire : - -1. déclarer la VM dans `instance/plan/serveurs.yml` (vue **Serveurs** du GUI, ou `make serveurs`) — `fonction`, `etat`, placement ; VMID/IP/VLAN sont dérivés ; -2. déclarer les services qui y tournent dans `instance/plan/applications.yml` (vue **Applications**) ; -3. régénérer l'inventaire : - -```bash -make instancier # génère + diff sémantique (que va-t-il changer ?) -make instancier-appliquer # régénère instance/inventories//hosts.yml -``` - -Les anciennes commandes `make hote-planifier` / `hote-ajouter` / `hote-groupes` éditaient l'inventaire **directement** ; elles sont **supplantées** par le plan (l'inventaire est généré, ne pas l'éditer à la main). - -Chaque groupe opérationnel doit avoir son playbook homonyme dans `playbooks/groupes/`. - -La conformité normale des VM passe par ces playbooks de groupes. Les rôles de socle et de durcissement sont appliqués par `serveur_debian` et `serveur_durci`, pas par des playbooks de couches séparés. - -Les groupes opérationnels avec des hôtes, comme `serveur_keycloak` ou `client_pki`, sont validés contre `playbooks/groupes/` par les commandes d'inventaire. - -Le catalogue des services et intégrations prévus est dans `docs/catalogue-services.md`. - -Les dépendances causales entre groupes sont dans `docs/dependances-groupes.yml`. - -Le runbook du DNS interne initial est dans `docs/dns-interne.md`. - -La nomenclature des noms de VM et des VMID est dans `docs/nomenclature-vm.md`. - -Créer un clone depuis le modèle Debian 13 via l'API Proxmox : - -```bash -make config -make creer-vm HOTE=web-frontal-01 # VMID/IP/VLAN/passerelle lus dans le plan -make deployer HOTE=web-frontal-01 -``` - -L'hôte doit d'abord être déclaré dans `instance/plan/serveurs.yml` et l'inventaire régénéré (`make instancier-appliquer`) : `creer-vm` ne prend que `HOTE`, le reste est dérivé. - -Les valeurs Cloud-Init communes déjà présentes dans le modèle Proxmox sont héritées par les clones. - -Préparer le golden template Debian 13 Proxmox : - -```bash -make preparer-modele -make verifier-modele -``` - -Le nettoyage final du template est protégé : - -```bash -make nettoyer-modele CONFIRMER=true -``` - -Déployer ou remettre en conformité une VM Debian clonée depuis le template : - -```bash -make deployer HOTE=web-frontal-01 -``` - -Déployer ou remettre en conformité un groupe : - -```bash -make deployer-groupe GROUPE=serveur_debian -``` - -Les déploiements de groupes ciblent automatiquement les hôtes actifs seulement. +| Document | Contenu | +|---|---| +| [`docs/README.md`](docs/README.md) | l'index : par situation, par lecteur | +| [`docs/architecture.md`](docs/architecture.md) | composants, flux de données, réseau, sécurité | +| [`docs/setup.md`](docs/setup.md) | installation et configuration | +| [`docs/usage.md`](docs/usage.md) | conventions, variables, toutes les commandes | +| [`wiki/Home.md`](wiki/Home.md) | le métier, pas à pas | +| [`AGENTS.md`](AGENTS.md) | les règles d'autorité du dépôt | ## Licence -Copyright (C) 2026 Daniel Allaire — Chezlepro / Alliance Boréale. - -Set-OPS est un logiciel **libre** : vous pouvez le redistribuer et/ou le modifier selon les -termes de la **GNU Affero General Public License** telle que publiée par la Free Software -Foundation, soit la version 3, soit (à votre choix) toute version ultérieure. - -Set-OPS est distribué dans l'espoir qu'il sera utile, mais **SANS AUCUNE GARANTIE** ; sans même -la garantie implicite de QUALITÉ MARCHANDE ou d'ADÉQUATION À UN USAGE PARTICULIER. Voir la GNU -Affero General Public License pour plus de détails. - -Le texte intégral fait foi dans le fichier [`LICENSE`](LICENSE) et sur -. - -### Pourquoi l'AGPLv3 - -Libre **et** copyleft fort. Chacun peut utiliser, exécuter, étudier et modifier Set-OPS — -**y compris commercialement**. En contrepartie, quiconque l'**offre comme service en réseau** -doit mettre à disposition ses modifications sous la même licence. Cela protège la **souveraineté** -(pas de captation propriétaire) **sans jamais interdire l'usage commercial** — cohérent avec le -principe fondateur : *tout est libre*. - -### Modèle : libre + services - -Set-OPS est **entièrement libre** ; aucune fonctionnalité n'est réservée ni verrouillée. Les -revenus, le cas échéant, proviennent de **services autour** du logiciel, jamais de sa fermeture : - -- support / SLA, **hébergement géré**, formation, intégration, développement sur mesure ; -- **certification** d'écosystèmes (label *Souverain / Résilient / Exemplaire*). - -Les artisans et coopératives peuvent exploiter Set-OPS pour **leur propre infrastructure sans -redevance** : l'usage interne ne déclenche aucune obligation de partage. Le copyleft AGPL ne vise -que la captation propriétaire (offrir Set-OPS en service fermé sans en partager les évolutions). +Copyright (C) 2026 Daniel Allaire — Chezlepro / Alliance Boréale. Logiciel libre sous +**GNU Affero General Public License v3** ou ultérieure : voir [`LICENSE`](LICENSE). Pourquoi +l'AGPLv3, et le modèle libre + services : [`docs/projet/positionnement.md`](docs/projet/positionnement.md) §6. diff --git a/SOLUTION.md b/SOLUTION.md deleted file mode 100644 index fa9ee5d..0000000 --- a/SOLUTION.md +++ /dev/null @@ -1,78 +0,0 @@ -# La solution Set-OPS - -> **Document historique de décision.** Le parcours opérationnel à jour vit dans -> [`README.md`](README.md) et [`QUICKSTART.md`](QUICKSTART.md) ; l'autorité est -> [`AGENTS.md`](AGENTS.md). Les commandes brutes ci-dessous sont **supplantées** par les -> cibles `make` (`preparer-modele` / `verifier-modele` / `nettoyer-modele`). Conservé pour -> tracer la décision fondatrice. - -## Décision - -`Set-OPS` est le moteur Ansible global d’exploitation d’écosystèmes numériques souverains. - -Le template Debian 13 Proxmox est seulement un chantier dans ce dépôt. - -## Ce qu'on fait maintenant - -On garde une seule structure simple : - -```text -inventories/ -playbooks/ -roles/ -docs/ -``` - -Les rôles sont nommés clairement, sans sous-arborescence complexe. - -> Réalité actuelle du dépôt : au-delà de ces quatre dossiers, le moteur comporte aussi -> `scripts/` (plan + GUI), `filter_plugins/`, `exemples/`, `wiki/` et l'instance montée -> (`instance/`). Vue d'ensemble : [`docs/carte-set-ops.md`](docs/carte-set-ops.md). - -## Commande principale pour construire le template - -Le template se construit avec un **accès SSH par clé dès le départ** (clé injectée par -cloud-init) — pas par mot de passe. La cible opérateur est : - -```bash -make preparer-modele -``` - -Elle exécute `playbooks/modeles_vm/debian13_proxmox_preparer.yml` sur l'inventaire modèle, -après avoir vérifié l'accès SSH par clé et les privilèges sudo du compte `ansible`. Voir -[`AGENTS.md`](AGENTS.md) § SSH pour l'état cible (`PasswordAuthentication no`, -`AuthenticationMethods publickey`). - -## Vérification - -```bash -make verifier-modele -``` - -## Nettoyage final avant conversion - -```bash -make nettoyer-modele CONFIRMER=true -``` - -*(Ces deux blocs appelaient `ansible-playbook -i instance/inventories/lab/hosts.yml …` -jusqu'au 2026-09-06. Cet inventaire n'existe pas : le nom est résolu par le `Makefile`, -c'est précisément pourquoi les cibles `make` supplantent les commandes brutes.)* - -Ensuite : - -```bash -sudo shutdown -h now -``` - -Puis côté Proxmox : - -```bash -qm template VMID -``` - -## Important - -Le pare-feu `nftables` est installé et préparé, mais il n'est pas activé par défaut dans le template. - -C'est volontaire pour éviter de couper SSH pendant la construction. diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..94f1632 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,121 @@ +# Documentation de Set-OPS + +> **Pour qui :** tout lecteur qui cherche une page. On entre par sa **situation** ou par son +> **rôle** ; chaque document dit en tête à qui il s'adresse. + +## Portes d'entrée + +| Document | Contenu | +|---|---| +| [`architecture.md`](architecture.md) | composants, moteur / site / locataire, plan → déploiement, réseau, sécurité (schémas) | +| [`setup.md`](setup.md) | prérequis, instance, voûtes, Proxmox, gabarit, premier déploiement | +| [`usage.md`](usage.md) | conventions, variables, toutes les commandes `make` par famille | + +## Par situation + +| Ta situation | Ta porte | +|---|---| +| « Je veux **monter** mon écosystème sur ma grappe Proxmox » | [`setup.md`](setup.md) | +| « Je **prête mon matériel** à quelqu'un qui déploiera dessus » | [`hebergement/preparer-un-site-hebergeur.md`](hebergement/preparer-un-site-hebergeur.md) | +| « Je vais **implanter un locataire existant sur un site neuf** » | [`hebergement/implanter-un-tenant-sur-un-site.md`](hebergement/implanter-un-tenant-sur-un-site.md) | +| « Je viens d'**hériter** d'un écosystème déployé, je dois l'exploiter » | [`../wiki/Reprendre-l-écosystème.md`](../wiki/Reprendre-l-%C3%A9cosyst%C3%A8me.md) | +| « Je fais face à une **situation d'exploitation** » | [`exploitation/runbooks-exploitation.md`](exploitation/runbooks-exploitation.md) | +| « Je dois **modifier** le moteur » | [`conception/mecanismes.md`](conception/mecanismes.md), puis `AGENTS.md` | +| « J'**apprends** le métier » | [`../wiki/Home.md`](../wiki/Home.md) | +| « J'**évalue** Set-OPS » | [`projet/pouvoirs-set-ops.md`](projet/pouvoirs-set-ops.md), [`projet/ecosysteme-chezlepro.md`](projet/ecosysteme-chezlepro.md) | + +## Par lecteur + +### `conception/` — le mainteneur : comment le moteur est fait + +| Document | Sujet | +|---|---| +| `mecanismes.md` | les mécanismes transverses et où ils vivent ; maturité, dette, discipline | +| `plan-et-generation.md` | le plan, ses registres, la génération de l'inventaire | +| `meta-classe.md` | pourquoi on écrit *un* plan et pas *un* inventaire | +| `conception-contextes.md` | site et locataire : deux classes, un contrat | +| `multi-instances.md` | le moteur et ses écosystèmes, le seed `index` | +| `filiation-emancipation.md` | ce que le site prête au locataire, et comment il s'en détache | +| `depots-prives-conception.md` | chaque runner ne lit que ses dépôts | +| `nomenclature-vm.md` | noms de VM et VMID | +| `dimensionnement-ressources.md` | RAM, CPU, disque dérivés des empreintes | +| `intrants-communs.md` | valeurs partagées par tout l'écosystème | +| `intrants-base-gui-conception.md` | le panneau « Intrants de base » du GUI | +| `bindings-conception.md` | relations service → service et service → base | +| `integrations-vm.md` | les intégrations `client_*` posées sur toutes les VM | +| `flux-conception.md` | déclarer un flux réseau dans `meta/flux.yml` | +| `registre-flux.md` | la matrice d'audit des flux (**générée** par `make flux`) | +| `schemas-flux.md` | la liste des pages publiées et ce qu'elles montrent | +| `sdn-evpn.md` | le réseau overlay : zones EVPN, VNets | +| `frontiere-opnsense.md` | la bordure nord/sud | +| `frontiere-physique-virtuel.md` | physique et virtuel : qui possède quoi, et où ça vit | +| `dns-interne.md` | DNS interne et public, deux sites (schémas) | +| `identite-sso.md` | les deux couches de l'identité | +| `authentification.md` | la doctrine d'authentification, rôle par rôle | +| `courriel-conception.md` | le service de courriel | +| `supervision-conception.md` | les verdicts, vers Icinga | +| `metriques-conception.md` | les séries, vers Prometheus et Grafana | + +### `exploitation/` — l'exploitant : faire tourner un écosystème + +| Document | Sujet | +|---|---| +| `runbooks-exploitation.md` | que faire, situation par situation | +| `devis-services.md` | ce qui tourne correspond-il à ce qui est déclaré ? | +| `vm-lifecycle.md` | ce qu'une VM traverse, de la création à la destruction | +| `procedure-template-debian13-proxmox.md` | fabriquer le gabarit d'or | +| `gabarit-debian13-justification.md` | ce que le gabarit contient, et pourquoi | +| `config-proxmox.md` | raccorder le moteur à la grappe | +| `acces-administration.md` | le tunnel nominatif des administrateurs : par où, avec quelle clé | +| `autorisation.md` | habilitations ; §6 : le runbook de reprise | +| `sortir-les-cles-du-poste.md` | les clés et les voûtes hors du poste | +| `theme-forgejo-hors-flotte.md` | le thème Alliance Boréale sur une forge hors flotte | + +### `hebergement/` — l'hébergeur et le locataire + +| Document | Sujet | +|---|---| +| `preparer-un-site-hebergeur.md` | mettre son matériel à disposition | +| `implanter-un-tenant-sur-un-site.md` | le jour de l'intervention sur un site neuf | +| `hebergeur-exploitation.md` | les services que l'hébergeur se doit à lui-même | +| `migration-tenant.md` | déplacer un locataire d'un hébergeur à un autre | +| `remise-au-client.md` | remettre un écosystème à qui en est responsable | +| `responsabilites-locataire-hebergeur.md` | qui répond de quoi | + +### `projet/` — décisions, maturité, positionnement + +| Document | Sujet | +|---|---| +| `decisions-architecture.md` | les décisions en vigueur et renversées, et ce qui les garde | +| `catalogue-services.md` | ce que le moteur sait déployer, et sa maturité | +| `positionnement.md` | ce qui reste maison, ce qui s'adopte, et à quels seuils ; la licence | +| `pouvoirs-set-ops.md` | ce que le moteur sait faire, et ce qu'il ne sait pas | +| `ecosysteme-chezlepro.md` | un écosystème réel, pour le lecteur externe | +| `MISE-A-JOUR-CODEX-CLAUDE.md` | pour l'agent IA qui reprend le dépôt | + +## Registres et preuves + +| Fichier | Rôle | +|---|---| +| `couches-deploiement.yml` | les couches de déploiement — lu par `scripts/orchestrer.py` | +| `dependances-groupes.yml` | le graphe des dépendances entre groupes — lu par l'orchestrateur et les preuves | +| `runbooks-construction.yml` | les runbooks de construction — lu par `scripts/runbooks.py` | +| `audit/affirmations.md` | le registre des affirmations que `make prouver` rejoue | +| `audit/preuve-.md` | les rapports de preuve datés | + +Le wiki (`wiki/`) est publié depuis ce dépôt vers la forge (`make wiki-publier`) : on y lit, +on écrit ici. L'autorité est `AGENTS.md` ; l'histoire, `CHANGELOG.md`. + +## Le dépôt en chiffres + +> Ces valeurs sont **mesurées** : **P48** les recompte et refuse tout écart. + +| Ce qu'on compte | Combien | Comment on le mesure | +|---|---|---| +| rôles | 70 | `roles/*/` | +| README de rôles | 70 | `roles/*/README.md` — l'écart avec la ligne au-dessus est la dette | +| documents | 51 | `docs/**/*.md`, hors `audit/` | +| pièces d'audit | 53 | `docs/audit/*` | +| unités de wiki | 27 | `wiki/*.md` | +| décisions en vigueur | 85 | lignes `\| **D-nn** \|` de `decisions-architecture.md` | +| décisions renversées | 3 | lignes `\| **D-nn** —` du même document | diff --git a/docs/architecture-set-ops.md b/docs/architecture-set-ops.md deleted file mode 100644 index df95529..0000000 --- a/docs/architecture-set-ops.md +++ /dev/null @@ -1,71 +0,0 @@ -# Architecture Set-OPS - -> **Pour qui :** le **mainteneur** — le survol du modèle. À lire avant `plan-et-generation.md`. - -Set-OPS définit et construit l'écosystème numérique souverain. Il se -pilote par un **plan** : l'inventaire Ansible (`instance/inventories//hosts.yml`) -est **généré** depuis le plan, pas édité à la main. - -- **Par où commencer + catalogue des mécanismes transverses : `docs/carte-set-ops.md`.** -- Modèle, registres, commandes et flux de travail : **`docs/plan-et-generation.md`**. -- Règles d'autorité : **`AGENTS.md`** (sections « Mission et identité » et « Le plan et la génération de l'inventaire »). - -## Entités du plan - -```text -serveur (VM) instance/plan/serveurs.yml fonction, état, placement, intégrations -application instance/plan/applications.yml groupe (rôle), hôte, port, requiert, expose -base instance/plan/bases-donnees.yml serveur de BD, base, propriétaire, secret (Vault), portée -domaine (DNS) instance/plan/domaines.yml zone publique, autorité, edge -nomenclature instance/plan/nomenclature.yml fonctions -> VMID / VLAN / IP (dérivés) -``` - -L'**application** est l'entité pivot ; le **groupe** Ansible n'est qu'une capacité -(le rôle appliqué). VMID / IP / VLAN et les appartenances de groupes sont **dérivés**. - -## Rôles Ansible - -Les rôles actifs sont conservés directement sous `roles/`. - -Les sous-arborescences catégorielles de rôles ne doivent pas dupliquer un rôle actif. Un nouveau rôle doit être ajouté seulement lorsqu'un besoin opérationnel réel existe. - -Les valeurs communes aux rôles doivent rester dans les defaults des rôles quand elles sont valables pour tous les environnements. Les inventaires ne doivent contenir que les politiques propres à leur contexte. - -## Groupes et playbooks - -Les groupes opérationnels de l'inventaire doivent correspondre à un playbook homonyme : - -```text -instance/inventories//hosts.yml - serveur_debian - -playbooks/groupes/serveur_debian.yml -``` - -Cette relation rend l'exploitation lisible : - -```text -appartenance à un groupe -→ playbook correspondant -→ état voulu appliqué par Ansible -``` - -Les groupes structurels ou vides peuvent exister, mais un groupe assigné à une VM de production doit avoir un playbook s'il exprime une intention de configuration. - -## Cycle de vie VM - -Le cycle de vie des VM est documenté dans : - -```text -docs/vm-lifecycle.md -``` - -## Intégrations transversales - -Elles ne sont plus « futures » : `client_pki`, `client_backup`, `client_metrique`, -`client_journal`, `client_smtp`, `client_resolveur` et `client_artefacts` sont déployés sur -la flotte. Elles sont documentées dans : - -```text -docs/integrations-vm.md -``` diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000..c38334f --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,180 @@ +# Architecture + +> **Pour qui :** quiconque doit comprendre comment Set-OPS est construit — avant de +> l'installer, de l'exploiter ou de le modifier. Le détail de chaque mécanisme est dans +> `docs/conception/` ; l'index complet dans [`README.md`](README.md). + +Set-OPS est un **moteur** Ansible et Python. Il lit un **plan** déclaratif, en dérive un +inventaire et des politiques, et les applique à des VM Debian 13 clonées sur une grappe +Proxmox. Le moteur est générique ; chaque écosystème réel vit dans **son propre dépôt**. + +## Composants + +```mermaid +flowchart LR + subgraph POSTE["Poste de l'exploitant (ou runner)"] + MOT["Set-OPS
moteur : roles/, playbooks/, scripts/"] + INST["instance/ → ../OPS-X
le locataire actif"] + UND["underlay.yml → ../SITE-Y/underlay.yml
le site actif"] + CLE["~/.config/setops-vault-*
une clé par voûte"] + end + subgraph SITE["Site d'hébergement"] + PVE["Grappe Proxmox
SDN EVPN, pare-feu est-ouest"] + OPN["Frontière OPNsense
nord/sud"] + RUN["site-ops-01
runner du site"] + FORGE["Forge du site
le génome"] + VMS["VM des locataires
et du site"] + end + MOT -- "lit" --> INST & UND + MOT -- "API Proxmox : clone, SDN, pare-feu" --> PVE + MOT -- "API OPNsense : règles, routes" --> OPN + MOT -- "SSH + Ansible" --> VMS + POSTE -- "make publier / genome-pousser" --> FORGE + RUN -- "tire" --> FORGE + RUN -- "SSH + Ansible" --> VMS + PVE --- VMS +``` + +| Composant | Ce que c'est | Où | +|---|---|---| +| Moteur | rôles, playbooks, scripts de dérivation, preuves | ce dépôt | +| Locataire (tenant) | un écosystème : son plan, son inventaire généré, sa voûte | dépôt `OPS-`, monté par `instance/` | +| Site | l'hébergeur : matériel, underlay, frontière, services prêtés aux locataires | dépôt `SITE-`, désigné par `underlay.yml` | +| Voûtes | secrets chiffrés `ansible-vault`, une par dépôt, une clé par voûte | `group_vars/all/vault.yml` ; clés hors dépôt | +| Runner du site | machine du site qui déploie à la place du poste | `site-ops-01`, compte `setops`, `/opt/setops` | +| Forge du site | Forgejo qui porte le génome (moteur + plans) que les runners tirent | VM du site | + +## Moteur, site, locataire + +```mermaid +flowchart TB + M["Set-OPS (moteur)"] + S["SITE-Y
underlay.yml · plan/ · opnsense.yml"] + T1["OPS-A
plan/ · inventories/"] + T2["OPS-B
plan/ · inventories/"] + M -. "monte un site" .-> S + M -. "monte un locataire" .-> T1 & T2 + S -- "contrat du site → fiche-site.yml" --> T1 & T2 + T1 & T2 -- "face réseau publiée" --> S +``` + +- **Deux classes d'écosystème, un tronc commun** : `scripts/contexte.py` est le seul endroit + qui lit les indices (`instance/`, `underlay.yml`, `SETOPS_*`, dossiers frères) et rend un + `Site` ou un `Locataire`. Conception : `docs/conception/conception-contextes.md`. +- **Le site lit la face réseau des locataires, le locataire lit la fiche du site.** Le + contrat (`make site-intrants`) dérive ce que le site expose : résolveur, cache de paquets, + forge, adresses publiques, serveurs DNS publics. `make fiches-site-deposer` le dépose chez + chaque locataire (`fiche-site.yml`) ; `make site-intrants-verifier` juge l'écart. +- **Multi-instance par convention** : un dépôt par écosystème, découverts comme dossiers + frères. Tout l'adressage dérive d'un seed `index` par écosystème ; P21 refuse une + collision. Détail : `docs/conception/multi-instances.md`. +- **Le site prête trois services** à un locataire jeune — paquets (`serveur_cache_site`), + génome (`serveur_forge_site`), noms (`serveur_resolveur_site`) — jusqu'à ce qu'il ait les + siens. Filiation et émancipation : `docs/conception/filiation-emancipation.md`. + +## Du plan au déploiement + +```mermaid +flowchart LR + PLAN["plan/
serveurs · applications · bases-donnees
domaines · nomenclature"] --> INS["make instancier
scripts/instancier.py
inventory_rules.py"] + INS -- "diff sémantique" --> APP["make instancier-appliquer"] + APP --> HOSTS["inventories/INVENTAIRE/hosts.yml
GÉNÉRÉ"] + COUCHES["docs/couches-deploiement.yml
docs/dependances-groupes.yml"] --> ORCH["make site
scripts/orchestrer.py"] + ORCH --> SITEYML["playbooks/site.yml
GÉNÉRÉ"] + HOSTS & SITEYML --> ANS["make deployer · deployer-tout
ansible-playbook"] + VAULT["vault.yml
ANSIBLE_VAULT_IDENTITY_LIST"] --> ANS + ANS --> VM["VM : groupes → playbooks/groupes/GROUPE.yml → rôles"] +``` + +1. **On édite le plan, jamais l'inventaire.** VMID, IP, VLAN, FQDN et appartenances aux + groupes sont dérivés de la `fonction` d'une VM et des applications qui y tournent. +2. **L'inventaire est généré** et comparé à l'existant avant d'être écrit. +3. **L'ordre de déploiement est généré** depuis les couches et le graphe des dépendances + entre groupes. +4. **Un groupe = un playbook homonyme** (`playbooks/groupes/.yml`) qui applique ses + rôles. Le socle (`serveur_debian`) et le durcissement (`serveur_durci`) passent en premier. + +Les registres du plan : + +| Registre | Entité | Champs clés | +|---|---|---| +| `plan/serveurs.yml` | VM | `fonction`, `etat` (`planifie` → `actif`), placement | +| `plan/applications.yml` | service (entité pivot) | `groupe` (rôle), `hote`, `port`, `liens`, `expose` | +| `plan/bases-donnees.yml` | base | serveur, propriétaire, secret en voûte, `consommateur`, `portee` | +| `plan/domaines.yml` | zone DNS | `autorite`, `edge`, `dnssec`, `enregistrements`, `resolution_interne` | +| `plan/nomenclature.yml` | dérivation | `index` (seed), fonctions → VMID / VLAN / IP | + +Détail : `docs/conception/plan-et-generation.md`, `docs/conception/meta-classe.md`. + +## Ce qu'un rôle déclare, ce que le moteur dérive + +Chaque rôle porte ses déclarations dans `roles//meta/`. Le moteur les agrège ; aucune +liste n'est tenue à la main ailleurs. + +| Déclaration | Ce que le moteur en dérive | Doc | +|---|---|---| +| `meta/flux.yml` | nftables de l'hôte, pare-feu Proxmox, frontière OPNsense, registre des flux | `conception/flux-conception.md` | +| `meta/liens.yml` | variables de connexion service → service | `conception/bindings-conception.md` | +| `meta/empreinte.yml` | RAM, CPU, disque de la VM | `conception/dimensionnement-ressources.md` | +| `meta/supervision.yml`, `meta/metriques.yml` | services Icinga, cibles Prometheus, tableaux | `conception/supervision-conception.md` | +| `meta/authentification.yml` | portée et mécanisme d'authentification du rôle, gardés par P29 | `conception/authentification.md` | +| `meta/acces.yml` | rôles d'accès projetés dans Keycloak | `exploitation/autorisation.md` | +| `meta/integration.yml` | intégrations universelles (`client_*`) posées sur chaque VM | `conception/integrations-vm.md` | + +## Réseau + +```mermaid +flowchart TB + NET(("Internet")) --> OPN["Frontière OPNsense
nord/sud · seul équipement L3 de bordure"] + OPN --> SDN["SDN EVPN sur les hyperviseurs
une zone (VRF) par écosystème · passerelles anycast"] + SDN --> PFW["Pare-feu Proxmox
est-ouest, par VM"] + PFW --> NFT["nftables de l'hôte"] + NFT --> SVC["service"] + FLUX["roles/*/meta/flux.yml"] -. "dérive" .-> OPN & PFW & NFT +``` + +- **Underlay** (`underlay.yml` du site) : la fabric physique — gestion, iSCSI, Ceph, ponts. + `make underlay-plan` le confronte au réel. +- **Overlay** : un écosystème = une zone EVPN et ses VNets, nommés depuis le seed + (`make sdn-plan`). Détail : `docs/conception/sdn-evpn.md`. +- **Quatre couches de filtrage, une seule source** : les flux déclarés par les rôles. + `pair: externe` devient la politique de bordure. Détail : + `docs/conception/frontiere-opnsense.md`, `docs/conception/registre-flux.md`. +- **Deux sites reliés** par un tunnel WireGuard (`opnsense_liens_sites`) : réplication du DNS + public, administration du site pair. DNS : `docs/conception/dns-interne.md`. + +## Déclaré, dérivé, mesuré + +```mermaid +flowchart LR + D["Déclaré
plan · meta/ · cartes"] --> V["Dérivé
devis : scripts/devis_*.py"] + V --> P["make SUJET-plan
écart, aucune écriture"] + P --> A["make SUJET-appliquer CONFIRMER=true
réconcilie"] + R["Réel
API Proxmox · OPNsense · VM"] --> P + D --> PR["make prouver / verifier
preuves statiques : lisent le dépôt"] +``` + +- **Les preuves** (`make verifier`, `make prouver`) lisent le dépôt seulement : cohérence du + plan, des rôles, de la doc. Registre : `docs/audit/affirmations.md`. +- **Les devis** lisent le système en marche et le comparent à ce que le plan dérive. Ils + n'écrivent rien ; la cible `-appliquer` correspondante réconcilie, sous `CONFIRMER=true`. + Détail : `docs/exploitation/devis-services.md`. + +## Sécurité + +| Sujet | Mécanisme | Doc | +|---|---|---| +| Secrets | une voûte par dépôt, une clé par voûte, `scripts/voutes.py` construit `ANSIBLE_VAULT_IDENTITY_LIST` | `exploitation/sortir-les-cles-du-poste.md` | +| Confiance machine | AC interne step-ca (ACME), certificats par `client_pki` | `conception/integrations-vm.md` | +| Identité | OpenLDAP source unique, Keycloak fédéré, `oauth2-proxy` devant les services sans OIDC | `conception/identite-sso.md`, `conception/authentification.md` | +| Habilitations | amorcées par `amorcage_acces`, jamais réconciliées | `exploitation/autorisation.md` | +| Administration | tunnel WireGuard nominatif `admins`, rebond par la frontière | `exploitation/acces-administration.md` | +| Transit | chaque flux déclare son `chiffrement` ; le registre en fait la synthèse | `conception/flux-conception.md`, `conception/registre-flux.md` | + +## Invariants + +- Logiciel libre exclusivement ; ni Docker, ni Podman. +- L'inventaire et `playbooks/site.yml` sont générés : ne pas les éditer. +- Aucun nom d'inventaire codé en dur : `` est résolu par `ORDRE_INVENTAIRE`. +- Le moteur s'exploite sans IA : la doc, `make` et le GUI suffisent. +- L'autorité est `AGENTS.md`. diff --git a/docs/audit/affirmations.md b/docs/audit/affirmations.md index 234e511..f8c55d7 100644 --- a/docs/audit/affirmations.md +++ b/docs/audit/affirmations.md @@ -41,9 +41,9 @@ Légende du statut : ✅ prouvée · 🟡 partielle · ❌ fausse · ⚪ invéri | AFF-007 | « Inspecter … `make hote-afficher HOTE=web-frontal-01` » (README:98) | procédurale | `make hote-afficher HOTE=web-frontal-01` | 🟡 | La cible existe et fonctionne, mais l'hôte d'exemple `web-frontal-01` n'existe pas dans l'instance courante → l'exemple littéral échoue (exemple générique, pas garanti par instance). | | AFF-008 | « Chaque groupe opérationnel doit avoir son playbook homonyme dans `playbooks/groupes/` » (README:120 ; AGENTS:316) | structurelle | `python3 scripts/inventory_host.py --inventaire instance/inventories/principal/hosts.yml verifier-playbooks --dossier-playbooks playbooks/groupes` | ✅ | rc=0. Les 30 groupes opérationnels ont leur playbook. Seuls `hotes_actifs`, `hotes_planifies`, `modeles_vm` (groupes méta/état) n'en ont pas — exclus par conception. | | AFF-009 | « Les dépendances causales entre groupes sont dans `docs/dependances-groupes.yml` » (README:128 ; AGENTS:413) | structurelle | `python3 scripts/inventory_host.py … verifier-dependances …` | ✅ | rc=0. Aucune entrée ne référence un rôle/groupe inexistant. | -| AFF-010 | « Le runbook du DNS interne initial est dans `docs/dns-interne.md` » (README:130) | structurelle | `test -f docs/dns-interne.md` | ✅ | Fichier présent. | -| AFF-011 | « La nomenclature … est dans `docs/nomenclature-vm.md` » (README:132) | structurelle | `test -f docs/nomenclature-vm.md` | ✅ | Fichier présent. | -| AFF-012 | « Le catalogue des services … `docs/catalogue-services.md` » (README:126) | structurelle | `test -f docs/catalogue-services.md` | ✅ | Fichier présent. | +| AFF-010 | « Le runbook du DNS interne initial est dans `docs/conception/dns-interne.md` » (README:130) | structurelle | `test -f docs/conception/dns-interne.md` | ✅ | Fichier présent. | +| AFF-011 | « La nomenclature … est dans `docs/conception/nomenclature-vm.md` » (README:132) | structurelle | `test -f docs/conception/nomenclature-vm.md` | ✅ | Fichier présent. | +| AFF-012 | « Le catalogue des services … `docs/projet/catalogue-services.md` » (README:126) | structurelle | `test -f docs/projet/catalogue-services.md` | ✅ | Fichier présent. | | AFF-013 | « `make creer-vm HOTE=… ` VMID/IP/VLAN/passerelle lus dans le plan » (README:138) | fonctionnelle | `python3 scripts/inventory_host.py … parametres-proxmox --hote ` | 🟡 | La dérivation existe (sous-commande `parametres-proxmox`), mais l'exécution réelle touche Proxmox → non testable localement (hors production). Mécanique de dérivation seule vérifiable. | | AFF-014 | « Les déploiements de groupes ciblent automatiquement les hôtes actifs seulement » (README:171) | fonctionnelle | lecture `Makefile:261` : `--limit '$(GROUPE):&$(GROUPE_HOTES_ACTIFS)'` | ✅ | Intersection `groupe ∩ hotes_actifs` codée dans la cible `appliquer`. | | AFF-015 | « Set-OPS est un logiciel libre … AGPLv3 … texte intégral dans `LICENSE` » (README:177-186) | structurelle | `test -f LICENSE` | ✅ | `LICENSE` présent. | @@ -52,6 +52,9 @@ Légende du statut : ✅ prouvée · 🟡 partielle · ❌ fausse · ⚪ invéri ## 2. QUICKSTART.md +> **Retiré le 2026-10-15**, fondu dans `README.md` (démarrage rapide) et `docs/setup.md`. +> Les affirmations ci-dessous gardent leurs références d'origine : c'est la trace de l'audit. + | ID | Affirmation (source) | Type | Commande de preuve | Statut | Écart constaté | |---|---|---|---|---|---| | AFF-020 | « Les modèles sont dans `exemples/modeles/` … Choisis : `socle`, `presence-web`, `forge`, `identite`, `observabilite`, `integral` » (QUICKSTART:25-26) | structurelle | `ls exemples/modeles/` | ✅ | Le dossier public ne contient que `socle` (+ `README.md`). Les 5 autres modèles sont dans un dépôt **privé** `Set-OPS-modeles` (correctement expliqué dans `exemples/modeles/README.md`, mais **pas** dans QUICKSTART). — **rejugé le 2026-08-08 : RÉSOLU.** QUICKSTART §2 annonce désormais **un seul modèle générique `socle`** et renvoie les modèles assemblés au dépôt privé — la promesse s'est alignée sur la décision, pas l'inverse | @@ -94,6 +97,9 @@ Légende du statut : ✅ prouvée · 🟡 partielle · ❌ fausse · ⚪ invéri ## 5. SOLUTION.md +> **Retiré le 2026-10-15** : document historique, déjà supplanté (AFF-060/061). La décision +> fondatrice reste dans l'histoire du dépôt ; le parcours du gabarit est dans `docs/setup.md` §6. + | ID | Affirmation (source) | Type | Commande de preuve | Statut | Écart constaté | |---|---|---|---|---|---| | AFF-060 | « On garde une seule structure : `inventories/ playbooks/ roles/ docs/` » (SOLUTION:11-18) | structurelle | `ls` racine | 🟡 | Réel : aussi `scripts/`, `filter_plugins/`, `exemples/`, `wiki/`, `instance/`. Description obsolète (antérieure au plan/GUI). | @@ -107,7 +113,7 @@ Légende du statut : ✅ prouvée · 🟡 partielle · ❌ fausse · ⚪ invéri | ID | Affirmation (source) | Type | Commande de preuve | Statut | Écart constaté | |---|---|---|---|---|---| | AFF-070 | « `make site-verifier` valide la cohérence couches/graphe » (Makefile aide:133) | fonctionnelle | `python3 scripts/orchestrer.py verifier` | ✅ | « Orchestration cohérente : 30 groupes classés, aucun cycle, aucune arête en arrière. » | -| AFF-071 | « `make flux` → `docs/registre-flux.md` + `instance/flux-genere/*.nft` » (Makefile aide:146) | fonctionnelle | `python3 scripts/resoudre_flux.py verifier` ; en-tête de `docs/registre-flux.md` | ✅ | « Flux cohérents : 29 rôles, 63 flux ». Le registre porte l'en-tête « GÉNÉRÉ par `scripts/resoudre_flux.py` ». | +| AFF-071 | « `make flux` → `docs/conception/registre-flux.md` + `instance/flux-genere/*.nft` » (Makefile aide:146) | fonctionnelle | `python3 scripts/resoudre_flux.py verifier` ; en-tête de `docs/conception/registre-flux.md` | ✅ | « Flux cohérents : 29 rôles, 63 flux ». Le registre porte l'en-tête « GÉNÉRÉ par `scripts/resoudre_flux.py` ». | | AFF-072 | « `make deployer-tout` — déploiement orchestré de la flotte ; garde `CONFIRMER` » (Makefile aide:138) | fonctionnelle | lecture Makefile:352-357 | 🟡 | Garde `CONFIRMER=true` vérifiée (refuse sinon, rc=2). Déploiement réel hors production → non exécuté. | | AFF-073 | « `make wiki-publier` … refuse sans `WIKI_REMOTE` » (Makefile aide:151) | fonctionnelle | lecture Makefile:320-326 | ✅ | Garde présente : refus + message d'usage si `WIKI_REMOTE` vide. | | AFF-074 | « `make devis-reseau` — dérivé des nomenclatures » (Makefile:309) | fonctionnelle | `python3 scripts/devis_reseau.py` | 🟡 | Dérive des instances fédérées `../*/plan/nomenclature.yml` (schéma `ip-miroir`) ; sortie dépend du voisinage de dépôts → vérifiable seulement dans un contexte fédéré. | @@ -119,12 +125,12 @@ Légende du statut : ✅ prouvée · 🟡 partielle · ❌ fausse · ⚪ invéri | ID | Affirmation (source) | Type | Commande de preuve | Statut | Écart constaté | |---|---|---|---|---|---| -| AFF-080 | « `make help` — liste des cibles » (docs/config-proxmox.md:114) | procédurale | `grep -E '^help:' Makefile` | ✅ | Aucune cible `help`. La cible réelle est `aide` (défaut). Commande citée inexistante. — **rejugé le 2026-08-08 : RÉSOLU.** plus aucune occurrence de `make help` dans le dépôt ; la cible s'appelle `aide`, et les **85** cibles portent leur texte d'aide (P31) | -| AFF-081 | « `make syntax-template` » (docs/modeles_vm/debian13-proxmox.md:77) | procédurale | `grep syntax-template Makefile` | ✅ | Aucune cible `syntax-template`. Réel : `syntaxe-modele`. Nom périmé. — **rejugé le 2026-08-08 : RÉSOLU.** `syntax-template` n'apparaît plus nulle part hors de ce registre ; la cible est `syntaxe-modele` | -| AFF-082 | « `make syntax-template` » (docs/MISE-A-JOUR-CODEX-CLAUDE.md:146) | procédurale | idem | ✅ | Même nom périmé, second emplacement. — **rejugé le 2026-08-08 : RÉSOLU.** idem AFF-081 | +| AFF-080 | « `make help` — liste des cibles » (docs/exploitation/config-proxmox.md:114) | procédurale | `grep -E '^help:' Makefile` | ✅ | Aucune cible `help`. La cible réelle est `aide` (défaut). Commande citée inexistante. — **rejugé le 2026-08-08 : RÉSOLU.** plus aucune occurrence de `make help` dans le dépôt ; la cible s'appelle `aide`, et les **85** cibles portent leur texte d'aide (P31) | +| AFF-081 | « `make syntax-template` » (docs/exploitation/gabarit-debian13-justification.md:77) | procédurale | `grep syntax-template Makefile` | ✅ | Aucune cible `syntax-template`. Réel : `syntaxe-modele`. Nom périmé. — **rejugé le 2026-08-08 : RÉSOLU.** `syntax-template` n'apparaît plus nulle part hors de ce registre ; la cible est `syntaxe-modele` | +| AFF-082 | « `make syntax-template` » (docs/projet/MISE-A-JOUR-CODEX-CLAUDE.md:146) | procédurale | idem | ✅ | Même nom périmé, second emplacement. — **rejugé le 2026-08-08 : RÉSOLU.** idem AFF-081 | | AFF-083 | Tous les docs cités par README/QUICKSTART/AGENTS existent (`plan-et-generation`, `positionnement`, `bindings-conception`, `flux-conception`, `couches-deploiement.yml`, `registre-flux.md`, `carte-set-ops`, `runbooks-exploitation`, `vm-lifecycle`, `procedure-template-…`, `dns-interne`, `nomenclature-vm`, `config-proxmox`, `catalogue-services`, `dimensionnement-ressources`, `exemples/vault.exemple.yml`, `exemples/instance.exemple.yml`) | structurelle | `test -f` sur chaque chemin | ✅ | 17/17 présents. | | AFF-084 | « `docs/dependances-groupes.yml` — chaque groupe existant y figure, aucune entrée ne référence un rôle supprimé » (AGENTS:345,413) | structurelle | `verifier-dependances` (AFF-009) | ✅ | Validé ; graphe sans cycle, tri topologique réussi (via `orchestrer verifier`). | -| AFF-097 | Chemins d'inventaire `lab/` codés en dur pour la config/voûte **Proxmox** et le template, alors que `make config`/`cloner-vm` résolvent `lab > principal > production` (modèle `socle` = `production/`) | procédurale | `grep -rn 'inventories/lab/group_vars' docs playbooks` ; `scripts/config_proxmox.py:31` | 🟡 | **Découvert en Phase 3 (lot A).** Reste `lab/` codé en dur dans `docs/vm-lifecycle.md:171`, `docs/procedure-template-debian13-proxmox.md:741,747`, `docs/modeles_vm/debian13-proxmox.md:89`, `playbooks/proxmox/README.md:31,43,49,50`, `playbooks/proxmox/cloner_vm_debian.yml:45` (message). Non bloquant (l'outillage résout), mais trompeur pour le socle. **Différé** au lot « voûte Proxmox » (couplé à AFF-098). | +| AFF-097 | Chemins d'inventaire `lab/` codés en dur pour la config/voûte **Proxmox** et le template, alors que `make config`/`cloner-vm` résolvent `lab > principal > production` (modèle `socle` = `production/`) | procédurale | `grep -rn 'inventories/lab/group_vars' docs playbooks` ; `scripts/config_proxmox.py:31` | 🟡 | **Découvert en Phase 3 (lot A).** Reste `lab/` codé en dur dans `docs/exploitation/vm-lifecycle.md:171`, `docs/exploitation/procedure-template-debian13-proxmox.md:741,747`, `docs/exploitation/gabarit-debian13-justification.md:89`, `playbooks/proxmox/README.md:31,43,49,50`, `playbooks/proxmox/cloner_vm_debian.yml:45` (message). Non bloquant (l'outillage résout), mais trompeur pour le socle. **Différé** au lot « voûte Proxmox » (couplé à AFF-098). | | AFF-099 | Le modèle public `socle` livre un `plan/domaines.yml` **invalide** : `exemple.internal` en `autorite: interne`, rejeté par le validateur (`auto-heberge`/`delegue`/`primaire-cache` attendus) | fonctionnelle | `SETOPS_INSTANCE=exemples/modeles/socle python3 scripts/domaines.py verifier` | ✅ | **Découvert Phase 5.** Un opérateur suivant QUICKSTART bute à la validation (étape 9 / `make inventaire-verifier`). `interne` = valeur périmée (déjà corrigée ailleurs en `auto-heberge`, cf. CHANGELOG 2026-07-07). — **rejugé le 2026-08-08 : RÉSOLU.** `SETOPS_INSTANCE=exemples/modeles/socle python3 scripts/domaines.py verifier` → « Registre des domaines valide. » (gardé par P15) | | AFF-100 | `instancier.py`/`inventory_gui.py` résolvent `principal > production` mais **retombent sur `principal`** quand aucun `hosts.yml` n'existe encore ; le socle est en `production/` → 1ʳᵉ génération dans `principal/`, à côté des `group_vars` restés en `production/` (split-brain) | fonctionnelle | parcours QUICKSTART hors-ligne sur une copie du socle (`generer`→`appliquer`) | ✅ | **Découvert Phase 5.** `config_proxmox.py` détecte le répertoire existant (→ `production/`) ; `instancier`/GUI non → incohérence. QUICKSTART étapes 6-9 cassées pour le socle. — **rejugé le 2026-08-08 : RÉSOLU.** parcours hors-ligne sur copie du socle : `instancier generer` écrit dans `inventories/production/hosts.genere.yml` — plus de repli sur `principal` | | AFF-098 | Contradiction fonctionnelle voûte Proxmox : `make config` écrit le token dans la voûte unifiée `all/vault.yml` (et `config-proxmox.md` dit de **supprimer** `proxmox.vault.yml`), mais le clonage `cloner_vm_debian.yml` (lancé `-i localhost,`) ne charge le secret **que** depuis `proxmox.vault.yml`/`proxmox.local.yml` ou les variables d'env — **jamais** `all/vault.yml` | fonctionnelle | lecture `playbooks/proxmox/cloner_vm_debian.yml:11-12,51-64` vs `scripts/config_proxmox.py:35` | ✅ | **Découvert en Phase 3 (lot B).** Un opérateur qui suit la voûte unifiée met le token dans `all/vault.yml` → `make creer-vm` échoue l'assert (`proxmox_api_token_secret` vide), sauf variables d'env ou `proxmox.vault.yml` conservé. **Traitement B (code)** : faire lire `all/vault.yml` par le clonage, ou faire écrire `proxmox.vault.yml` par `make config`. À arbitrer dans le lot « voûte Proxmox ». — **rejugé le 2026-08-08 : RÉSOLU.** `cloner_vm_debian.yml` et `config_proxmox.py` disent tous deux « voûte UNIQUE de l'instance » ; `config-proxmox.md` §« `proxmox.vault.yml` n'est plus lue (retirée le 2026-08-03) » | @@ -158,18 +164,18 @@ Légende du statut : ✅ prouvée · 🟡 partielle · ❌ fausse · ⚪ invéri | ID | Affirmation (source) | Type | Commande de preuve | Statut | Écart constaté | |---|---|---|---|---|---| -| AFF-101 | « Tout l'adressage dérive du seul seed `index` ; aucune adresse n'est stockée » (`docs/sdn-evpn.md` §2 ; wiki *Multi-instance*) | structurelle | `python3 scripts/prouver.py` → **P20** | ✅ | Aucun `supernet`/`sous_reseau`/`passerelle`/`vlan` stocké dans une nomenclature. | -| AFF-102 | « Aucune paire d'instances fédérées ne partage un `index` » (`docs/multi-instances.md`) | fonctionnelle | **P21** (`scripts/instances.py --verifier`) | ✅ | 3 instances, aucune collision. Le garde-fou refuse la création en doublon. | +| AFF-101 | « Tout l'adressage dérive du seul seed `index` ; aucune adresse n'est stockée » (`docs/conception/sdn-evpn.md` §2 ; wiki *Multi-instance*) | structurelle | `python3 scripts/prouver.py` → **P20** | ✅ | Aucun `supernet`/`sous_reseau`/`passerelle`/`vlan` stocké dans une nomenclature. | +| AFF-102 | « Aucune paire d'instances fédérées ne partage un `index` » (`docs/conception/multi-instances.md`) | fonctionnelle | **P21** (`scripts/instances.py --verifier`) | ✅ | 3 instances, aucune collision. Le garde-fou refuse la création en doublon. | | AFF-103 | « L'underlay ne chevauche aucun supernet tenant et reste sous la plage VLAN tenant » (`underlay.yml.example` ; wiki) | structurelle | **P23** (`scripts/underlay.py --verifier`) | ✅ | Sauté si aucun `underlay.yml` monté (dépôt public nu). | -| AFF-104 | « La frontière déclare toujours une source d'administration ; un devis dont `nftables_admin_ssh` est vide est refusé » (`docs/frontiere-opnsense.md` §5) | fonctionnelle | **P24** (`scripts/devis_opnsense.py --verifier`) | ✅ | Garde anti-lockout : sans cet intrant, la règle SSH n'aurait aucune source et le `block` final fermerait l'accès. | +| AFF-104 | « La frontière déclare toujours une source d'administration ; un devis dont `nftables_admin_ssh` est vide est refusé » (`docs/conception/frontiere-opnsense.md` §5) | fonctionnelle | **P24** (`scripts/devis_opnsense.py --verifier`) | ✅ | Garde anti-lockout : sans cet intrant, la règle SSH n'aurait aucune source et le `block` final fermerait l'accès. | | AFF-105 | « Les modèles publics valident, underlay compris » (`exemples/modeles/socle/README.md`) | structurelle | **P17** (`scripts/modeles.py verifier`) | ✅ | Underlay facultatif ; validé pour sa cohérence **interne** seulement — un modèle est un gabarit, pas un site déployé. | -| AFF-107 | « Le filtrage est-ouest intra-tenant est dérivé du registre des flux, et redit la même politique que les nftables d'hôte » (`docs/sdn-evpn.md` §3) | structurelle | **P25** (`scripts/devis_proxmox_fw.py --verifier`) | ✅ | 34 groupes, 40 règles sur 2 tenants. Les deux barrières lisent le registre par les **mêmes fonctions** : elles ne peuvent pas diverger. | -| AFF-108 | « Une intégration universelle est déclarée par le rôle, pas recopiée par serveur : aucun hôte n'y échappe et le plan ne la redit pas » (`docs/decisions-architecture.md` D-33) | structurelle | **P26** (`scripts/prouver.py`) | ✅ | L'exemption se dérive du **service rendu** (`sauf_role`), jamais d'un nom d'hôte : l'AC ne s'enrôle pas auprès d'elle-même, et l'exemption suit step-ca si on le déplace. | -| AFF-109 | « Ce qui appartient à l'hébergeur (cluster, fabric, frontière) vit dans son dépôt, jamais recopié chez un tenant » (`docs/decisions-architecture.md` D-35) | structurelle | **P27** (`scripts/prouver.py`) | ✅ | Le chemin se dérive du symlink `underlay.yml` : l'hébergeur n'est toujours pas déclaré (D-17). Sautée si aucun underlay n'est monté. | -| AFF-110 | « Chaque tenant a son pool Proxmox, dérivé, sans collision de nom ni de VMID » (`docs/decisions-architecture.md` D-37) | structurelle | **P28** (`scripts/devis_proxmox_pools.py --verifier`) | ✅ | Le nom dérive du dossier d'instance et de l'`index`, déjà unique par P21 — aucun registre de plus. Le devis ne lit pas le cluster : il affirme la cohérence du **plan**, pas l'état appliqué. | -| AFF-111 | « Chaque rôle `serveur_*` déclare sa position d'authentification, et la déclaration est cohérente avec son code » (`docs/authentification.md`, D-38 à D-41) | structurelle | **P29** (`scripts/prouver.py`) | ✅ | 23 rôles déclarés. La preuve refuse l'oubli **et** le mensonge : une déclaration `web-sso natif` sans variable `_oidc`, ou `ldap-direct` sans variable `_ldap`, échoue. Les indices sont **nommés** — une première version cherchait les mots « ldap »/« oidc » et le mot LDAP dans un commentaire suffisait à valider un mensonge. Les 2 portées `interne-sans-auth` (Prometheus, Loki) sont des lacunes **comptées, pas masquées**. | -| AFF-112 | « Ajouter un tenant implique une zone EVPN, ses VNets et ses sous-réseaux, tous dérivés du seed » (`docs/sdn-evpn.md` §2) | structurelle | **P30** (`scripts/devis_sdn.py --verifier`) | ✅ | 2 zones, 12 VNets, 12 sous-réseaux. La dérivation **reproduit à l'identique** les deux zones déjà présentes sur le cluster (nom, VNI de VRF, MTU, contrôleur) — vérifié par lecture de l'API. La garde refuse un identifiant de VNet de plus de 8 caractères, limite Proxmox qui aurait fait échouer le devis à l'application. Les **nœuds de sortie manquants** sont signalés, pas inventés. | -| AFF-106 | « Le panneau couvre le schéma du plan : aucun champ n'oblige à éditer le YAML » (`docs/intrants-base-gui-conception.md`) | fonctionnelle | **P19** (`scripts/couverture_gui.py`) | 🟡 | Vrai des registres du plan. **Exceptions assumées** : `reseaux` et `hotes` de l'underlay (listes de tables) restent hors du panneau ; les ports physiques et le nœud de sortie EVPN se nomment à la main. | +| AFF-107 | « Le filtrage est-ouest intra-tenant est dérivé du registre des flux, et redit la même politique que les nftables d'hôte » (`docs/conception/sdn-evpn.md` §3) | structurelle | **P25** (`scripts/devis_proxmox_fw.py --verifier`) | ✅ | 34 groupes, 40 règles sur 2 tenants. Les deux barrières lisent le registre par les **mêmes fonctions** : elles ne peuvent pas diverger. | +| AFF-108 | « Une intégration universelle est déclarée par le rôle, pas recopiée par serveur : aucun hôte n'y échappe et le plan ne la redit pas » (`docs/projet/decisions-architecture.md` D-33) | structurelle | **P26** (`scripts/prouver.py`) | ✅ | L'exemption se dérive du **service rendu** (`sauf_role`), jamais d'un nom d'hôte : l'AC ne s'enrôle pas auprès d'elle-même, et l'exemption suit step-ca si on le déplace. | +| AFF-109 | « Ce qui appartient à l'hébergeur (cluster, fabric, frontière) vit dans son dépôt, jamais recopié chez un tenant » (`docs/projet/decisions-architecture.md` D-35) | structurelle | **P27** (`scripts/prouver.py`) | ✅ | Le chemin se dérive du symlink `underlay.yml` : l'hébergeur n'est toujours pas déclaré (D-17). Sautée si aucun underlay n'est monté. | +| AFF-110 | « Chaque tenant a son pool Proxmox, dérivé, sans collision de nom ni de VMID » (`docs/projet/decisions-architecture.md` D-37) | structurelle | **P28** (`scripts/devis_proxmox_pools.py --verifier`) | ✅ | Le nom dérive du dossier d'instance et de l'`index`, déjà unique par P21 — aucun registre de plus. Le devis ne lit pas le cluster : il affirme la cohérence du **plan**, pas l'état appliqué. | +| AFF-111 | « Chaque rôle `serveur_*` déclare sa position d'authentification, et la déclaration est cohérente avec son code » (`docs/conception/authentification.md`, D-38 à D-41) | structurelle | **P29** (`scripts/prouver.py`) | ✅ | 23 rôles déclarés. La preuve refuse l'oubli **et** le mensonge : une déclaration `web-sso natif` sans variable `_oidc`, ou `ldap-direct` sans variable `_ldap`, échoue. Les indices sont **nommés** — une première version cherchait les mots « ldap »/« oidc » et le mot LDAP dans un commentaire suffisait à valider un mensonge. Les 2 portées `interne-sans-auth` (Prometheus, Loki) sont des lacunes **comptées, pas masquées**. | +| AFF-112 | « Ajouter un tenant implique une zone EVPN, ses VNets et ses sous-réseaux, tous dérivés du seed » (`docs/conception/sdn-evpn.md` §2) | structurelle | **P30** (`scripts/devis_sdn.py --verifier`) | ✅ | 2 zones, 12 VNets, 12 sous-réseaux. La dérivation **reproduit à l'identique** les deux zones déjà présentes sur le cluster (nom, VNI de VRF, MTU, contrôleur) — vérifié par lecture de l'API. La garde refuse un identifiant de VNet de plus de 8 caractères, limite Proxmox qui aurait fait échouer le devis à l'application. Les **nœuds de sortie manquants** sont signalés, pas inventés. | +| AFF-106 | « Le panneau couvre le schéma du plan : aucun champ n'oblige à éditer le YAML » (`docs/conception/intrants-base-gui-conception.md`) | fonctionnelle | **P19** (`scripts/couverture_gui.py`) | 🟡 | Vrai des registres du plan. **Exceptions assumées** : `reseaux` et `hotes` de l'underlay (listes de tables) restent hors du panneau ; les ports physiques et le nœud de sortie EVPN se nomment à la main. | **Non enregistré volontairement.** Les devis eux-mêmes (`make devis-reseau`, `make devis-opnsense`) ne font l'objet d'aucune affirmation de *justesse* : leur syntaxe @@ -310,16 +316,16 @@ les 🟡 relèvent de la **Phase 3 (arbitrage)**. *(Tous traités depuis — voi renvoyés au dépôt privé `Set-OPS-modeles`, cohérent avec `exemples/modeles/README.md`. - **AFF-023 (❌ → résolu, A + correctif d'exemple)** — Chemin de voûte corrigé `lab/` → `production/` dans `QUICKSTART.md`, `exemples/vault.exemple.yml` et - `docs/config-proxmox.md`. **Piège corrigé** : le modèle `socle` livrait ses intrants en + `docs/exploitation/config-proxmox.md`. **Piège corrigé** : le modèle `socle` livrait ses intrants en `production/group_vars/all.yml` (forme fichier) ; ajouter `all/vault.yml` (forme dossier) **masque silencieusement** le fichier `all.yml` (vérifié empiriquement : seul le dossier est chargé). Le modèle a été converti en forme dossier (`all/10-intrants.yml`), alignée sur l'instance prouvée `principal`. Validé : `ansible-inventory --host` charge bien `domaine_interne` depuis la nouvelle disposition. - **AFF-080/081/082 (❌ → résolu, A)** — Commandes `make` périmées corrigées : - `make help` → `make` (`docs/config-proxmox.md`) ; `make syntax-template` → - `make syntaxe-modele` (`docs/modeles_vm/debian13-proxmox.md`, - `docs/MISE-A-JOUR-CODEX-CLAUDE.md`). + `make help` → `make` (`docs/exploitation/config-proxmox.md`) ; `make syntax-template` → + `make syntaxe-modele` (`docs/exploitation/gabarit-debian13-justification.md`, + `docs/projet/MISE-A-JOUR-CODEX-CLAUDE.md`). - **AFF-097 (🟡, découvert)** — `lab/` codé en dur restant dans les docs template/clone (étapes 5+). Consigné ci-dessus ; **non traité dans ce lot** (lot séparé à prévoir). @@ -356,8 +362,8 @@ les 🟡 relèvent de la **Phase 3 (arbitrage)**. *(Tous traités depuis — voi le token est bien chargé depuis `all/vault.yml` et l'hôte depuis `proxmox.yml` (assert vert). **Suite, 2026-08-03** : `proxmox.vault.yml` n'est plus chargée du tout — tolérée, elle restait le seul porteur du jeton chez un tenant, dans un fichier gitignoré. Migrée vers `all/vault.yml`, supprimée, et `voute.py verifier` contrôle désormais la voûte RÉELLE quand elle est déchiffrable (ce que la seule vérification du gabarit ne pouvait pas voir). - **AFF-097 (🟡 → résolu, A)** — `lab/` codé en dur retiré des docs Proxmox/template : - `playbooks/proxmox/README.md`, `docs/procedure-template-debian13-proxmox.md`, - `docs/vm-lifecycle.md`, `docs/modeles_vm/debian13-proxmox.md` → `production/` + voûte + `playbooks/proxmox/README.md`, `docs/exploitation/procedure-template-debian13-proxmox.md`, + `docs/exploitation/vm-lifecycle.md`, `docs/exploitation/gabarit-debian13-justification.md` → `production/` + voûte unifiée. Plus aucune référence `inventories/lab/group_vars` dans les fichiers suivis (hors `tmp/` gitignoré et la section *migration* de `config-proxmox.md`, intentionnelle). @@ -394,7 +400,7 @@ commande morte, chemin faux ni étape manquante.* - **AFF-100 (❌ → résolu, B)** — `instancier.py` et `inventory_gui.py` : le repli sans `hosts.yml` vise maintenant le **répertoire d'inventaire existant** (→ `production/` pour le socle) avant de retomber sur `principal`. Instances existantes (avec `hosts.yml`) inchangées. -- **Cohérence GUI/doc** — `docs/intrants-communs.md` : `group_vars/all.yml` → +- **Cohérence GUI/doc** — `docs/conception/intrants-communs.md` : `group_vars/all.yml` → `group_vars/all/10-intrants.yml` (le GUI écrit déjà en forme dossier). `QUICKSTART.md` étape 8 : exemple `serveur_postgresql` → `serveur_powerdns` (groupe présent dans le socle). - **Preuve bout-en-bout (hors-ligne)** : parcours QUICKSTART rejoué sur une copie du socle — diff --git a/docs/audit/plan-de-recette.md b/docs/audit/plan-de-recette.md index ac5f0f2..94521f1 100644 --- a/docs/audit/plan-de-recette.md +++ b/docs/audit/plan-de-recette.md @@ -150,7 +150,7 @@ le côté humain **est** la preuve de l'affirmation « exploitable sans IA » (c | 1 | Lis ton réseau physique | : make underlay. Repère les VLAN sous 1000 (l'underlay) et les MTU. Pourquoi le transport doit-il être à 1500 quand l'overlay est à 1450 ? | 👁 observe | — | | 2 | Regarde sans écrire | : make sdn-plan. Si le cluster dit déjà ce que le plan dit, la sortie tient en une ligne. | 👁 observe | — | | 3 | Trouve la sortie d'un tenant | : dans make devis-sdn, repère la strophe FRR et l'adresse du prochain saut. À quel équipement appartient-elle ? | 👁 observe | — | -| 4 | Change `index` dans un modèle | (jamais en production) et régénère : combien de valeurs ont bougé ? C'est la mesure exacte de ce que la dérivation t'épargne. Pour aller plus loin : docs/sdn-evpn.md dans le dépôt (référence technique), Le plan & l'adressage dérivé, Mult… | 👁 observe | — | +| 4 | Change `index` dans un modèle | (jamais en production) et régénère : combien de valeurs ont bougé ? C'est la mesure exacte de ce que la dérivation t'épargne. Pour aller plus loin : docs/conception/sdn-evpn.md dans le dépôt (référence technique), Le plan & l'adressage d… | 👁 observe | — | *Source : [Le réseau des tenants — du câble au VRF](../../wiki/Le-r%C3%A9seau-des-tenants.md) · § À toi de jouer.* diff --git a/docs/audit/protocole-operateur-independant.md b/docs/audit/protocole-operateur-independant.md index cf7ca02..32845f4 100644 --- a/docs/audit/protocole-operateur-independant.md +++ b/docs/audit/protocole-operateur-independant.md @@ -17,7 +17,7 @@ principe 10). ## Ce que l'épreuve mesure **Mesuré** : ce que le dépôt public transmet, seul, à un sysadmin compétent qui ne -connaît pas Set-OPS — depuis `QUICKSTART.md`, sur sa propre grappe Proxmox, du dépôt nu +connaît pas Set-OPS — depuis `README.md` et `docs/setup.md`, sur sa propre grappe Proxmox, du dépôt nu jusqu'à un socle déployé. **Non mesuré** : les modèles assemblés (dépôt privé `Set-OPS-modeles`), les services @@ -74,7 +74,7 @@ sysadmin. Rien d'autre. En particulier, l'auteur ne prépare **ni** le jeton API Proxmox, **ni** les clés SSH, **ni** le mot de passe Vault, **ni** le moindre fichier d'instance : ce sont -les prérequis de `QUICKSTART.md` §0, et savoir les produire fait partie de l'épreuve. +les prérequis de `docs/setup.md`, et savoir les produire fait partie de l'épreuve. ## Périmètre matériel et sécurité diff --git a/docs/authentification.md b/docs/conception/authentification.md similarity index 99% rename from docs/authentification.md rename to docs/conception/authentification.md index a331646..4f59f07 100644 --- a/docs/authentification.md +++ b/docs/conception/authentification.md @@ -107,7 +107,7 @@ déclaration que le code contredit. **Et depuis le 2026-09-07, sa sœur `P58` garde les habilitations** — ce que P29 ne fait pas : elle tient les *positions* (qui s'authentifie comment), pas les *droits* (qui obtient -quoi). Voir [`autorisation.md`](autorisation.md) §5. +quoi). Voir [`autorisation.md`](../exploitation/autorisation.md) §5. **Depuis le 2026-09-06, elle refuse aussi que ce tableau mente.** Les chiffres et les listes de la troisième colonne sont confrontés aux déclarations réelles. Ils avaient cessé d'être diff --git a/docs/bindings-conception.md b/docs/conception/bindings-conception.md similarity index 99% rename from docs/bindings-conception.md rename to docs/conception/bindings-conception.md index c552328..4e91d84 100644 --- a/docs/bindings-conception.md +++ b/docs/conception/bindings-conception.md @@ -192,7 +192,7 @@ du secret. La §3.1 est donc raffinée, pas contredite. ~~Reste comme valeur réelle (non bloquant) : **factoriser** le bloc de résolution copié-collé dans les 4 rôles en un include partagé.~~ **Fait.** Le rôle utilitaire -[`roles/resoudre_base/`](../roles/resoudre_base/README.md) porte la résolution, et **cinq** +[`roles/resoudre_base/`](../../roles/resoudre_base/README.md) porte la résolution, et **cinq** rôles consommateurs l'incluent (`serveur_forgejo`, `serveur_icinga`, `serveur_icingaweb2`, `serveur_keycloak`, `serveur_nextcloud`). Le DRY a bien été validé **en le déployant**, comme prévu — l'épreuve de Keycloak. Cf. §9. diff --git a/docs/conception-contextes.md b/docs/conception/conception-contextes.md similarity index 100% rename from docs/conception-contextes.md rename to docs/conception/conception-contextes.md diff --git a/docs/courriel-conception.md b/docs/conception/courriel-conception.md similarity index 100% rename from docs/courriel-conception.md rename to docs/conception/courriel-conception.md diff --git a/docs/depots-prives-conception.md b/docs/conception/depots-prives-conception.md similarity index 100% rename from docs/depots-prives-conception.md rename to docs/conception/depots-prives-conception.md diff --git a/docs/dimensionnement-ressources.md b/docs/conception/dimensionnement-ressources.md similarity index 100% rename from docs/dimensionnement-ressources.md rename to docs/conception/dimensionnement-ressources.md diff --git a/docs/dns-interne.md b/docs/conception/dns-interne.md similarity index 100% rename from docs/dns-interne.md rename to docs/conception/dns-interne.md diff --git a/docs/filiation-emancipation.md b/docs/conception/filiation-emancipation.md similarity index 100% rename from docs/filiation-emancipation.md rename to docs/conception/filiation-emancipation.md diff --git a/docs/flux-conception.md b/docs/conception/flux-conception.md similarity index 97% rename from docs/flux-conception.md rename to docs/conception/flux-conception.md index 2941b09..3b33773 100644 --- a/docs/flux-conception.md +++ b/docs/conception/flux-conception.md @@ -63,7 +63,7 @@ Un **résolveur** (miroir de `instancier`) agrège, par serveur, les `flux.yml` (services + intégrations), résout les `pair`, et produit : - **`nftables`** : ruleset par serveur (allow des flux résolus, `policy drop` par défaut), consommé par le rôle `nftables_baseline` ; -- **le registre d'audit** : `docs/registre-flux.md` (généré) + une cible `make flux`. +- **le registre d'audit** : `docs/conception/registre-flux.md` (généré) + une cible `make flux`. ## Activation prudente @@ -105,7 +105,7 @@ déploiement graduel (garder l'accès SSH/Ansible, tester par nœud). 1. ✅ figer le schéma (ce doc) + **piloter** sur postgresql / client_metrique / nginx ; 2. ✅ le **résolveur** (`scripts/resoudre_flux.py`) — agrégation → règles + registre ; 3. ✅ **remplir** tous les rôles (transcription du travail zéro-confiance) ; -4. ✅ **générer** + registre d'audit (`docs/registre-flux.md`, gardé par **P49**) ; puis +4. ✅ **générer** + registre d'audit (`docs/conception/registre-flux.md`, gardé par **P49**) ; puis **activer** nftables nœud par nœud — fait. Ce qui a suivi la séquence n'y était pas prévu : le même registre alimente désormais aussi diff --git a/docs/frontiere-opnsense.md b/docs/conception/frontiere-opnsense.md similarity index 99% rename from docs/frontiere-opnsense.md rename to docs/conception/frontiere-opnsense.md index 1c3fe25..1126c1d 100644 --- a/docs/frontiere-opnsense.md +++ b/docs/conception/frontiere-opnsense.md @@ -4,8 +4,8 @@ > Le pare-feu de bordure de l'écosystème. Ce document fixe les décisions d'architecture > prises le **2026-07-29**, et décrit le devis **dérivé** qui en découle -> (`make devis-opnsense`). Il complète `docs/flux-conception.md` (le modèle des flux) et -> `docs/registre-flux.md` (la matrice d'audit). +> (`make devis-opnsense`). Il complète `docs/conception/flux-conception.md` (le modèle des flux) et +> `docs/conception/registre-flux.md` (la matrice d'audit). ## 1. Le partage des rôles diff --git a/docs/frontiere-physique-virtuel.md b/docs/conception/frontiere-physique-virtuel.md similarity index 100% rename from docs/frontiere-physique-virtuel.md rename to docs/conception/frontiere-physique-virtuel.md diff --git a/docs/identite-sso.md b/docs/conception/identite-sso.md similarity index 99% rename from docs/identite-sso.md rename to docs/conception/identite-sso.md index b055800..2c4107c 100644 --- a/docs/identite-sso.md +++ b/docs/conception/identite-sso.md @@ -39,7 +39,7 @@ > annonçait « Système / services (SSSD, etc.) → LDAP direct » jusqu'au 2026-09-06. Le dépôt > ne fait pas ça : le rôle `client_ldap` a été **retiré le 2026-07-04, hors conception**, et > aucun rôle n'installe SSSD. L'annuaire sert les **applications** ; l'accès à un hôte se -> fait par **clé SSH**, et l'élévation par `sudo`. Voir `docs/authentification.md` §2. +> fait par **clé SSH**, et l'élévation par `sudo`. Voir `docs/conception/authentification.md` §2. ## Sens de provisionnement diff --git a/docs/integrations-vm.md b/docs/conception/integrations-vm.md similarity index 100% rename from docs/integrations-vm.md rename to docs/conception/integrations-vm.md diff --git a/docs/intrants-base-gui-conception.md b/docs/conception/intrants-base-gui-conception.md similarity index 99% rename from docs/intrants-base-gui-conception.md rename to docs/conception/intrants-base-gui-conception.md index c9a1c7b..a60f9d3 100644 --- a/docs/intrants-base-gui-conception.md +++ b/docs/conception/intrants-base-gui-conception.md @@ -5,7 +5,7 @@ But : saisir depuis **un endroit unique** les [intrants communs](intrants-communs.md) de l'écosystème, en distinguant **constantes** et **défauts surchargeables**. -> Extension assumée du plan de contrôle (gelé — cf. [`positionnement.md`](positionnement.md)), +> Extension assumée du plan de contrôle (gelé — cf. [`positionnement.md`](../projet/positionnement.md)), > au même titre que le [dimensionnement](dimensionnement-ressources.md). Décidée le > 2026-06-26. diff --git a/docs/intrants-communs.md b/docs/conception/intrants-communs.md similarity index 97% rename from docs/intrants-communs.md rename to docs/conception/intrants-communs.md index c325f54..b8f0f6e 100644 --- a/docs/intrants-communs.md +++ b/docs/conception/intrants-communs.md @@ -33,7 +33,7 @@ fois**, depuis un endroit unique, puis les laisser se **dériver** ou se **propa l'instance, `group_vars/all/vault.yml`. **`proxmox.vault.yml` n'est plus lue** (retirée le 2026-08-03) : tolérée « en compatibilité », elle était restée le *seul* porteur du jeton chez un tenant — et comme `*.vault.yml` est gitignoré, ce jeton ne voyageait avec aucun - dépôt. Une voûte unique qui ne l'était pas. Cf. `docs/config-proxmox.md`. + dépôt. Une voûte unique qui ne l'était pas. Cf. `docs/exploitation/config-proxmox.md`. - Golden template : `proxmox_clone_vmid_modele`, `proxmox_clone_source_nom`. - Placement par défaut : `proxmox_clone_noeud`, `proxmox_clone_stockage`, `proxmox_clone_pont`, format, complet, timeout, disque, interface, démarrer. @@ -63,7 +63,7 @@ journald (rétention) · core_dumps · systemd_ssh_auto. ### H. Secrets Vault communs 🔒 — **voûte unique** `group_vars/all/vault.yml` > Tous les secrets de l'instance dans **un seul fichier chiffré par environnement** > (`inventories//group_vars/all/vault.yml`), gabarit -> [`exemples/vault.exemple.yml`](../exemples/vault.exemple.yml). Un mot de passe, un +> [`exemples/vault.exemple.yml`](../../exemples/vault.exemple.yml). Un mot de passe, un > endroit. Édité via `ansible-vault edit` (jamais par le GUI). **La liste ne s'écrit pas ici.** Elle se *recense*, depuis le plan, les rôles des groupes actifs et les `group_vars` : diff --git a/docs/carte-set-ops.md b/docs/conception/mecanismes.md similarity index 64% rename from docs/carte-set-ops.md rename to docs/conception/mecanismes.md index 720b261..86b17cc 100644 --- a/docs/carte-set-ops.md +++ b/docs/conception/mecanismes.md @@ -1,58 +1,11 @@ -# Carte d'orientation Set-OPS +# Les mécanismes transverses > **Pour qui :** le **mainteneur** — celui qui va *modifier* le moteur. À lire avant -> d'ajouter quoi que ce soit. -> -> Tu viens plutôt **exploiter** un écosystème déjà déployé ? Wiki → -> **Reprendre l'écosystème**. Tu **apprends** le métier ? Wiki → **Accueil**. +> d'ajouter quoi que ce soit : ces mécanismes vivent dans le code et les README de rôles, et +> on les re-découvre sinon. Le survol est dans `docs/architecture.md` ; l'index des +> documents dans `docs/README.md`. -Point d'entrée vers le corpus documentaire, et **catalogue des mécanismes transverses** — -ceux qui vivent dans le code et qu'on *re-découvre* sinon. Créée le 2026-07-03 après un audit -du dépôt, **revue le 2026-07-29**. But : ne plus re-déterrer ce qui existe. - -Le dépôt est **déjà bien documenté**. Le manque n'était pas la doc du *modèle*, mais (a) un -index « par où commencer » et (b) une carte des *mécanismes* (dispersés dans le code + les -README de rôles). Cette page comble ces deux trous. - -### Le dépôt en chiffres - -> Ces valeurs sont **mesurées**, pas recopiées : **P48** les recompte et refuse tout écart. -> Elles étaient toutes fausses le 2026-08-26 — de 6 rôles, de 12 pièces d'audit, de 8 -> décisions. Aucune ne faisait travailler personne ; mais une carte dont les faits -> vérifiables sont faux cesse d'être consultée, et c'est alors ses **pointeurs** qu'on perd. - -| Ce qu'on compte | Combien | Comment on le mesure | -|---|---|---| -| rôles | 70 | `roles/*/` | -| README de rôles | 70 | `roles/*/README.md` — l'écart avec la ligne au-dessus est la dette | -| documents | 47 | `docs/*.md` | -| pièces d'audit | 53 | `docs/audit/*` | -| unités de wiki | 27 | `wiki/*.md` | -| décisions en vigueur | 85 | lignes `\| **D-nn** \|` de `decisions-architecture.md` | -| décisions renversées | 3 | lignes `\| **D-nn** —` du même document | - -## 1. À lire d'abord (dans l'ordre) - -| Sujet | Documents | -|---|---| -| **Autorité / gouvernance** | `AGENTS.md` (source d'autorité), `CLAUDE.md`, `docs/MISE-A-JOUR-CODEX-CLAUDE.md` | -| **Le modèle (plan)** | `docs/architecture-set-ops.md` (survol) → `docs/plan-et-generation.md` (à fond) → `docs/meta-classe.md` (concept) → `docs/conception-contextes.md` (site et locataire : deux classes, un contrat) → `docs/depots-prives-conception.md` (chaque runner ne lit que ses dépôts ; chantier) | -| **Services, maturité, dette** | `docs/catalogue-services.md` (**la carte de maturité + la cruft y sont déjà**) | -| **Exploitation / VM** | `docs/vm-lifecycle.md`, `docs/procedure-template-debian13-proxmox.md`, `docs/config-proxmox.md`, `docs/nomenclature-vm.md`, `docs/multi-instances.md` | -| **Conceptions de domaine** | `docs/identite-sso.md`, `docs/courriel-conception.md`, `docs/bindings-conception.md`, `docs/dns-interne.md`, `docs/dimensionnement-ressources.md`, `docs/integrations-vm.md` | -| **Supervision & métriques** | `docs/supervision-conception.md` (les verdicts, vers Icinga) → `docs/metriques-conception.md` (les séries, vers Prometheus et Grafana) — deux questions, deux fichiers `meta/`, un même patron : le rôle déclare, le moteur dérive | -| **Réseau / pare-feu** | `docs/flux-conception.md` (le modèle) → `docs/registre-flux.md` (**généré**, matrice d'audit) → `docs/frontiere-opnsense.md` (la bordure nord/sud) ; underlay : `underlay.yml.example` + `make underlay` | -| **Ordre de déploiement** | `docs/couches-deploiement.yml` (couches) + `docs/dependances-groupes.yml` (graphe) → `playbooks/site.yml` (**généré**, `make site`) | -| **Conformité du déployé** | `docs/devis-services.md` — les **cinq devis de service** (`make identite-plan`, `certificats-plan`, `expositions-plan`, `postgresql-plan`, `courriel-plan`) **et les cinq devis d'infrastructure** (`frontiere-plan`, `proxmox-fw-plan`, `sdn-plan`, `underlay-plan`, `placement-plan`). Répondent à ce que `make prouver` ne demande jamais : *ce qui tourne correspond-il à ce qui est déclaré ?* | -| **Preuve / recette** | `docs/audit/affirmations.md` (registre), `make prouver` → `docs/audit/preuve-.md` — **statique** : lit le dépôt, aucun appel réseau ; la conformité du déployé est l'affaire des devis de service (ligne au-dessus), `docs/audit/plan-de-recette.md` (**généré** du wiki), `docs/audit/protocole-operateur-independant.md` | -| **Décisions d'architecture** | `docs/decisions-architecture.md` — les décisions en vigueur (comptées ci-dessus), pourquoi, où lire le détail, et ce qui les garde ; plus les **décisions renversées** et leur cause | -| **SDN / routage** | `docs/sdn-evpn.md` — décision du 2026-08-02 : le routage inter-zone passe des commutateurs aux hyperviseurs (zones EVPN = VRF). **En service** depuis le 2026-08-03 (`routage_tenants: sdn` dans l'`underlay.yml` du site) : les trunks ne portent plus que deux VLAN d'underlay au lieu de quinze, les passerelles `.1` sont anycast sur chaque hyperviseur. Écart mesuré par `make sdn-plan` | -| **Migration de tenant** | `docs/migration-tenant.md` — recette en **neuf étapes (0 à 8)**, machine à états, gardes ; le receveur se construit **avant** tout gel | -| **Exploitation courante** | `docs/runbooks-exploitation.md`, `docs/intrants-communs.md`, `docs/intrants-base-gui-conception.md`, `docs/theme-forgejo-hors-flotte.md` | -| **Pédagogie (le wiki)** | `wiki/` — les unités (comptées ci-dessus) publiées par `make wiki-publier` ; entrer par `wiki/Home.md` | -| **Vision / positionnement** | `docs/ecosysteme-chezlepro.md`, `docs/positionnement.md`, `docs/pouvoirs-set-ops.md` | - -## 2. Les mécanismes transverses (et OÙ ils vivent) +## Les mécanismes transverses, et où ils vivent Ce que je re-découvre sinon. **Consulter avant de concevoir un nouveau mécanisme.** @@ -88,10 +41,10 @@ Ce que je re-découvre sinon. **Consulter avant de concevoir un nouveau mécanis > `app→base` côté base (registre, résolu en rôle pour que le secret ne quitte jamais le rôle). > Ne pas unifier l'un dans l'autre sans raison. Cf. `bindings-conception.md`. -## 3. Maturité & dette +## Maturité et dette - **Maturité des rôles, échafaudages, rôles-catégories inertes** : voir - `docs/catalogue-services.md` « État d'implémentation » (source de vérité, tenue à jour). + `docs/projet/catalogue-services.md` « État d'implémentation » (source de vérité, tenue à jour). - **Dette (audit 2026-07-03, revu le 2026-07-29)** : - ✅ **soldé** — README de rôles : **tous les rôles en ont un** (les 12 manquants écrits le 2026-07-29 : `serveur_debian`, `hosts_statiques`, `resoudre_base`, `resoudre_annuaire`, @@ -110,10 +63,10 @@ Ce que je re-découvre sinon. **Consulter avant de concevoir un nouveau mécanis `docs/dependances-groupes.yml` + `docs/couches-deploiement.yml`, et sont bel et bien consommées par l'orchestrateur (`scripts/orchestrer.py` → `playbooks/site.yml`). -## 4. Discipline (pour ne plus re-déterrer) +## Discipline Avant de concevoir ou d'ajouter un mécanisme : -1. lire **cette carte** + le doc du sujet ; +1. lire **cette page**, l'index (`docs/README.md`) et le document du sujet ; 2. **arpenter le code** (`grep`) et **lire les README des rôles** concernés ; 3. **éprouver l'outil AVANT d'écrire le rôle** qui l'enveloppe — une machine jetable hors plan se fabrique en deux minutes (`make cloner-vm`, cf. `vm-lifecycle.md` §4bis). C'est diff --git a/docs/meta-classe.md b/docs/conception/meta-classe.md similarity index 97% rename from docs/meta-classe.md rename to docs/conception/meta-classe.md index 3d49f2a..c2a9c8d 100644 --- a/docs/meta-classe.md +++ b/docs/conception/meta-classe.md @@ -7,7 +7,7 @@ Set-OPS se comporte comme une **méta-classe** : on n'écrit pas onze serveurs, engendre la flotte entière, cohérente. Le réseau, la taille des VM, les groupes, les liens de bases (DSN) et l'exposition DNS sont **dérivés** — jamais saisis deux fois. -> Concept acté dans [`positionnement.md`](positionnement.md) : « la définition +> Concept acté dans [`positionnement.md`](../projet/positionnement.md) : « la définition > instancie toute la flotte ». La dérivation des ressources est décrite dans > [`dimensionnement-ressources.md`](dimensionnement-ressources.md). diff --git a/docs/metriques-conception.md b/docs/conception/metriques-conception.md similarity index 98% rename from docs/metriques-conception.md rename to docs/conception/metriques-conception.md index 3b28de5..6d4bcde 100644 --- a/docs/metriques-conception.md +++ b/docs/conception/metriques-conception.md @@ -18,7 +18,7 @@ des données différentes, pour des consommateurs différents. | `supervision.yml` | une **sonde** qui rend un verdict avec un TTL | *est-ce cassé ?* | Icinga | | `metriques.yml` | un **exportateur** qui expose une série | *depuis quand, et vers où ?* | Prometheus → Grafana | -Ce n'est pas une frontière inventée pour l'occasion. `docs/supervision-conception.md` la +Ce n'est pas une frontière inventée pour l'occasion. `docs/conception/supervision-conception.md` la pose déjà dans l'autre sens : > Une **métrique à seuil** — durée de collecte, volume de journaux, taux d'occupation — diff --git a/docs/multi-instances.md b/docs/conception/multi-instances.md similarity index 97% rename from docs/multi-instances.md rename to docs/conception/multi-instances.md index c9ec1a4..14ea4f4 100644 --- a/docs/multi-instances.md +++ b/docs/conception/multi-instances.md @@ -129,7 +129,7 @@ sable met `false` et affiche « bac à sable ». 2. Régler l'identité (`10-intrants.yml` : domaine **distinct**), le réseau (`nomenclature.yml` : **`index` distinct** — tout l'adressage en dérive, cf. plus bas) et la cible Proxmox (`proxmox.yml`). -3. Créer la voûte unique depuis le gabarit (cf. [`config-proxmox.md`](config-proxmox.md)) : +3. Créer la voûte unique depuis le gabarit (cf. [`config-proxmox.md`](../exploitation/config-proxmox.md)) : `cp exemples/vault.exemple.yml …/group_vars/all/vault.yml` puis `ansible-vault encrypt`. **Et poser SA clé** — une voûte, une clé : `~/.config/setops-vault-ops-clientx`, nom dérivé du dossier en minuscules. `python3 scripts/voutes.py etat` confirme que le moteur @@ -146,7 +146,7 @@ moteur, isolé. C'est la base concrète de la **portabilité des tenants**. > Garde-fou de positionnement : si le nombre d'instances explose, le besoin d'un > **registre** (lister/choisir, IPAM, secrets centralisés) relève d'outils établis > (NetBox, AWX, un coffre type Vault HashiCorp) **à adopter aux seuils**, pas à -> réimplémenter dans le moteur. Cf. [`positionnement.md`](positionnement.md). +> réimplémenter dans le moteur. Cf. [`positionnement.md`](../projet/positionnement.md). ## Adressage fédéré : tout dérive du seed `index` @@ -184,9 +184,9 @@ site. Le décalage de +10, retiré le 2026-08-12, confisquait dix valeurs — et empêchait de lire l'index directement dans l'adresse. Le VLAN (≤ 4094) autoriserait jusqu'à 308, le VMID bien plus : c'est donc l'adressage IP qui plafonne. Au-delà d'une poignée d'instances co-localisées, confier l'allocation à un **IPAM** (NetBox) plutôt qu'au moteur — cf. -[`positionnement.md`](positionnement.md). +[`positionnement.md`](../projet/positionnement.md). ## Voir aussi - [`meta-classe.md`](meta-classe.md) — le plan d'une instance instancie sa flotte. -- [`config-proxmox.md`](config-proxmox.md) — voûte unique + cible Proxmox par instance. +- [`config-proxmox.md`](../exploitation/config-proxmox.md) — voûte unique + cible Proxmox par instance. - [`intrants-communs.md`](intrants-communs.md) — intrants de base d'une instance. diff --git a/docs/nomenclature-vm.md b/docs/conception/nomenclature-vm.md similarity index 100% rename from docs/nomenclature-vm.md rename to docs/conception/nomenclature-vm.md diff --git a/docs/plan-et-generation.md b/docs/conception/plan-et-generation.md similarity index 99% rename from docs/plan-et-generation.md rename to docs/conception/plan-et-generation.md index 5b967e4..8217cea 100644 --- a/docs/plan-et-generation.md +++ b/docs/conception/plan-et-generation.md @@ -61,7 +61,7 @@ propriété des *rôles*, la même pour toutes les instances. - **Nommage/adressage** : tout part du seed `index` et de la `fonction` de l'hôte. `supernet = 10..0.0/16`, `zone = 10..(15+catégorie)`, `VLAN = 1000 + index×10 + zone`, `VMID = ` — neuf chiffres, - miroir de l'IP. Voir `docs/nomenclature-vm.md`. *(Les formules à cinq chiffres et le + miroir de l'IP. Voir `docs/conception/nomenclature-vm.md`. *(Les formules à cinq chiffres et le réseau unique `10.0.x` qui figuraient ici décrivaient le modèle d'avant le multi-instance.)* - **DSN** (lien application↔base) : `://:@:/`. diff --git a/docs/registre-flux.md b/docs/conception/registre-flux.md similarity index 100% rename from docs/registre-flux.md rename to docs/conception/registre-flux.md diff --git a/docs/schemas-flux.md b/docs/conception/schemas-flux.md similarity index 98% rename from docs/schemas-flux.md rename to docs/conception/schemas-flux.md index 5f6eedc..8870c61 100644 --- a/docs/schemas-flux.md +++ b/docs/conception/schemas-flux.md @@ -11,7 +11,7 @@ que personne ne devine, et elle vieillira sans que quiconque s'en aperçoive. La série des flux, elle, obéit à une règle propre : ces pages expliquent **comment les choses sont configurées et interconnectées**. Ce ne sont pas des comptes rendus — elles ne relatent aucun incident, ne datent aucune panne et ne comptent aucune machine tombée. Ce -travail-là appartient au `CHANGELOG.md` et à `docs/decisions-architecture.md`. Une page de +travail-là appartient au `CHANGELOG.md` et à `docs/projet/decisions-architecture.md`. Une page de cette série répond à une seule question : *par où passe telle chose, et pourquoi par là*. ## La série diff --git a/docs/sdn-evpn.md b/docs/conception/sdn-evpn.md similarity index 98% rename from docs/sdn-evpn.md rename to docs/conception/sdn-evpn.md index d466736..fccebcd 100644 --- a/docs/sdn-evpn.md +++ b/docs/conception/sdn-evpn.md @@ -3,7 +3,7 @@ > **Pour qui :** le **mainteneur** du réseau overlay. > **Décision d'architecture du 2026-08-02.** Elle remplace le routage inter-zone sur les -> commutateurs L3 par des zones EVPN de Proxmox SDN. Complète `docs/frontiere-opnsense.md` +> commutateurs L3 par des zones EVPN de Proxmox SDN. Complète `docs/conception/frontiere-opnsense.md` > (la bordure, inchangée) et `underlay.yml.example` (la fabric, très allégée). > > **Décidé le 2026-08-03** : une zone EVPN **par tenant** ; le routage **et le filtrage** @@ -220,4 +220,4 @@ l'interface étiquetée dédiée retenue. `voisins_site` (2026-08-24), né du besoin de chaîner les caches d'artefacts. Cf. §3. - **La migration depuis l'existant** : le tenant Chezlepro tourne déjà sur des VLAN. Passer à EVPN est un changement de plan de transport pour des VM en service — la recette de - `docs/migration-tenant.md` s'applique-t-elle, ou faut-il un chemin plus court ? + `docs/hebergement/migration-tenant.md` s'applique-t-elle, ou faut-il un chemin plus court ? diff --git a/docs/supervision-conception.md b/docs/conception/supervision-conception.md similarity index 100% rename from docs/supervision-conception.md rename to docs/conception/supervision-conception.md diff --git a/docs/acces-administration.md b/docs/exploitation/acces-administration.md similarity index 100% rename from docs/acces-administration.md rename to docs/exploitation/acces-administration.md diff --git a/docs/autorisation.md b/docs/exploitation/autorisation.md similarity index 99% rename from docs/autorisation.md rename to docs/exploitation/autorisation.md index 0a2b976..6cdf0c1 100644 --- a/docs/autorisation.md +++ b/docs/exploitation/autorisation.md @@ -405,7 +405,7 @@ en fonctionnement. L'état réel : | Les `meta/acces.yml` | **écrits pour les cinq services `web-sso`** : `serveur_forgejo`, `serveur_grafana`, `serveur_icingaweb2`, `serveur_keycloak`, `serveur_nextcloud` | | La preuve | **écrite le 2026-09-07 — c'est P58** | -Le §5 de [`authentification.md`](authentification.md) formule la règle : *une directive +Le §5 de [`authentification.md`](../conception/authentification.md) formule la règle : *une directive qu'aucune garde ne vérifie finit par ne plus être vraie*. `meta/acces.yml` a été dans ce cas jusqu'au 2026-09-07 : rien ne vérifiait qu'un service `web-sso` en porte un. **P29** gardait les *positions* d'authentification ; **P58** garde désormais les *habilitations*. diff --git a/docs/config-proxmox.md b/docs/exploitation/config-proxmox.md similarity index 96% rename from docs/config-proxmox.md rename to docs/exploitation/config-proxmox.md index c217dd1..13bffd0 100644 --- a/docs/config-proxmox.md +++ b/docs/exploitation/config-proxmox.md @@ -22,7 +22,7 @@ la connexion au cluster Proxmox et les valeurs de clonage par défaut. Il pose sans tout retaper. > Ces paramètres sont des **intrants communs** de l'écosystème (cf. -> [`intrants-communs.md`](intrants-communs.md) §C). L'accès au cluster et le golden +> [`intrants-communs.md`](../conception/intrants-communs.md) §C). L'accès au cluster et le golden > template sont des **constantes** ; le placement par défaut est **surchargeable > par hôte** dans `instance/plan/serveurs.yml`. @@ -77,7 +77,7 @@ par écosystème — fini les voûtes éparpillées. > et le `Makefile` les rassemble dans `ANSIBLE_VAULT_IDENTITY_LIST` via > `scripts/voutes.py`. Créer une VM ouvre d'ailleurs **deux** voûtes dans la même > exécution : celle du tenant, et celle de l'hébergeur qui détient le jeton Proxmox. Gabarit committé : -[`exemples/vault.exemple.yml`](../exemples/vault.exemple.yml) (les deux clés du token +[`exemples/vault.exemple.yml`](../../exemples/vault.exemple.yml) (les deux clés du token Proxmox + **15 clés `vault_*`** pour PKI, LDAP/SSO, bases, forge, observabilité). L'assistant demande « Configurer la voûte de secrets maintenant ». Si `oui` : @@ -159,7 +159,7 @@ Dans l'interface Proxmox (ou en CLI `pveum`) : ## Voir aussi -- [`intrants-communs.md`](intrants-communs.md) — tous les intrants communs de l'écosystème. -- [`nomenclature-vm.md`](nomenclature-vm.md) — réseau, VLAN, fonctions. +- [`intrants-communs.md`](../conception/intrants-communs.md) — tous les intrants communs de l'écosystème. +- [`nomenclature-vm.md`](../conception/nomenclature-vm.md) — réseau, VLAN, fonctions. - [`vm-lifecycle.md`](vm-lifecycle.md) — cycle de vie d'une VM (création → conformité). - `make` — liste des cibles (l'aide est la cible par défaut). diff --git a/docs/devis-services.md b/docs/exploitation/devis-services.md similarity index 99% rename from docs/devis-services.md rename to docs/exploitation/devis-services.md index f2a15ba..fe11528 100644 --- a/docs/devis-services.md +++ b/docs/exploitation/devis-services.md @@ -137,7 +137,7 @@ Reste un écart de nature différente, et le devis le nomme comme tel : *livré livré* = la bordure autorise et l'hôte refuse. Rien ne fuit, mais les deux couches ne déclarent pas la même politique — et une politique qu'on ne peut plus lire est une politique qu'on ne tient plus. C'est ce qui a fait naître le mot-clé `poste: false` dans -`meta/flux.yml` (voir [`frontiere-opnsense.md`](frontiere-opnsense.md)). +`meta/flux.yml` (voir [`frontiere-opnsense.md`](../conception/frontiere-opnsense.md)). ## Le devis des expositions diff --git a/docs/modeles_vm/debian13-proxmox.md b/docs/exploitation/gabarit-debian13-justification.md similarity index 99% rename from docs/modeles_vm/debian13-proxmox.md rename to docs/exploitation/gabarit-debian13-justification.md index 9352312..f848a66 100644 --- a/docs/modeles_vm/debian13-proxmox.md +++ b/docs/exploitation/gabarit-debian13-justification.md @@ -13,7 +13,7 @@ Le template doit rester un socle commun, clonable et sécuritaire. Il ne doit pa L'état de départ attendu est décrit dans : ```text -docs/procedure-template-debian13-proxmox.md +docs/exploitation/procedure-template-debian13-proxmox.md ``` Résumé : @@ -326,11 +326,11 @@ clés privées Les intégrations futures sont documentées dans : ```text -docs/integrations-vm.md +docs/conception/integrations-vm.md ``` Le cycle complet VM vanille, golden template, clone et conformité continue est documenté dans : ```text -docs/vm-lifecycle.md +docs/exploitation/vm-lifecycle.md ``` diff --git a/docs/procedure-template-debian13-proxmox.md b/docs/exploitation/procedure-template-debian13-proxmox.md similarity index 99% rename from docs/procedure-template-debian13-proxmox.md rename to docs/exploitation/procedure-template-debian13-proxmox.md index 8ab5947..21b3e5c 100644 --- a/docs/procedure-template-debian13-proxmox.md +++ b/docs/exploitation/procedure-template-debian13-proxmox.md @@ -13,7 +13,7 @@ Ce document s’arrête au point de bascule vers le `Makefile`. Les ajouts appliqués ensuite par Ansible, leur validation et leur justification sont documentés dans : ```text -docs/modeles_vm/debian13-proxmox.md +docs/exploitation/gabarit-debian13-justification.md ``` --- diff --git a/docs/runbooks-exploitation.md b/docs/exploitation/runbooks-exploitation.md similarity index 99% rename from docs/runbooks-exploitation.md rename to docs/exploitation/runbooks-exploitation.md index be137e0..b2209dd 100644 --- a/docs/runbooks-exploitation.md +++ b/docs/exploitation/runbooks-exploitation.md @@ -58,7 +58,7 @@ Mapping (défaut du rôle grafana) : `grafana-admin`→Admin, `grafana-editor` > `personnel ⇒ Viewer`. Ajouter quelqu'un au **groupe** lui ouvre Grafana, Forgejo, Icinga et > le courriel d'un seul geste — alors qu'une assignation nominative crée une dette qu'on > découvre le jour du départ, service par service. L'assignation explicite ci-dessus reste -> le geste de dépannage, pas la façon normale d'accorder un accès. Voir `docs/autorisation.md` §5. +> le geste de dépannage, pas la façon normale d'accorder un accès. Voir `docs/exploitation/autorisation.md` §5. --- diff --git a/docs/sortir-les-cles-du-poste.md b/docs/exploitation/sortir-les-cles-du-poste.md similarity index 100% rename from docs/sortir-les-cles-du-poste.md rename to docs/exploitation/sortir-les-cles-du-poste.md diff --git a/docs/theme-forgejo-hors-flotte.md b/docs/exploitation/theme-forgejo-hors-flotte.md similarity index 100% rename from docs/theme-forgejo-hors-flotte.md rename to docs/exploitation/theme-forgejo-hors-flotte.md diff --git a/docs/vm-lifecycle.md b/docs/exploitation/vm-lifecycle.md similarity index 98% rename from docs/vm-lifecycle.md rename to docs/exploitation/vm-lifecycle.md index ef62f3b..f74182b 100644 --- a/docs/vm-lifecycle.md +++ b/docs/exploitation/vm-lifecycle.md @@ -63,7 +63,7 @@ nftables préparé mais désactivé Les détails et justifications sont dans : ```text -docs/modeles_vm/debian13-proxmox.md +docs/exploitation/gabarit-debian13-justification.md ``` ## 3. Validation et cleanup @@ -249,5 +249,5 @@ visualisation Elles sont documentées dans : ```text -docs/integrations-vm.md +docs/conception/integrations-vm.md ``` diff --git a/docs/hebergeur-exploitation.md b/docs/hebergement/hebergeur-exploitation.md similarity index 100% rename from docs/hebergeur-exploitation.md rename to docs/hebergement/hebergeur-exploitation.md diff --git a/docs/implanter-un-tenant-sur-un-site.md b/docs/hebergement/implanter-un-tenant-sur-un-site.md similarity index 97% rename from docs/implanter-un-tenant-sur-un-site.md rename to docs/hebergement/implanter-un-tenant-sur-un-site.md index fde6634..5b26d7a 100644 --- a/docs/implanter-un-tenant-sur-un-site.md +++ b/docs/hebergement/implanter-un-tenant-sur-un-site.md @@ -36,7 +36,7 @@ par une **commande qui interroge le système**, jamais par une conviction. - [ ] **Créer le dépôt de l'hébergeur** — un dossier frère, avec deux fichiers : `underlay.yml` et `proxmox-hebergeur.yml` (squelettes en annexe). - [ ] **Emporter le gabarit** `modeleSetOPS` sur disque (`vzdump`), *et* la procédure de - fabrication en repli : [`procedure-template-debian13-proxmox.md`](procedure-template-debian13-proxmox.md). + fabrication en repli : [`procedure-template-debian13-proxmox.md`](../exploitation/procedure-template-debian13-proxmox.md). - [ ] **Préparer la voûte** de l'instance à recevoir les deux paires de secrets (hyperviseur, frontière). Jamais dans un dépôt git, jamais dans une conversation. - [ ] **Vérifier la version de Proxmox.** Tout ce dépôt a été éprouvé sur PVE 8. Sur PVE 9, @@ -174,7 +174,7 @@ make frontiere-plan make sdn-plan make placement-plan - [ ] **La sauvegarde emporte-t-elle quelque chose ?** Compter les fichiers, pas les succès. Une sauvegarde verte sur zéro fichier a tenu six semaines ici. -- [ ] **Éprouver une restauration** — [`runbooks-exploitation.md`](runbooks-exploitation.md) §5. +- [ ] **Éprouver une restauration** — [`runbooks-exploitation.md`](../exploitation/runbooks-exploitation.md) §5. Une sauvegarde jamais restaurée n'est pas une sauvegarde. - [ ] **La supervision voit-elle l'unité de sauvegarde ?** Sans `vault_icinga_api_depot`, personne ne surveille les sauvegardes — et rien ne le dit. @@ -267,6 +267,6 @@ grosses meurent, et rien n'est signalé. `make mtu-mesurer` tranche. - [`preparer-un-site-hebergeur.md`](preparer-un-site-hebergeur.md) — ce que l'hébergeur prépare. - [`migration-tenant.md`](migration-tenant.md) — déplacer un tenant **vivant**. -- [`multi-instances.md`](multi-instances.md) — un moteur, N écosystèmes. -- [`sdn-evpn.md`](sdn-evpn.md) — pourquoi une zone EVPN par tenant. -- [`decisions-architecture.md`](decisions-architecture.md) — D-71 (PKI/DNS d'abord), D-77, D-78, D-80. +- [`multi-instances.md`](../conception/multi-instances.md) — un moteur, N écosystèmes. +- [`sdn-evpn.md`](../conception/sdn-evpn.md) — pourquoi une zone EVPN par tenant. +- [`decisions-architecture.md`](../projet/decisions-architecture.md) — D-71 (PKI/DNS d'abord), D-77, D-78, D-80. diff --git a/docs/migration-tenant.md b/docs/hebergement/migration-tenant.md similarity index 98% rename from docs/migration-tenant.md rename to docs/hebergement/migration-tenant.md index 3433fb1..a0faa8e 100644 --- a/docs/migration-tenant.md +++ b/docs/hebergement/migration-tenant.md @@ -4,8 +4,8 @@ > **Recette d'exploitation.** Elle décrit la séquence, les états et les gardes ; elle ne > décrit pas encore un outil, parce que la séquence doit être éprouvée avant d'être figée -> dans du code. Complète `docs/multi-instances.md` (la fédération) et -> `docs/frontiere-opnsense.md` §2 (qui possède quoi). +> dans du code. Complète `docs/conception/multi-instances.md` (la fédération) et +> `docs/conception/frontiere-opnsense.md` §2 (qui possède quoi). ## 1. Pourquoi ce document existe diff --git a/docs/preparer-un-site-hebergeur.md b/docs/hebergement/preparer-un-site-hebergeur.md similarity index 96% rename from docs/preparer-un-site-hebergeur.md rename to docs/hebergement/preparer-un-site-hebergeur.md index 728e550..0655337 100644 --- a/docs/preparer-un-site-hebergeur.md +++ b/docs/hebergement/preparer-un-site-hebergeur.md @@ -169,7 +169,7 @@ un artefact du **moteur**, pas d'un tenant. Une VM Debian minimale avec > C'est arrivé, et il a fallu recapturer le gabarit puis reconstruire pour s'en défaire. En cas de doute, laisser l'exploitant le fabriquer : c'est une demi-heure, et la procédure -est écrite (`docs/procedure-template-debian13-proxmox.md`). +est écrite (`docs/exploitation/procedure-template-debian13-proxmox.md`). ## 7. Ce que l'exploitant doit recevoir @@ -252,7 +252,7 @@ réseaux **défait en silence l'isolation inter-tenant**. WireGuard s'y prête b ## Voir aussi -- [`sdn-evpn.md`](sdn-evpn.md) — pourquoi une zone EVPN par tenant. -- [`config-proxmox.md`](config-proxmox.md) — les intrants côté hyperviseur, et le token. -- [`frontiere-opnsense.md`](frontiere-opnsense.md) — la frontière, hors flotte Ansible. -- [`procedure-template-debian13-proxmox.md`](procedure-template-debian13-proxmox.md) — fabriquer `modeleSetOPS`. +- [`sdn-evpn.md`](../conception/sdn-evpn.md) — pourquoi une zone EVPN par tenant. +- [`config-proxmox.md`](../exploitation/config-proxmox.md) — les intrants côté hyperviseur, et le token. +- [`frontiere-opnsense.md`](../conception/frontiere-opnsense.md) — la frontière, hors flotte Ansible. +- [`procedure-template-debian13-proxmox.md`](../exploitation/procedure-template-debian13-proxmox.md) — fabriquer `modeleSetOPS`. diff --git a/docs/remise-au-client.md b/docs/hebergement/remise-au-client.md similarity index 100% rename from docs/remise-au-client.md rename to docs/hebergement/remise-au-client.md diff --git a/docs/responsabilites-locataire-hebergeur.md b/docs/hebergement/responsabilites-locataire-hebergeur.md similarity index 100% rename from docs/responsabilites-locataire-hebergeur.md rename to docs/hebergement/responsabilites-locataire-hebergeur.md diff --git a/docs/MISE-A-JOUR-CODEX-CLAUDE.md b/docs/projet/MISE-A-JOUR-CODEX-CLAUDE.md similarity index 95% rename from docs/MISE-A-JOUR-CODEX-CLAUDE.md rename to docs/projet/MISE-A-JOUR-CODEX-CLAUDE.md index a99237d..66d6590 100644 --- a/docs/MISE-A-JOUR-CODEX-CLAUDE.md +++ b/docs/projet/MISE-A-JOUR-CODEX-CLAUDE.md @@ -19,8 +19,8 @@ > l'« incident récent » et son correctif. Les deux `handlers/main.yml` existent > (`ssh_baseline`, `ssh_hardening`) depuis longtemps. > -> **Où aller à la place** : `AGENTS.md` (autorité), `docs/carte-set-ops.md` (par où entrer -> pour modifier le moteur), `docs/catalogue-services.md` (ce qui est éprouvé et ce qui ne +> **Où aller à la place** : `AGENTS.md` (autorité), `docs/README.md` (l'index) et +> `docs/conception/mecanismes.md` (par où entrer pour modifier le moteur), `docs/projet/catalogue-services.md` (ce qui est éprouvé et ce qui ne > l'est pas). ## État du dépôt *(juillet 2026)* diff --git a/docs/catalogue-services.md b/docs/projet/catalogue-services.md similarity index 98% rename from docs/catalogue-services.md rename to docs/projet/catalogue-services.md index f599d92..733a3bc 100644 --- a/docs/catalogue-services.md +++ b/docs/projet/catalogue-services.md @@ -15,11 +15,11 @@ rôles** de durcissement, et dans cet ordre — `hardening_packages`, `sysctl_ha `core_dumps`, `unattended_upgrades`, `apparmor`, `auditd`, `fail2ban_ssh`, `journald`, `ssh_hardening`, `nftables_baseline` — plutôt qu'un rôle homonyme. -La nomenclature des VM et des VMID est documentée dans `docs/nomenclature-vm.md`. +La nomenclature des VM et des VMID est documentée dans `docs/conception/nomenclature-vm.md`. Un service central peut partager un hôte avec d'autres services de la même fonction opérationnelle (plusieurs applications par VM). La relation stricte est entre groupe et playbook, pas entre groupe et VM. -> Modèle à jour : chaque service est une **application** (`instance/plan/applications.yml`). Voir `docs/plan-et-generation.md`. +> Modèle à jour : chaque service est une **application** (`instance/plan/applications.yml`). Voir `docs/conception/plan-et-generation.md`. ## État d'implémentation des rôles @@ -227,7 +227,7 @@ L'ordre ci-dessous privilégie les dépendances structurantes avant les applicat est une couche distincte (`serveur_resolveur` / `client_resolveur`, Unbound), et le **plancher `/etc/hosts`** posé par `hosts_statiques` précède les deux — c'est lui qui permet à l'écosystème de se résoudre DNS éteint. Trois couches, pas un choix de design - (`docs/dns-interne.md`). + (`docs/conception/dns-interne.md`). - Raison : les autres intégrations auront besoin de noms stables plutôt que d'adresses IP. 2. `serveur_step_ca` @@ -325,7 +325,7 @@ Les groupes clients peuvent être ajoutés aux VM existantes quand le service ce Les dépendances exécutables sont déclarées dans `docs/dependances-groupes.yml`. -Le runbook DNS initial est dans `docs/dns-interne.md`. +Le runbook DNS initial est dans `docs/conception/dns-interne.md`. Ce fichier sert à deux usages : diff --git a/docs/decisions-architecture.md b/docs/projet/decisions-architecture.md similarity index 98% rename from docs/decisions-architecture.md rename to docs/projet/decisions-architecture.md index 2f0d568..470a164 100644 --- a/docs/decisions-architecture.md +++ b/docs/projet/decisions-architecture.md @@ -55,7 +55,7 @@ sont les seules vérifiables. | # | Décision | Pourquoi | Détail | Garde | |---|---|---|---|---| -| **D-82** | **Patient 0 n'est le parent de personne.** Il est la **mise en œuvre de référence** du modèle `origine` — le plus petit écosystème complet — et un pair de la famille du génome, pas sa racine | trois faits l'ont retiré un par un : D-81 a donné l'autorité du génome à la forge du SITE (son dernier lecteur corrigé le 2026-08-26, Technolibre le 08-31) ; le dénominateur commun vit dans les modèles depuis le 08-24 ; et **l'ancêtre était locataire de son enfant** — index 29 sur la fabric de `SITE-Chezlepro`, qui descend de lui. `eregion` (`forge.alliance-boreale.ca`) n'est PAS sur le chemin du génome : le poste porte les commits en bundle au runner du site (`make genome-pousser`), qui pousse sur sa forge. `eregion` est une forge héritée, porte publique des contributions, qui ne fera jamais partie de Set-OPS — la redondance vient d'une forge par site, chacune inséminée du génome *(corrigé le 2026-09-28 : cette ligne l'avait dite « SPOF promu », sans mesurer le chemin)* | `OPS-Patient0/README.md`, `docs/filiation-emancipation.md` | — | +| **D-82** | **Patient 0 n'est le parent de personne.** Il est la **mise en œuvre de référence** du modèle `origine` — le plus petit écosystème complet — et un pair de la famille du génome, pas sa racine | trois faits l'ont retiré un par un : D-81 a donné l'autorité du génome à la forge du SITE (son dernier lecteur corrigé le 2026-08-26, Technolibre le 08-31) ; le dénominateur commun vit dans les modèles depuis le 08-24 ; et **l'ancêtre était locataire de son enfant** — index 29 sur la fabric de `SITE-Chezlepro`, qui descend de lui. `eregion` (`forge.alliance-boreale.ca`) n'est PAS sur le chemin du génome : le poste porte les commits en bundle au runner du site (`make genome-pousser`), qui pousse sur sa forge. `eregion` est une forge héritée, porte publique des contributions, qui ne fera jamais partie de Set-OPS — la redondance vient d'une forge par site, chacune inséminée du génome *(corrigé le 2026-09-28 : cette ligne l'avait dite « SPOF promu », sans mesurer le chemin)* | `OPS-Patient0/README.md`, `docs/conception/filiation-emancipation.md` | — | | **D-83** | **Patient 0 a été retiré** — ses machines n'existent plus (constaté le 2026-09-06) | D-82 lui avait laissé une raison d'être : la mise en œuvre de référence du modèle `origine`, et un **témoin** de plus du génome. Le retrait solde les deux : l'une vit dans le modèle `origine`, l'autre revient aux forges de site. **Son plan a été effacé le 2026-09-27** : l'index 29 est libéré, et le site n'ouvre plus rien à `10.29.0.0/16` | `SITE-Chezlepro/underlay.yml` (`tenants`), `SITE-Chezlepro/flux-genere/` | **P21** (index), **P23** | | **D-84** | **Le plan de contrôle reste gelé — c'est la CARTE DES SEUILS qui était fausse** | La question « et si on retirait le gel ? » a mis à l'épreuve les cinq seuils de `positionnement.md`, et deux ne tenaient pas. **RBAC** : couvert depuis que trois classes d'acteurs aux pouvoirs disjoints existent — poste, runner de site, runners de tenant — séparés **cryptographiquement** (une voûte, une clé, 2026-08-28) et non par une table de permissions qu'une faille applicative contournerait ; adopter AWX pour ce besoin serait **régresser**. **IPAM** : sans objet par construction — rien ne s'alloue, tout dérive du seed, et P20/P21/P23/P28/P33 tiennent déjà ce qu'un IPAM vérifierait *a posteriori*. Les deux lignes sont retirées du tableau : les garder aurait fait adopter un outil pour un besoin déjà rempli. **Et un seuil manquait** — l'**émancipation** : le GUI est mono-utilisateur (`127.0.0.1` + jeton), or la trajectoire mène à plusieurs humains aux portées disjointes, sur des machines qui ne sont pas les nôtres. Ce seuil n'appelle pas AWX, il appelle une décision non prise. *Un seuil qu'on ne nomme pas est un seuil qu'on franchit sans le voir.* Corollaire consigné : le gel porte sur les **fonctions**, jamais sur les **vues** — montrer à l'écran ce que le moteur sait déjà ne franchit aucun seuil | `positionnement.md` §3, §4, §5 | — | | **D-85** | **cloud-init naît avec la VM et ne lui survit pas** | cloud-init n'est pas un logiciel d'installation : c'est une **source de vérité externe**, qui se réveille à *chaque* démarrage et relit le lecteur attaché par l'hyperviseur — lequel peut redéfinir comptes, clés SSH autorisées, mots de passe et réseau. Sur une machine que le plan possède, c'est un **second maître** : le plan ne le décrit pas, `make valider` ne le mesure pas, et il parle en premier. Sa tâche est pourtant finie à la première seconde — c'est parce qu'il a **réussi** à poser l'adresse et les clés qu'Ansible a pu entrer. **Trois moitiés, qui se défont séparément** : le **gabarit** le garde (sans lui un clone ne naît pas — P56) ; le **socle** ne l'installe plus (le garder produisait un va-et-vient à chaque déploiement : le socle installe, le durcissement retire, deux `changed` par passage) ; le **durcissement** le retire (`cloud_init_retrait`, en dernier). **Ce qui rend le retrait sûr est mesuré, pas supposé** (2026-09-09, `obs-01`) : `/etc/network/interfaces.d/50-cloud-init` n'appartient à aucun paquet — `dpkg -S` ne le trouve pas — et le `postrm` ne le nomme jamais, même en `purge`. L'adresse survit. Le rôle le **vérifie** malgré tout, avant et après : une VM qui perd ce fichier ne se plaint pas, elle repart sans adresse et plus personne ne peut entrer pour le constater. **⚠ CE QUE CETTE DÉCISION NE FERME PAS — et il faut le dire, sinon elle se lit comme une émancipation qu'elle n'est pas.** Retirer cloud-init **n'ôte aucun pouvoir à l'hébergeur**. `qemu-guest-agent` est au gabarit (P56 : il doit y être — c'est par lui que `creer-vm` confirme la matérialisation sans entrer chez le tenant), et l'API Proxmox expose sur son dos, sur toute VM vivante de la flotte, un pouvoir **strictement plus grand** que le lecteur cloud-init : `exec`, `file-write`, `file-read`, `set-user-password`, `shutdown` (relevé le 2026-09-09 sur `edge-mta-01`, jeton d'API du site). Ce que D-85 ferme est donc **précis et étroit** : (a) une réapplication **automatique, à chaque démarrage**, depuis un support que le plan ne possède pas et qu'aucune preuve ne lit ; (b) le code de cloud-init lui-même — un interpréteur Python complet, exécuté en root au démarrage, et ses ~29 dépendances. Elle ne ferme **pas** la mainmise de l'hyperviseur sur ses invités : celle-là est une propriété de la virtualisation, pas de cloud-init, et elle appelle sa propre décision — non prise. **Le seuil où le remplacer deviendrait juste** : le jour où une première seconde ne peut plus être amorcée par Proxmox (autre hyperviseur, métal nu, hébergeur sans API), le chemin par l'agent invite cesse d'être une réimplémentation d'un standard — que `positionnement.md` interdit — et devient **le chemin portable**. Tant que ce seuil n'est pas atteint, écrire soi-même l'amorçage serait échanger un standard éprouvé contre du code maison au moment le plus fragile, dont le mode de panne est le pire : une VM injoignable | `roles/cloud_init_retrait/`, `serveur_durci.yml`, `positionnement.md` | **P63** | @@ -121,14 +121,14 @@ sont les seules vérifiables. | **D-73** | Tout port **lié** se déclare, et deux rôles co-localisés ne peuvent pas revendiquer le même | un port n'appartient à personne : le premier démarré le prend, l'autre échoue — parfois **en silence**. Sur `infra-mail-01`, le SASL de Dovecot et l'interface d'Alloy se disputaient le 12345 depuis le premier jour, et c'est Dovecot qui perdait sans que rien ne le dise. Le contrôle n'était possible qu'une fois le port d'Alloy — un défaut amont **subi** — déclaré. `partage: true` distingue « j'ouvre cette écoute » de « je décris celle d'un autre » | `scripts/verifier_ports.py`, `make ports-verifier` | **P33** | | **D-70** | La documentation **dit et explique tout ce que le dépôt fait** — et l'exigence est **outillée**, pas seulement énoncée | une exigence qu'on n'outille pas pourrit en silence : la carte annonçait « 28 décisions » quand il y en avait 66, et disait les accès « non construits » alors qu'ils tournaient en production. **P31** garde le couvert — chaque script s'explique et reste atteignable, chaque cible `make` porte son aide (sauf les internes préfixées `_`), chaque rôle a son README. Elle ne garde **pas** la qualité du « pourquoi » : ça se juge en revue, et ça vit dans `CHANGELOG.md` et ici | `devis-services.md`, `CHANGELOG.md` | **P31** | | **D-75** | Un ecart **lisible dans le plan** se prouve dans le plan, pas au deploiement | l'assert de `resoudre_base` fait son travail — mais il s'est declenche a la 92e tache de `collab-01`, apres quarante minutes, pour une application declaree sans base au registre. L'information etait entierement statique. **P35** derive les roles qui exigent une base (ceux qui incluent `resoudre_base`) et le groupe qu'ils reclament (le DEFAUT de la variable passee, jamais leur nom : `serveur_icingaweb2` reclame la base d'`serveur_icinga`). Meme raisonnement que **D-72**/P32 pour les intrants : une garde de deploiement gagne a etre doublee d'une preuve statique | `scripts/prouver.py`, `plan/bases-donnees.yml` | **P35** | -| **D-74** | **Chaque document déclare son lecteur** en tête — un lecteur et sa situation, pas une catégorie de sujet | la documentation était rangée par SUJET, ce qui est juste pour de la référence — mais personne n'arrive avec un sujet, on arrive avec une **situation**. Symptôme exact : `autorisation.md` portait le runbook de reprise le plus utile du dépôt, enfoui au §6, parce que son sujet est l'autorisation ; personne n'allait l'y chercher. Un document qui déclare son lecteur se range tout seul, et un intrus s'y voit. Deux exemptions, **dérivées et non listées** : un document qui s'annonce généré, et un fragment sans titre | `README.md`, `wiki/Reprendre-l-écosystème.md`, `docs/carte-set-ops.md` | **P34** | +| **D-74** | **Chaque document déclare son lecteur** en tête — un lecteur et sa situation, pas une catégorie de sujet | la documentation était rangée par SUJET, ce qui est juste pour de la référence — mais personne n'arrive avec un sujet, on arrive avec une **situation**. Symptôme exact : `autorisation.md` portait le runbook de reprise le plus utile du dépôt, enfoui au §6, parce que son sujet est l'autorisation ; personne n'allait l'y chercher. Un document qui déclare son lecteur se range tout seul, et un intrus s'y voit. Deux exemptions, **dérivées et non listées** : un document qui s'annonce généré, et un fragment sans titre | `docs/README.md`, `wiki/Reprendre-l-écosystème.md` | **P34** | | **D-71** | **Une PKI et un DNS fonctionnels avant toute chose** ; puis, par VM : socle → enrôlement PKI → enregistrement DNS (A **et** PTR) | `deployer-tout` déroule par COUCHES — correct, mais chaque VM réclame alors un certificat à une autorité pas encore debout, et l'échec se lit comme un défaut du rôle et non d'ordre. Les deux hôtes d'amorçage se **dérivent** de `applications..hote` : déplacer l'autorité déplace l'amorçage. **Deux exceptions structurelles assumées** — l'AC s'auto-signe, le DNS pose son propre enregistrement | `Makefile` `_amorcer-socle`, `scripts/socle_amorcage.py` | — | -| **D-76** | Le **gabarit doit se FABRIQUER par le dépôt**, pas se façonner à la main — décidée le 2026-08-12, **volontairement différée** après Technolibre | tout dérive d'un plan et se prouve ; le gabarit est la **seule pièce faite à la main** — 853 lignes de procédure manuelle — et il est en amont des quatorze VM. Le 2026-08-09 l'a démontré : l'ancien portait une **clé privée d'hôte SSH** et un `/etc/resolv.conf` figé, recopiés dans chaque clone, et il a fallu le recapturer. La preuve de reconstruction s'arrête donc un cran trop tôt : on reconstruit la flotte, pas ce dont elle est clonée. **Cible** : image cloud Debian officielle → signature vérifiée contre une empreinte épinglée (`verifier_signature.py`, déjà écrit) → import, réglages, conversion. **Coût honnête** : la recette doit être COMPARÉE au gabarit courant avant bascule — un réglage oublié serait hérité par les quatorze VM, et découvert loin de sa cause. **En attendant**, un gabarit se transporte d'un cluster à l'autre par `vzdump` / `qmrestore` | `docs/procedure-template-debian13-proxmox.md`, `scripts/verifier_signature.py` | — *(à construire)* | +| **D-76** | Le **gabarit doit se FABRIQUER par le dépôt**, pas se façonner à la main — décidée le 2026-08-12, **volontairement différée** après Technolibre | tout dérive d'un plan et se prouve ; le gabarit est la **seule pièce faite à la main** — 853 lignes de procédure manuelle — et il est en amont des quatorze VM. Le 2026-08-09 l'a démontré : l'ancien portait une **clé privée d'hôte SSH** et un `/etc/resolv.conf` figé, recopiés dans chaque clone, et il a fallu le recapturer. La preuve de reconstruction s'arrête donc un cran trop tôt : on reconstruit la flotte, pas ce dont elle est clonée. **Cible** : image cloud Debian officielle → signature vérifiée contre une empreinte épinglée (`verifier_signature.py`, déjà écrit) → import, réglages, conversion. **Coût honnête** : la recette doit être COMPARÉE au gabarit courant avant bascule — un réglage oublié serait hérité par les quatorze VM, et découvert loin de sa cause. **En attendant**, un gabarit se transporte d'un cluster à l'autre par `vzdump` / `qmrestore` | `docs/exploitation/procedure-template-debian13-proxmox.md`, `scripts/verifier_signature.py` | — *(à construire)* | -| **D-77** | **L'underlay d'un site dérive du même `index` que son tenant**, dans la **bande basse** `10..0–15.x` ; les réseaux de **stockage** en sortent et sont **identiques partout**, en `192.168..0/24` | tant qu'il n'existait qu'un site, `10.0.x.x` suffisait. Deux sites qui doivent se joindre — reprise mutuelle, sauvegardes croisées, exploitation à distance — **ne peuvent pas** porter les mêmes plages : chaque routeur croit que le réseau est chez lui. Un « numéro de site » a d'abord été proposé : **rejeté**, c'était un SECOND SEED à tenir et à synchroniser, alors que tout dérive déjà d'`index` (D-17). La bande basse est sûre **par la règle, pas par chance** : les zones valent `10..(15+categorie).0/24`, donc troisième octet ≥ 16 — les octets 0 à 15 ne sont jamais alloués. Les troisièmes et derniers octets de l'underlay actuel sont ainsi **préservés** : seul le deuxième change, et l'invariant `.1` (D-04) survit intact. Le **stockage** en est sorti parce qu'il est jumbo, non routé, et ne quitte jamais son site : il n'a aucun besoin d'être unique, et l'aligner sur le VLAN (`192.168.20.x` ↔ VLAN 20) fait dire son VLAN à l'adresse. Contrepartie assumée : ces réseaux ne pourront jamais traverser un lien inter-sites — sans conséquence, puisque ce qui voyage entre deux sites est l'**état**, par le dépôt de sauvegarde, pas le stockage bloc | `underlay.yml` (`index`), `scripts/underlay.py`, `docs/preparer-un-site-hebergeur.md` | **P23** | +| **D-77** | **L'underlay d'un site dérive du même `index` que son tenant**, dans la **bande basse** `10..0–15.x` ; les réseaux de **stockage** en sortent et sont **identiques partout**, en `192.168..0/24` | tant qu'il n'existait qu'un site, `10.0.x.x` suffisait. Deux sites qui doivent se joindre — reprise mutuelle, sauvegardes croisées, exploitation à distance — **ne peuvent pas** porter les mêmes plages : chaque routeur croit que le réseau est chez lui. Un « numéro de site » a d'abord été proposé : **rejeté**, c'était un SECOND SEED à tenir et à synchroniser, alors que tout dérive déjà d'`index` (D-17). La bande basse est sûre **par la règle, pas par chance** : les zones valent `10..(15+categorie).0/24`, donc troisième octet ≥ 16 — les octets 0 à 15 ne sont jamais alloués. Les troisièmes et derniers octets de l'underlay actuel sont ainsi **préservés** : seul le deuxième change, et l'invariant `.1` (D-04) survit intact. Le **stockage** en est sorti parce qu'il est jumbo, non routé, et ne quitte jamais son site : il n'a aucun besoin d'être unique, et l'aligner sur le VLAN (`192.168.20.x` ↔ VLAN 20) fait dire son VLAN à l'adresse. Contrepartie assumée : ces réseaux ne pourront jamais traverser un lien inter-sites — sans conséquence, puisque ce qui voyage entre deux sites est l'**état**, par le dépôt de sauvegarde, pas le stockage bloc | `underlay.yml` (`index`), `scripts/underlay.py`, `docs/hebergement/preparer-un-site-hebergeur.md` | **P23** | | **D-80** | **Un tenant est agnostique de son underlay.** Les deux symlinks composent deux axes INDEPENDANTS : `instance` designe le tenant, `underlay.yml` la fabric qui l'accueille. Seule exception : une **liaison de placement** de trois cles vivantes | le commentaire disait « la fabric reste celle de l'hebergeur, quel que soit le tenant actif » — vrai, mais centre sur l'hebergeur. Le cadrage juste est centre sur le TENANT : tout son adressage derive du seed `index`, donc son plan se deplace d'une fabric a l'autre **sans y toucher**. Ce qui ne se deplace pas, c'est le **placement** : `proxmox_clone_noeud`, `_stockage` et le gabarit `_vmid_modele` — trois valeurs cote tenant, parce que c'est lui qui choisit ou se poser, mais qui NOMMENT des objets de l'hebergeur. Trois, pas trente : c'est ce qui separe « portable » de « theoriquement portable ». **Le PONT n'en fait pas partie** (mesure le 2026-08-13) : `instancier` pose `proxmox_pont` par hote, derive du VNet de sa zone. `proxmox_clone_pont` n'est qu'un REPLI pour un clone manuel hors flotte — d'ou son intitule dans le GUI, et d'ou le fait que `vmbr3` ait pu y rester faux dix jours | `underlay.py`, `inventories/*/group_vars/proxmox.yml`, `proxmox-hebergeur.yml` | **P37** | -| **D-79** | Le filtrage que l'hyperviseur applique aux VM tourne encore sur **iptables *legacy***. Le passer à `proxmox-firewall` (nftables natif) est une **dette à rembourser**, pas une option — et c'est le même geste qui rend le **pare-feu de VNet** opérant. Décidée le 2026-08-12, **différée après la reconstruction** | mesuré sur `asgard` : `iptables v1.8.9 (legacy)` — pas `(nf_tables)` ; `nftables v1.0.6` installé mais inutilisé par Proxmox ; `proxmox-firewall 0.7.1` **installé et absent des services en cours** ; seul `pve-firewall 5.1.3` tourne. Le pare-feu de VNet est **entièrement expressif** (`type/action/proto/source/dest/dport`, et `policy_forward` ∈ `ACCEPT,DROP` — donc un vrai default-deny inter-zone) : une règle d'essai a été créée, relue, puis retirée. **Mais il n'est implémenté QUE par le moteur nftables** : posée aujourd'hui, une règle serait acceptée, stockée, visible dans l'interface, et n'appliquerait rien. Trois gains dans le même geste — le moteur rejoint la doctrine (« tout est nftables »), le pare-feu de VNet devient réel, et ses règles **survivent à la reconstruction** là où les groupes par VM doivent être ré-attachés à chaque cycle | `devis_proxmox_fw.py`, `docs/sdn-evpn.md` | P25 *(sur le mécanisme actuel)* | +| **D-79** | Le filtrage que l'hyperviseur applique aux VM tourne encore sur **iptables *legacy***. Le passer à `proxmox-firewall` (nftables natif) est une **dette à rembourser**, pas une option — et c'est le même geste qui rend le **pare-feu de VNet** opérant. Décidée le 2026-08-12, **différée après la reconstruction** | mesuré sur `asgard` : `iptables v1.8.9 (legacy)` — pas `(nf_tables)` ; `nftables v1.0.6` installé mais inutilisé par Proxmox ; `proxmox-firewall 0.7.1` **installé et absent des services en cours** ; seul `pve-firewall 5.1.3` tourne. Le pare-feu de VNet est **entièrement expressif** (`type/action/proto/source/dest/dport`, et `policy_forward` ∈ `ACCEPT,DROP` — donc un vrai default-deny inter-zone) : une règle d'essai a été créée, relue, puis retirée. **Mais il n'est implémenté QUE par le moteur nftables** : posée aujourd'hui, une règle serait acceptée, stockée, visible dans l'interface, et n'appliquerait rien. Trois gains dans le même geste — le moteur rejoint la doctrine (« tout est nftables »), le pare-feu de VNet devient réel, et ses règles **survivent à la reconstruction** là où les groupes par VM doivent être ré-attachés à chaque cycle | `devis_proxmox_fw.py`, `docs/conception/sdn-evpn.md` | P25 *(sur le mécanisme actuel)* | > **Ce qui n'a PAS été établi, et qu'il faudra éprouver.** `nft list tables` exige root et le > compte `ansible` ne l'a pas sur les hyperviseurs : **le jeu de règles réellement chargé n'a @@ -147,7 +147,7 @@ sont les seules vérifiables. > filtrage par VM tient toujours, puis poser un `policy_forward: DROP` sur un VNet et > **prouver qu'il bloque, avec son contrôle négatif**. -| **D-78** | Un réseau d'underlay est soit une **destination**, soit un **chemin**. Les destinations gardent l'adressage dérivé (`10..0–15.x`) ; les chemins sortent de cet espace en **`192.168..0/24`, identiques à tous les sites** — décidée le 2026-08-12, **appliquée au déplacement physique** | D-77 sortait déjà le stockage, mais par une exception nommée plutôt que par une règle. Le critère n'est pas « y a-t-il des VM dedans » — le VLAN de gestion n'en a pas non plus — c'est : **ce réseau est-il jamais une destination, ou seulement un chemin ?** Transit (40) : rien que des prochains sauts, deux extrémités adjacentes en L2. Transport VXLAN (**VLAN 50**) : VTEP ↔ VTEP, destination de rien. Stockage (20/30/31) : baie ↔ hyperviseurs. **Gestion (10) : le poste de l'exploitant, un VPN, demain le lien inter-sites doivent l'atteindre** — elle reste dérivée et unique. Effet : sur six réseaux, **cinq** cessent d'exiger la moindre coordination entre deux hébergeurs, et « unique » redevient signifiant — seul ce qui doit l'être l'est | `underlay.yml`, `docs/preparer-un-site-hebergeur.md` | P23 *(la borne de bande basse ne s'applique qu'aux destinations)* | +| **D-78** | Un réseau d'underlay est soit une **destination**, soit un **chemin**. Les destinations gardent l'adressage dérivé (`10..0–15.x`) ; les chemins sortent de cet espace en **`192.168..0/24`, identiques à tous les sites** — décidée le 2026-08-12, **appliquée au déplacement physique** | D-77 sortait déjà le stockage, mais par une exception nommée plutôt que par une règle. Le critère n'est pas « y a-t-il des VM dedans » — le VLAN de gestion n'en a pas non plus — c'est : **ce réseau est-il jamais une destination, ou seulement un chemin ?** Transit (40) : rien que des prochains sauts, deux extrémités adjacentes en L2. Transport VXLAN (**VLAN 50**) : VTEP ↔ VTEP, destination de rien. Stockage (20/30/31) : baie ↔ hyperviseurs. **Gestion (10) : le poste de l'exploitant, un VPN, demain le lien inter-sites doivent l'atteindre** — elle reste dérivée et unique. Effet : sur six réseaux, **cinq** cessent d'exiger la moindre coordination entre deux hébergeurs, et « unique » redevient signifiant — seul ce qui doit l'être l'est | `underlay.yml`, `docs/hebergement/preparer-un-site-hebergeur.md` | P23 *(la borne de bande basse ne s'applique qu'aux destinations)* | > **Ce que D-78 coûte, et ce qui la renverserait.** Le jour où l'un de ces liens devrait > **franchir un site**, il redeviendrait une destination et exigerait une adresse unique. diff --git a/docs/ecosysteme-chezlepro.md b/docs/projet/ecosysteme-chezlepro.md similarity index 98% rename from docs/ecosysteme-chezlepro.md rename to docs/projet/ecosysteme-chezlepro.md index 994b7e4..e11b682 100644 --- a/docs/ecosysteme-chezlepro.md +++ b/docs/projet/ecosysteme-chezlepro.md @@ -74,7 +74,7 @@ objet fragile patiemment bricolé — c'est un artefact reproductible. > Ce qui reste honnête à dire : la reconstruction prouve qu'un plan mène des machines nues à > l'état voulu. Elle ne dit rien de la tenue d'un service **sous charge**, ni de sa mise à > jour dans la durée — deux questions distinctes, et non traitées ici. Le degré de maturité, -> service par service, est tenu à jour dans `docs/catalogue-services.md`, et nous ne +> service par service, est tenu à jour dans `docs/projet/catalogue-services.md`, et nous ne > présentons jamais comme « en production » un service que ce tableau ne donne pas pour tel. --- @@ -161,4 +161,4 @@ Trois principes résument la posture de Chezlepro : --- *Détails techniques et runbooks : voir `AGENTS.md` (autorité du dépôt), -`docs/catalogue-services.md`, `docs/plan-et-generation.md`, `docs/positionnement.md`.* +`docs/projet/catalogue-services.md`, `docs/conception/plan-et-generation.md`, `docs/projet/positionnement.md`.* diff --git a/docs/positionnement.md b/docs/projet/positionnement.md similarity index 87% rename from docs/positionnement.md rename to docs/projet/positionnement.md index 3e88354..92d6cc0 100644 --- a/docs/positionnement.md +++ b/docs/projet/positionnement.md @@ -116,7 +116,7 @@ couverts (§3), et les garder ici aurait fait adopter un outil pour un besoin d **L'émancipation.** Le GUI écoute sur `127.0.0.1` avec un jeton par session : un modèle **mono-utilisateur**, parfait tant que l'exploitant est une personne à son poste. Le jour où un tenant est exploité par **son** organisation — c'est la trajectoire de -[`filiation-emancipation.md`](filiation-emancipation.md), et l'offre destinée aux OBNL y +[`filiation-emancipation.md`](../conception/filiation-emancipation.md), et l'offre destinée aux OBNL y mène — il y a plusieurs humains, aux portées disjointes, sur des machines qui ne sont pas les tiennes. @@ -148,3 +148,28 @@ autrement** — c'est exactement l'erreur que ce tableau portait. > le périmètre sur lequel un ✅ a porté, les témoins du génome et lequel a décroché — ne > franchit aucun seuil : rien de tout cela n'existe dans NetBox ou AWX, parce que rien de > tout cela n'existe hors de ce modèle. + +## 6. Licence et modèle + +> Déplacé du `README.md` le 2026-10-15 : le README ne garde que le rôle du projet et le +> démarrage rapide. Le texte de la licence fait foi dans `LICENSE`. + +### Pourquoi l'AGPLv3 + +Libre **et** copyleft fort. Chacun peut utiliser, exécuter, étudier et modifier Set-OPS — +**y compris commercialement**. En contrepartie, quiconque l'**offre comme service en réseau** +doit mettre à disposition ses modifications sous la même licence. Cela protège la **souveraineté** +(pas de captation propriétaire) **sans jamais interdire l'usage commercial** — cohérent avec le +principe fondateur : *tout est libre*. + +### Modèle : libre + services + +Set-OPS est **entièrement libre** ; aucune fonctionnalité n'est réservée ni verrouillée. Les +revenus, le cas échéant, proviennent de **services autour** du logiciel, jamais de sa fermeture : + +- support / SLA, **hébergement géré**, formation, intégration, développement sur mesure ; +- **certification** d'écosystèmes (label *Souverain / Résilient / Exemplaire*). + +Les artisans et coopératives peuvent exploiter Set-OPS pour **leur propre infrastructure sans +redevance** : l'usage interne ne déclenche aucune obligation de partage. Le copyleft AGPL ne vise +que la captation propriétaire (offrir Set-OPS en service fermé sans en partager les évolutions). diff --git a/docs/pouvoirs-set-ops.md b/docs/projet/pouvoirs-set-ops.md similarity index 100% rename from docs/pouvoirs-set-ops.md rename to docs/projet/pouvoirs-set-ops.md diff --git a/docs/runbooks-construction.yml b/docs/runbooks-construction.yml index 8e4f39f..428cfdf 100644 --- a/docs/runbooks-construction.yml +++ b/docs/runbooks-construction.yml @@ -5,8 +5,8 @@ # # Les 132 cibles documentees du Makefile disent chacune CE QU'ELLE FAIT. Aucune ne dit # dans quel ORDRE, ni pourquoi maintenant, ni ce qu'il faut avoir mesure avant. Cette -# connaissance-la vivait en prose dans `docs/runbooks-exploitation.md`, -# `docs/implanter-un-tenant-sur-un-site.md` et `docs/preparer-un-site-hebergeur.md` — et +# connaissance-la vivait en prose dans `docs/exploitation/runbooks-exploitation.md`, +# `docs/hebergement/implanter-un-tenant-sur-un-site.md` et `docs/hebergement/preparer-un-site-hebergeur.md` — et # la console offrait des boutons sans sequence. # # ON NE RECOPIE PAS LE LIBELLE D'UNE CIBLE. `scripts/runbooks.py` va le lire dans le @@ -114,7 +114,7 @@ runbooks: - id: site-premier-jour titre: "Le premier jour d'un site" portee: site - doc: docs/runbooks-exploitation.md + doc: docs/exploitation/runbooks-exploitation.md but: >- Faire naitre un site hebergeur depuis une fabric nue : les machines, puis le moteur, puis la forge qui permettra aux locataires de se reproduire. L'ordre n'est pas une @@ -184,7 +184,7 @@ runbooks: - id: site-tenir titre: "Tenir un site en etat" portee: site - doc: docs/hebergeur-exploitation.md + doc: docs/hebergement/hebergeur-exploitation.md but: >- Les gestes reguliers de l'hebergeur : porter le genome a jour, appliquer un role aux machines du site, et regarder ce que la fabric fait vraiment. @@ -288,7 +288,7 @@ runbooks: - id: locataire-naitre titre: "Faire naitre un ecosysteme de locataire" portee: tenant - doc: docs/multi-instances.md + doc: docs/conception/multi-instances.md but: >- Du modele au plan monte : creer le dossier de l'ecosysteme, le rendre actif, puis generer son inventaire. Tout l'adressage descend du seed `index` — on ne l'ecrit @@ -341,7 +341,7 @@ runbooks: - id: locataire-materialiser titre: "Preparer le terrain d'un locataire sur la fabric" portee: site - doc: docs/implanter-un-tenant-sur-un-site.md + doc: docs/hebergement/implanter-un-tenant-sur-un-site.md but: >- Tout ce que l'HEBERGEUR pose avant qu'un locataire puisse exister : le placement, les pools, le SDN, les pare-feux et la frontiere. Chaque devis se mesure avant de @@ -441,7 +441,7 @@ runbooks: - id: locataire-deployer titre: "Materialiser et deployer la flotte d'un locataire" portee: tenant - doc: docs/vm-lifecycle.md + doc: docs/exploitation/vm-lifecycle.md but: >- Des VM au service rendu : creer les machines manquantes, deployer couche par couche, puis mesurer. Rien n'est « pret » avant la recette. @@ -496,7 +496,7 @@ runbooks: - id: machine-une titre: "Ajouter ou reprendre une seule machine" portee: tenant - doc: docs/vm-lifecycle.md + doc: docs/exploitation/vm-lifecycle.md but: >- Le cycle d'UNE machine, du plan au service : la voir derivee, la creer, la deployer, la verifier. Le meme chemin sert pour une machine neuve et pour une machine a @@ -535,7 +535,7 @@ runbooks: - id: flotte-refaire titre: "Raser et reconstruire un ecosysteme" portee: tenant - doc: docs/vm-lifecycle.md + doc: docs/exploitation/vm-lifecycle.md but: >- La preuve la plus dure du moteur : detruire un ecosysteme et le refaire depuis le code seul. A ne lancer que sur un chantier — la prod vit ailleurs. @@ -618,7 +618,7 @@ runbooks: - id: gabarit titre: "Le gabarit dore" portee: site - doc: docs/procedure-template-debian13-proxmox.md + doc: docs/exploitation/procedure-template-debian13-proxmox.md but: >- La VM de reference que toute la flotte clone. Elle nait en q35/OVMF et ne se convertit jamais : convertir depuis i440fx casse interfaces et disques. @@ -644,7 +644,7 @@ runbooks: - id: mesurer titre: "Mesurer sans rien ecrire" portee: tenant - doc: docs/devis-services.md + doc: docs/exploitation/devis-services.md but: >- Les devis de service : ils confrontent ce que le plan derive a ce que le systeme rend VRAIMENT, et sortent en erreur s'il y a un ecart. Une tache verte ne prouve pas qu'un @@ -730,7 +730,7 @@ runbooks: - id: acces-admin titre: "L'acces d'administration (tunnel WireGuard)" portee: site - doc: docs/acces-administration.md + doc: docs/exploitation/acces-administration.md but: >- Un tunnel nominatif par locataire, declare par lui et borne a lui. Sans garde, un ecosysteme s'ouvrirait un acces chez son voisin depuis son propre plan. @@ -747,7 +747,7 @@ runbooks: - id: dns-public titre: "Le DNS public et sa signature" portee: tenant - doc: docs/dns-interne.md + doc: docs/conception/dns-interne.md but: >- Publier les zones du locataire, signees avant d'etre exposees. Les DS partent chez le registraire : c'est le seul maillon que le moteur ne peut pas poser lui-meme. @@ -770,7 +770,7 @@ runbooks: - id: filiation titre: "Filiation, insemination, emancipation" portee: tenant - doc: docs/filiation-emancipation.md + doc: docs/conception/filiation-emancipation.md but: >- D'ou vient cet ecosysteme, de quoi depend-il encore, et que faut-il couper pour qu'il tienne seul. L'emancipation se mesure ; elle ne se decrete pas. @@ -824,7 +824,7 @@ runbooks: - id: remise titre: "La remise au client" portee: poste - doc: docs/remise-au-client.md + doc: docs/hebergement/remise-au-client.md but: >- Deux temps qui ne se confondent pas : le paquet qu'on remet, puis le re-cle qui mesure la revocation reelle. Tant que le temps 2 n'est pas fait, on detient encore @@ -857,7 +857,7 @@ runbooks: - id: cles titre: "Les cles hors du poste" portee: poste - doc: docs/sortir-les-cles-du-poste.md + doc: docs/exploitation/sortir-les-cles-du-poste.md but: >- Ce qui n'existe QUE sur le poste meurt avec lui : les CLES, et les VOUTES qu'elles ouvrent (gitignorees, donc sur aucune forge). Les deux sortent, sur un support qu'on @@ -900,7 +900,7 @@ runbooks: - id: lire-le-plan titre: "Lire le plan et ce qu'il derive" portee: tenant - doc: docs/plan-et-generation.md + doc: docs/conception/plan-et-generation.md but: >- Tout ce qui se regarde sans rien changer : les registres du plan, leur validation, et l'inventaire qui en descend. Le premier geste devant un ecosysteme qu'on ne connait pas. diff --git a/docs/setup.md b/docs/setup.md new file mode 100644 index 0000000..5a1a68b --- /dev/null +++ b/docs/setup.md @@ -0,0 +1,152 @@ +# Installation et configuration + +> **Pour qui :** l'exploitant qui monte son premier écosystème sur une grappe Proxmox. Le +> résumé est dans le [README](../README.md) ; ce document donne chaque étape, ses fichiers +> et ses pièges. Préparer le matériel d'un hébergeur est un autre parcours : +> [`hebergement/preparer-un-site-hebergeur.md`](hebergement/preparer-un-site-hebergeur.md). + +## Prérequis + +| Quoi | Détail | +|---|---| +| Grappe Proxmox | droits d'administration, API joignable depuis le poste | +| Jeton d'API Proxmox | utilisateur `ansible@pve` ou équivalent | +| Poste de pilotage | Linux, Python 3, Ansible, `make`, `git` ; `node` optionnel (garde JS du GUI) | +| Paire de clés SSH | la publique est injectée dans les VM par cloud-init | +| Phrase de passe de voûte | une par écosystème | + +## 1. Cloner le moteur + +```bash +git clone Set-OPS && cd Set-OPS +``` + +## 2. Créer l'instance + +Une instance est un dépôt frère du moteur, créé depuis un modèle. Le dépôt public fournit +`socle` : PKI (step-ca), DNS interne (PowerDNS), edge TLS (nginx), magasin de courriel +(Dovecot). Les modèles assemblés par offre sont dans le dépôt privé `Set-OPS-modeles` +(`SETOPS_MODELES` les rend visibles). + +```bash +make instance-modeles # modèles disponibles +make instance-creer NOM=OPS-MonOrg MODELE=socle # crée ../OPS-MonOrg ; INDEX= fixe le seed +ln -s ../OPS-MonOrg instance # l'instance active (ou : make instance-utiliser NOM=OPS-MonOrg) +make instances # écosystèmes découverts, collisions d'index +``` + +`instance-creer` refuse un `index` déjà pris par un écosystème voisin : tout l'adressage en +dérive. Il ne bascule pas le lien `instance/` et ne fait pas `git init`. + +## 3. Renseigner l'instance + +`` est `principal` ou, à défaut, `production` (le nom que porte le modèle). + +| Fichier | Valeur | +|---|---| +| `instance/inventories//group_vars/all/10-intrants.yml` | `domaine_interne` (ex. `monorg.internal`) | +| `instance/plan/nomenclature.yml` | `index` (seed) et supernet | +| `instance/plan/domaines.yml` | domaine public, `autorite`, `edge` | +| `instance/plan/serveurs.yml` | placement Proxmox : nœud, stockage, disque, mémoire, cœurs | + +Le GUI (`make inventaire-ui`) édite les mêmes registres. Valeurs communes : +[`conception/intrants-communs.md`](conception/intrants-communs.md). + +## 4. Proxmox + +```bash +make config # API, nœud, stockage, VMID et nom du gabarit +``` + +Chaque paramètre : [`exploitation/config-proxmox.md`](exploitation/config-proxmox.md). +Les identifiants Proxmox appartiennent à l'hébergeur : ils vivent dans **sa** voûte (celle +de l'underlay), pas dans celle du locataire. + +## 5. Voûtes et clés + +Une voûte par dépôt, chiffrée par `ansible-vault`, depuis le gabarit +[`exemples/vault.exemple.yml`](../exemples/vault.exemple.yml) : +`instance/inventories//group_vars/all/vault.yml`. + +Une clé par voûte, dans un fichier nommé d'après le dossier de l'écosystème, en minuscules : + +```bash +install -m 600 /dev/null ~/.config/setops-vault-ops-monorg +$EDITOR ~/.config/setops-vault-ops-monorg # la phrase de passe, une ligne +python3 scripts/voutes.py etat # le moteur trouve-t-il chaque clé ? +``` + +Rien à exporter : le `Makefile` construit `ANSIBLE_VAULT_IDENTITY_LIST` avec +`scripts/voutes.py`. Créer une VM ouvre deux voûtes dans la même exécution (locataire et +hébergeur) : un seul `ANSIBLE_VAULT_PASSWORD_FILE` ne suffit pas. + +Les clés n'existent que sur le poste. Les sortir sur un support chiffré : +[`exploitation/sortir-les-cles-du-poste.md`](exploitation/sortir-les-cles-du-poste.md). + +## 6. Gabarit Debian 13 (une fois par grappe) + +Créer une VM Debian 13 minimale, joignable par SSH avec clé, puis : + +```bash +make preparer-modele +make verifier-modele +make nettoyer-modele CONFIRMER=true +``` + +Convertir la VM en gabarit Proxmox sous le nom enregistré par `make config` +(`proxmox_clone_source_nom`, `modeleSetOPS` par défaut). Un autre nom fait échouer le +clonage. Machine **q35/OVMF** : ne jamais convertir depuis i440fx. + +Procédure : [`exploitation/procedure-template-debian13-proxmox.md`](exploitation/procedure-template-debian13-proxmox.md) ; +contenu justifié : [`exploitation/gabarit-debian13-justification.md`](exploitation/gabarit-debian13-justification.md). + +## 7. Générer l'inventaire + +```bash +make instancier # ce que le plan produit, en diff +make instancier-appliquer FORCE=1 # première génération seulement +make serveurs # VMID / IP dérivés +``` + +Les hôtes naissent en `etat: planifie`. + +## 8. Créer et déployer + +```bash +make creer-vm HOTE=infra-dns-01 # clone + cloud-init, attend que la VM réponde +# passer l'hôte en etat: actif dans instance/plan/serveurs.yml, puis : +make instancier-appliquer +make deployer HOTE=infra-dns-01 # couche par couche, dans l'ordre du graphe +``` + +Toute la flotte : `make flotte-creer CONFIRMER=true` puis `make deployer-tout CONFIRMER=true`, +ou `make reconstruire CONFIRMER=true` (créer puis déployer). Les déploiements ne visent que +les hôtes actifs. + +## 9. Vérifier + +```bash +make inventaire-verifier # registres, inventaire, gardes +make verifier # lint, tests, inventaire, ordre, flux, syntaxe, puis les preuves +make valider # recette sur la flotte déployée +``` + +## Configuration de référence + +| Élément | Rôle | Défaut | +|---|---|---| +| `instance/` | lien vers le dépôt du locataire actif | — | +| `underlay.yml` | lien vers l'underlay du site actif | `underlay.yml` à la racine | +| `ansible.cfg` | configuration Ansible du moteur | dans le dépôt | +| `.ansible/` | répertoires temporaires d'Ansible | créé par `make` | + +Variables d'environnement et de `make` : [`usage.md`](usage.md). + +## Pannes connues au premier montage + +| Symptôme | Cause | Remède | +|---|---|---| +| `Attempting to decrypt but no vault secrets found` | clé de voûte absente ou mal nommée | étape 5, `python3 scripts/voutes.py etat` | +| `make instancier-appliquer` refuse d'écrire | diff non vide, première génération | `FORCE=1` la première fois seulement | +| le clonage ne trouve pas sa source | nom du gabarit ≠ `proxmox_clone_source_nom` | renommer le gabarit ou refaire `make config` | +| une sortie d'Ansible vide, sans erreur | Ansible exige un tube sur sa sortie | `set -o pipefail; make … < /dev/null 2>&1 \| cat` | diff --git a/docs/usage.md b/docs/usage.md new file mode 100644 index 0000000..33e210d --- /dev/null +++ b/docs/usage.md @@ -0,0 +1,315 @@ +# Utilisation + +> **Pour qui :** l'exploitant et le mainteneur — la référence de l'outil en ligne de +> commande. Set-OPS est un outil CLI : tout passe par `make`, qui appelle Ansible et les +> scripts de `scripts/`. Installation : [`setup.md`](setup.md). + +## Conventions + +| Convention | Sens | +|---|---| +| `make -plan` | compare le réel à ce que le plan dérive ; **n'écrit rien** | +| `make -appliquer CONFIRMER=true` | réconcilie ; sans `CONFIRMER=true`, refuse | +| `make -verifier` | contrôle ; n'écrit rien (la plupart lisent le dépôt seul) | +| `make -etat`, `-mesurer`, `-recenser` | regarde le réel ; ne corrige rien | +| `DESTRUCTIF` dans l'aide | exige `CONFIRMER=true` **et** le nom de la cible (`INSTANCE=`, `SITE=`) | +| `FORCE=1` | passe outre le diff de `instancier-appliquer` ; première génération seulement | +| `MODE_CHECK=1` | `deployer-tout` en essai à blanc (`--check`) | +| `ARGS="…"` | arguments passés tels quels au script ou au playbook (ex. `ARGS=--check`) | + +`make` seul (ou `make aide`) affiche l'aide détaillée. L'aide de chaque cible (`## …` dans +le `Makefile`) est la source des tableaux ci-dessous ; une preuve exige que chaque cible +publique y figure. + +**Sortie d'Ansible.** Ansible exige une sortie bloquante : depuis un shell non interactif, +toujours `set -o pipefail; make … < /dev/null 2>&1 | cat`. Sans tube, l'échec est silencieux. + +## Variables de `make` + +| Variable | Sens | Cibles | +|---|---|---| +| `HOTE` | une VM, par son nom court | `deployer`, `creer-vm`, `hote-afficher`, … | +| `GROUPE` | un groupe Ansible (= un playbook de `playbooks/groupes/`) | `deployer-groupe`, `appliquer`, `site-appliquer` | +| `TENANT` | le dépôt d'un locataire (`OPS-X`) vu depuis le site | `locataire-creer`, `inseminer`, `placement-plan`, … | +| `INSTANCE` | le nom court d'un écosystème, exigé par les cibles destructives | `raser`, `locataire-raser`, `parefeu-*-flotte` | +| `SITE` | le dépôt d'un site, exigé par `site-raser` | `site-raser` | +| `CONFIRMER` | `true` pour écrire | toute cible `-appliquer` ou destructive | +| `LIMITE` | motif d'hôtes Ansible | `faits`, `verifier-hote` | +| `VERS` | un répertoire de destination (support externe) | `cles-exporter`, `voutes-exporter`, `remise-paquet`, … | +| `DEPOT` | un seul dépôt du génome | `publier`, `genome-pousser` | +| `PARALLELE` | nombre de VM créées à la fois | `flotte-creer`, `locataire-creer` | +| `NOM`, `MODELE`, `INDEX` | nouvel écosystème | `instance-creer`, `instance-utiliser`, `model-creer` | +| `DIALECTE` | CLI du commutateur (`cisco`, `binardat`) | `devis-reseau` | + +## Variables d'environnement + +| Variable | Sens | Défaut | +|---|---|---| +| `SETOPS_INSTANCE` | dépôt du locataire visé | `instance` (le lien) | +| `SETOPS_UNDERLAY` | underlay du site visé | `underlay.yml` (le lien) | +| `SETOPS_INVENTAIRE` | inventaire de l'instance ; exporté par le `Makefile` | `principal`, puis `production` | +| `ANSIBLE_VAULT_IDENTITY_LIST` | les clés de toutes les voûtes ; construit par `scripts/voutes.py` | dérivé de `~/.config/setops-vault-*` | +| `SETOPS_PROXMOX_API` | `hote:port` de l'API Proxmox le temps d'une commande (par un rebond) | l'adresse de la carte | +| `SETOPS_SSH_KEY` | clé SSH vers les nœuds Proxmox | l'agent SSH | +| `SETOPS_MODELES` | dossiers de modèles en plus de `exemples/modeles/` | — | +| `SETOPS_DIALECTE` | CLI du commutateur pour `devis-reseau` | `dialecte` de l'underlay | +| `SETOPS_FORGE_URL` | adresse de la forge pour `forge_cles.py` | — | +| `SETOPS_FORGE_MDP`, `FORGEJO_ADMIN` | mot de passe d'administration de la forge, depuis la voûte, le temps d'une commande | — | + +Viser un autre site ou un autre locataire sans toucher aux liens : + +```bash +SETOPS_UNDERLAY=../SITE-Technolibre/underlay.yml make frontiere-plan +SETOPS_INSTANCE=../OPS-Chezlepro make instancier +``` + +## Flux de travail courants + +```bash +# Modifier l'écosystème +$EDITOR instance/plan/applications.yml +make instancier && make instancier-appliquer && make deployer HOTE= + +# Contrôler une couche d'infrastructure, puis la réconcilier +make frontiere-plan +make frontiere-appliquer CONFIRMER=true + +# Publier le moteur et les plans vers les forges +make publier +make wiki-publier WIKI_REMOTE=.wiki.git +``` + +## Scripts appelés directement + +Les cibles `make` couvrent l'exploitation. Quelques scripts s'utilisent aussi seuls ; chacun +documente ses options (`--help`) dans sa docstring. + +| Script | Usage | +|---|---| +| `scripts/voutes.py etat` | les voûtes et leurs clés, vues par le moteur | +| `scripts/contexte.py` | le contexte actif (site, locataire) et ce que dit chaque indice | +| `scripts/orchestrer.py ordre` | l'ordre de déploiement des groupes | +| `scripts/dnssec.py generer ` | crée la clé DNSSEC d'une zone, dans la voûte du locataire | +| `scripts/vpn_admin.py cle-appareil`, `config` | un appareil dans le tunnel des administrateurs | +| `scripts/dns_bascule.py --serveur ` | le devis de bascule DNS contre un serveur précis | + +## Commandes + +### Vérifier et prouver + +| Commande | Effet | +|---|---| +| `make aide` | Affiche l'aide detaillee du moteur (au-dela de cette liste) | +| `make verifier` | Rejoue les preuves SANS reecrire le rapport (verification rapide) | +| `make prouver` | Execute les preuves et ecrit docs/audit/preuve-.md | +| `make test` | Lance les tests unitaires (derivation de nomenclature et d'inventaire) | +| `make lint` | Passe ansible-lint sur tout le depot | +| `make syntaxe` | Verifie la syntaxe de TOUS les playbooks (modele, hote, groupes, proxmox) | +| `make syntaxe-modele` | Verifie la syntaxe du playbook de preparation du gabarit dore | +| `make syntaxe-verification-modele` | Verifie la syntaxe du playbook de verification du gabarit | +| `make syntaxe-nettoyage` | Verifie la syntaxe du playbook de nettoyage du gabarit | +| `make syntaxe-verification-hote` | Verifie la syntaxe du playbook de verification d'hote | +| `make syntaxe-groupes` | Verifie la syntaxe de TOUS les playbooks de groupe (playbooks/groupes/*.yml) | +| `make syntaxe-proxmox` | Verifie la syntaxe du playbook de clonage de VM | +| `make ci` | Verifie le depot comme la CI : modele public monte a l'ecart, sans toucher ton instance | +| `make inventaire-verifier` | Verifie que l'inventaire se parse (voute dechiffree) | +| `make serveurs-verifier` | Valide le registre des serveurs | +| `make bases-verifier` | Valide le registre des bases de donnees | +| `make domaines-verifier` | Valide le registre des domaines | +| `make applications-verifier` | Valide le registre des applications | +| `make ports-verifier` | Deux roles co-localises revendiquent-ils le meme port ? (lecture seule) | +| `make intrants-verifier` | Tout intrant qu'un role EXIGE est-il fourni par l'instance ? (lecture seule) | +| `make site-verifier` | Verifie que playbooks/site.yml correspond aux couches declarees | +| `make flux-verifier` | Verifie que le registre des flux correspond aux meta/flux.yml des roles | +| `make schema` | Regenere docs/audit/schema-plan.json depuis les registres et les validateurs | +| `make plan-recette` | Regenere docs/audit/plan-de-recette.md depuis le wiki | +| `make sonder` | Sonde une cible et DIT ce qui distingue — CIBLE= [PORTS="22 443"] | +| `make valider` | Passe la recette de validation sur la flotte | + +### Instances et modèles + +| Commande | Effet | +|---|---| +| `make instance-modeles` | Liste les modeles d'ecosysteme disponibles | +| `make instance-creer` | Cree un nouvel ecosysteme depuis un modele — NOM= MODELE= | +| `make instance-utiliser` | Bascule l'instance active (symlink instance/) vers un dossier frere — NOM= | +| `make instance-courante` | Affiche vers quel ecosysteme pointe l'instance active | +| `make instances` | Liste les ecosystemes decouverts (dossiers freres) et signale les collisions d'index | +| `make model-creer` | Cree un modele d'ecosysteme — MODE= NOM= | +| `make genome` | Les depots requis a la reproduction de cet ecosysteme, et leur etat | +| `make genome-inscrire` | Inscrit la parente dans l'instance (instance/parente.yml) | +| `make genome-verifier` | La parente inscrite tient-elle encore ? (code de sortie) | + +### Plan et inventaire + +| Commande | Effet | +|---|---| +| `make config` | Affiche la configuration Proxmox lue par le moteur | +| `make inventaire-ui` | Ouvre la console d'exploitation (GUI web) sur l'inventaire actif | +| `make instancier` | Genere hosts.yml depuis le plan (sans l'appliquer) | +| `make instancier-appliquer` | Applique l'inventaire genere — FORCE=1 pour passer outre le diff | +| `make serveurs` | Liste les serveurs declares au plan | +| `make serveurs-bootstrap` | REPRISE : (re)constitue plan/serveurs.yml depuis un inventaire existant | +| `make bases` | Liste les bases de donnees declarees au plan | +| `make domaines` | Liste les domaines declares au plan | +| `make applications` | Liste les applications declarees au plan | +| `make applications-bootstrap` | Amorce les applications declarees au plan | +| `make hote-afficher` | Affiche tout ce que le plan derive pour un hote — HOTE= | +| `make inventaire` | Verifie l'inventaire et en affiche le graphe (lab puis production) | +| `make inventaire-lister` | Affiche l'inventaire complet (JSON) | +| `make inventaire-graphe` | Affiche le graphe des groupes de l'inventaire | +| `make inventaire-hote` | Affiche les variables derivees d'un hote — HOTE= | +| `make inventaire-lab` | Affiche le graphe de l'inventaire de laboratoire | +| `make inventaire-production` | Affiche le graphe de l'inventaire de production | + +### Gabarit et VM + +| Commande | Effet | +|---|---| +| `make preparer-modele` | Prepare le gabarit dore (VM de reference clonee pour chaque hote) | +| `make verifier-modele` | Verifie le gabarit dore | +| `make nettoyer-modele` | Nettoie le gabarit avant capture — exige CONFIRMER=true | +| `make cloner-vm` | Clone une VM depuis le gabarit dore — HOTE= VMID= | +| `make creer-vm` | Cree une VM et attend qu'elle soit joignable — HOTE= [TENANT=] | +| `make flotte-creer` | Cree les VM manquantes de la flotte depuis le plan — PARALLELE=n | +| `make raser` | DESTRUCTIF : detruit les VM derivees du plan — exige CONFIRMER=true ET INSTANCE= [TENANT=] | +| `make reconstruire` | Reconstruit un ecosysteme depuis zero : VM puis deploiement complet | +| `make myDay` | Alias strict de `reconstruire` (meme cible, memes gardes) | +| `make monter-flotte` | Monte une flotte deja creee : flux, AC et DNS, tout le reste, recette — CONFIRMER=true | +| `make reconstruire-locataire` | Rase et reconstruit un locataire, du site a la recette, etat remis — TENANT=OPS-X CONFIRMER=true | + +### Déployer + +| Commande | Effet | +|---|---| +| `make ansible-runtime` | Prepare le repertoire temporaire local d'Ansible (prerequis interne des cibles qui deploient) | +| `make site` | Regenere playbooks/site.yml depuis les couches et le graphe de dependances | +| `make appliquer` | Applique un groupe a la flotte — GROUPE= | +| `make deployer` | Deploie un hote, couche par couche, dans l'ordre du graphe — HOTE= | +| `make deployer-groupe` | Deploie un seul groupe sur toute la flotte — GROUPE= | +| `make deployer-tout` | Deploie TOUTE la flotte dans l'ordre des couches | +| `make verifier-deploiement` | Verifie l'etat de la flotte apres deploiement | +| `make verifier-hote` | Passe le playbook de verification sur un hote | +| `make faits` | Interroge les faits Ansible de la flotte — LIMITE= | +| `make cacher-paquets` | Tire les paquets NON DEBIAN dans le cache du controleur (a faire en ligne) | + +### Réseau : flux, frontière, SDN, pare-feu + +| Commande | Effet | +|---|---| +| `make flux` | Regenere le registre des flux et les regles nftables depuis les meta/flux.yml | +| `make devis-reseau` | Devis switch (VLANs/SVIs/ACLs) du reseau converge, derive des nomenclatures. DIALECTE=cisco\|binardat | +| `make devis-opnsense` | Devis OPNsense (frontiere nord/sud), derive du registre des flux (pair: externe) | +| `make devis-opnsense-verifier` | Verifie le devis de la frontiere nord/sud (aucune ecriture) | +| `make frontiere-plan` | Ecart entre la frontiere OPNsense et son devis (aucune ecriture) | +| `make frontiere-appliquer` | Reconcilie la frontiere : cree ce qui manque, RETIRE ce qui est perime. CONFIRMER=true | +| `make frontiere-mesurer` | La frontiere refuse-t-elle ce qui n'est pas declare ? (sonde reelle, aucune ecriture) | +| `make devis-proxmox-fw` | Devis pare-feu Proxmox (est-ouest intra-tenant), derive du registre des flux | +| `make devis-proxmox-fw-verifier` | Verifie le devis du pare-feu est-ouest Proxmox (aucune ecriture) | +| `make proxmox-fw-plan` | Ecart entre le pare-feu est-ouest Proxmox et son devis (aucune ecriture) — ARGS="--objets-seulement" ou "--vm " | +| `make proxmox-fw-appliquer` | Reconcilie le pare-feu est-ouest : IPSets, groupes, affectations. CONFIRMER=true | +| `make proxmox-fw-eprouver` | Verifie qu'activer le pare-feu d'UNE VM ne coupe rien (aucune ecriture) — TENANT= HOTE= | +| `make proxmox-fw-activer-vm` | Active le pare-feu d'UNE VM en le prouvant avant/apres — TENANT= HOTE= CONFIRMER=true | +| `make parefeu-verifier-flotte` | La sonde `connectivite` est-elle saine sur chaque VM (prealable a l'activation) — INSTANCE=OPS-X | +| `make parefeu-activer-flotte` | Active le pare-feu Proxmox de toutes les VM, juge par la sonde `connectivite` — INSTANCE=OPS-X CONFIRMER=true | +| `make devis-sdn` | Devis SDN EVPN (zone + VNets + sous-reseaux par tenant), derive du seed | +| `make devis-sdn-verifier` | Verifie le devis SDN EVPN — zones, VNets, sous-reseaux (aucune ecriture) | +| `make sdn-plan` | Ecart entre le SDN EVPN (+ sortie des VRF) et son devis (aucune ecriture) | +| `make sdn-appliquer` | Reconcilie le SDN : cree ce qui manque, RETIRE ce qui est perime. CONFIRMER=true | +| `make devis-proxmox-pools` | Devis des pools Proxmox (un par tenant), derive du plan | +| `make devis-proxmox-pools-verifier` | Verifie le devis des pools Proxmox (aucune ecriture) | +| `make placement-plan` | Le noeud, stockage, pont et gabarit du tenant existent-ils sur ce cluster ? (aucune ecriture) [TENANT=] | +| `make underlay` | Underlay (fabric physique cluster-global : mgmt/iSCSI/Ceph) : affiche + valide (P23) | +| `make underlay-plan` | Confronte l'underlay DECLARE au reel (API du cluster + sonde TCP) — n'ecrit rien | +| `make mtu-mesurer` | L'invite porte-t-il le MTU de sa zone SDN ? (aucune ecriture) | +| `make routes-fabric-etat` | Les hyperviseurs routent-ils toutes les zones du SITE ? — ne corrige rien | +| `make vpn-admin-plan` | Acces WireGuard des admins : ce que la frontiere porte face au plan (aucune ecriture) | +| `make vpn-admin-appliquer` | Pose l'instance et les pairs declares, retire ceux qui ne le sont plus — CONFIRMER=true | + +### Devis de service + +| Commande | Effet | +|---|---| +| `make identite-plan` | Ecart entre l'identite deployee et ce que le plan derive (aucune ecriture) | +| `make certificats-plan` | Ecart entre les certificats sur disque et ceux reellement servis (aucune ecriture) | +| `make expositions-plan` | Chaque exposition du plan repond-elle ? (edge et poste, aucune ecriture) | +| `make expositions-etat` | Chaque exposition est-elle servie sous un certificat qui la porte ? — ne corrige rien | +| `make postgresql-plan` | Chiffrement impose et portee des acces PostgreSQL (aucune ecriture) | +| `make courriel-plan` | Chaine Postfix -> LDAP -> Dovecot -> IMAP (aucune ecriture) | +| `make versions-mesurer` | De combien nos epinglages ont-ils vieilli ? (interroge les amonts, aucune ecriture) | + +### PKI et DNS + +| Commande | Effet | +|---|---| +| `make ca-racine` | Recupere la racine de l'AC interne + son empreinte (a verifier AVANT de l'installer) | +| `make ca-empreinte` | Empreinte de la racine, lue SUR l'AC (le temoin de comparaison) | +| `make dnssec-ds` | DS a remettre au registraire, calcules depuis la voute du locataire (aucune ecriture) | +| `make dnssec-verifier` | Cle en voute pour chaque zone signee, et DS du registre conforme ? (aucune ecriture) | +| `make dns-bascule-devis` | Basculer nos serveurs de noms changerait-il quelque chose ? Plan contre DNS en service (aucune ecriture) | + +### Site et locataires + +| Commande | Effet | +|---|---| +| `make site-intrants` | Les intrants que le SITE monte expose a ses locataires (derives) | +| `make site-intrants-verifier` | Le locataire monte suit-il encore son site ? (aucune ecriture) | +| `make face-reseau-publier` | Chaque locataire publie sa face reseau pour son site (a commiter chez lui, apres `make flux`) | +| `make fiches-site-deposer` | Le site depose chez chacun de ses locataires la fiche qu'il lui destine (a commiter chez eux) | +| `make site-decrire` | Les machines de l'hebergeur declarees dans l'underlay | +| `make site-inventaire` | L'inventaire dynamique du site, tel qu'Ansible le voit | +| `make site-appliquer` | Applique un role aux machines du site — GROUPE= | +| `make site-deployer-tout` | Deploie TOUT le site dans l'ordre des couches — CONFIRMER=true | +| `make site-creer` | Cree les machines du site depuis l'underlay — CONFIRMER=true | +| `make site-raser` | DESTRUCTIF : detruit les VM du SITE — CONFIRMER=true ET SITE= | +| `make locataire-creer` | Le SITE cree les VM d'un locataire d'apres sa face reseau — TENANT= CONFIRMER=true [PARALLELE=n] | +| `make locataire-raser` | DESTRUCTIF : le SITE rase les VM d'un locataire d'apres sa face reseau — TENANT= CONFIRMER=true INSTANCE= [HOTE=h] | +| `make gabarit-etat` | Le gabarit porte-t-il ce que le SITE declare ? — ne corrige rien, regarde | +| `make inseminer` | Le SITE amorce le runner d'un tenant — TENANT= [HOTE=] | +| `make emancipation-prouver` | Prouve qu un lien est coupe — SERVICE= [HOTE=] CONFIRMER=true | + +### Génome, forge, publication + +| Commande | Effet | +|---|---| +| `make publier` | Publie le genome d'un geste : eregion PUIS la forge du site, et le verifie — DEPOT= pour un seul | +| `make genome-pousser` | Le runner du site pousse le genome sur la forge du site — DEPOT= pour un seul | +| `make genome-etat` | Ce que la forge du site porte, face au poste — ne corrige rien, regarde | +| `make forge-amorcer` | Amorce la forge d'un SITE neuf avec le genome — CONFIRMER=true | +| `make forge-cles` | Le site enregistre sur le depot de chaque locataire la cle de lecture que sa face publie — CONFIRMER=true pour ecrire | +| `make forge-comptes` | Les comptes de la forge du site : un par mainteneur (plan du site), et le lecteur de la console — CONFIRMER=true pour ecrire | +| `make forge-etancheite` | La forge du site laisse-t-elle chaque runner lire ses depots, et personne d'autre ? (mesure, aucune ecriture) | +| `make depots-perimes` | Depots qu'un runner ne declare plus : regarde, et retire avec CONFIRMER=true | +| `make wiki-publier` | Publie le wiki (wiki/) vers la forge | +| `make fiches` | Regenere la fiche de chaque role (docs/roles/) — ROLE= pour une seule | + +### Sauvegardes et état + +| Commande | Effet | +|---|---| +| `make sauvegarder-maintenant` | Depose l'etat de chaque noeud TOUT DE SUITE (avant de raser) — HOTE= optionnel | +| `make restauration-etat` | Ce qui attend dans le depot, et ce que chaque jeu est devenu — HOTE= optionnel | +| `make temoins-etat` | L'etat vivant est-il celui d'avant le rasage ? (lecture seule) — HOTE= SOURCE=candidat optionnels | +| `make restauration-renoncer` | Ecarte l'etat anterieur d'un jeu, sans le remettre — HOTE= JEU= CONFIRMER=true | +| `make depot-hors-site` | Copie le depot de sauvegarde du site HORS du site — VERS= | + +### Clés et voûtes + +| Commande | Effet | +|---|---| +| `make cles-recenser` | Montre ce qui n'existe QUE sur ce poste (sans rien ecrire) | +| `make voutes-recenser` | Montre les voutes de ce poste (gitignorees : sur aucune forge), sans rien ecrire | +| `make voutes-exporter` | Sort les voutes (deja chiffrees) vers un support, relues — VERS= NOM= | +| `make cles-exporter` | Sort les cles du poste, chiffrees et relues — VERS= | +| `make cles-compagnons` | Depose le script de restauration sur une cle DEJA faite — VERS= | +| `make cles-restaurer` | Remet les cles en place depuis une archive — ARCHIVE= | + +### Remise au client + +| Commande | Effet | +|---|---| +| `make remise-recenser` | Ce qu'une remise au client emporterait, sans rien ecrire | +| `make remise-paquet` | Temps 1 : fabrique le paquet de remise, chiffre et relu — VERS= | +| `make remise-inscrire` | Inscrit la remise chez le locataire — RECU_PAR="…" COURRIEL="…" [DANS=30] | +| `make remise-verifier` | Etat de la remise : temps 1 fait ? temps 2 du, ou echu ? | +| `make remise-recleer` | Temps 2 : mesure la revocation reelle, puis estampille — CONFIRMER=true | diff --git a/exemples/instance.exemple.yml b/exemples/instance.exemple.yml index 457e31b..b9efa98 100644 --- a/exemples/instance.exemple.yml +++ b/exemples/instance.exemple.yml @@ -5,7 +5,7 @@ # generateur) est generique ; c'est ici qu'on dit "qui on est". A placer dans # inventories//group_vars/all.yml de l'instance. # -# Voir docs/plan-et-generation.md et docs/positionnement.md. +# Voir docs/conception/plan-et-generation.md et docs/projet/positionnement.md. # Domaine DNS interne de l'instance. Les roles en derivent zones, FQDN, base DN # LDAP, expediteurs courriel, etc. (ex. dc=acme,dc=local pour acme.local). diff --git a/playbooks/groupes/serveur_debian.yml b/playbooks/groupes/serveur_debian.yml index aa3ed74..466cfce 100644 --- a/playbooks/groupes/serveur_debian.yml +++ b/playbooks/groupes/serveur_debian.yml @@ -47,7 +47,7 @@ # l'URL absolue, et c'est LUI qui traduit le nom. La machine n'a donc besoin d'aucun # DNS pour installer ses paquets — seulement d'une ADRESSE. # - # C'EST DE LA FILIATION, PAS UNE RUSTINE (docs/filiation-emancipation.md). L'hébergeur + # C'EST DE LA FILIATION, PAS UNE RUSTINE (docs/conception/filiation-emancipation.md). L'hébergeur # nourrit la première machine de son locataire le temps que celui-ci monte son propre # cache. L'emprunt est DÉCLARÉ — l'intrant nomme l'amont — et il s'efface de lui-même : # `client_artefacts` écrit `00-setops-artefacts`, qui trie APRÈS ce fichier-ci, donc diff --git a/playbooks/maintenance/emancipation-prouver.yml b/playbooks/maintenance/emancipation-prouver.yml index 9b6e72a..432d0e3 100644 --- a/playbooks/maintenance/emancipation-prouver.yml +++ b/playbooks/maintenance/emancipation-prouver.yml @@ -1,7 +1,7 @@ --- # PROUVER QU'UN LIEN EST COUPÉ — l'instrument de la quatrième ligne. # -# `docs/filiation-emancipation.md` décrit quatre temps, et n'en outillait que trois : +# `docs/conception/filiation-emancipation.md` décrit quatre temps, et n'en outillait que trois : # # le lien de filiation déclaré au plan le moteur # le constat d'aptitude « tu pourrais » la machine INSTRUIT @@ -79,7 +79,7 @@ SERVICE doit valoir l'un de {{ emancipation_services.keys() | join(', ') }}, et cet écosystème doit DÉCLARER l'amont correspondant. Un emprunt qu'aucune variable ne nomme ne peut pas être prouvé coupé — c'est la forme normée de - `docs/filiation-emancipation.md` qui rend cette preuve possible. + `docs/conception/filiation-emancipation.md` qui rend cette preuve possible. # PAS de `run_once` : l'amont se lit dans les variables de CHAQUE hote. Un # ecosysteme peut tres bien emprunter sur une machine et pas sur une autre — c'est # meme le cas ici, ou seul le porteur du cache chaine vers celui du site. Verifier diff --git a/playbooks/maintenance/forge_cles.yml b/playbooks/maintenance/forge_cles.yml index 7f36396..189fcd8 100644 --- a/playbooks/maintenance/forge_cles.yml +++ b/playbooks/maintenance/forge_cles.yml @@ -1,7 +1,7 @@ --- # LE SITE ENREGISTRE LA CLE DE LECTURE DE CHAQUE LOCATAIRE SUR SON DEPOT (2026-10-11). # -# Voir `docs/depots-prives-conception.md` et `scripts/forge_cles.py`. Le script tourne SUR le +# Voir `docs/conception/depots-prives-conception.md` et `scripts/forge_cles.py`. Le script tourne SUR le # runner du site : il y lit les faces que le site tire (et rien d'autre de ses locataires), et # il y joint la forge. Le mot de passe d'administration vient de la voute du site, par # l'environnement, et n'est jamais affiche. diff --git a/playbooks/maintenance/forge_comptes.yml b/playbooks/maintenance/forge_comptes.yml index 85fa3d2..653d391 100644 --- a/playbooks/maintenance/forge_comptes.yml +++ b/playbooks/maintenance/forge_comptes.yml @@ -1,7 +1,7 @@ --- # LES COMPTES DE LA FORGE DU SITE (2026-10-11, lot 3b). # -# Voir `docs/depots-prives-conception.md` et `scripts/forge_comptes.py`. Le script tourne SUR le +# Voir `docs/conception/depots-prives-conception.md` et `scripts/forge_comptes.py`. Le script tourne SUR le # runner du site : il y lit le plan du site (`mainteneurs`) et les faces de ses locataires, et # il y joint la forge. Le mot de passe d'administration vient de la voute du site, par # l'environnement, et n'est jamais affiche. diff --git a/playbooks/proxmox/README.md b/playbooks/proxmox/README.md index 89a30ec..a18c0b3 100644 --- a/playbooks/proxmox/README.md +++ b/playbooks/proxmox/README.md @@ -46,7 +46,7 @@ instance/inventories/production/group_vars/all/vault.yml `make config` la sème depuis le gabarit et y place le token. Le clonage lit cette voûte unifiée. (`proxmox.vault.yml` n'est plus lue — retirée le 2026-08-03.) Détail des -paramètres : [`docs/config-proxmox.md`](../../docs/config-proxmox.md). +paramètres : [`docs/exploitation/config-proxmox.md`](../../docs/exploitation/config-proxmox.md). Créer un clone Debian depuis le modèle : diff --git a/playbooks/proxmox/cloner_vm_debian.yml b/playbooks/proxmox/cloner_vm_debian.yml index f2aa3b9..ddfa222 100644 --- a/playbooks/proxmox/cloner_vm_debian.yml +++ b/playbooks/proxmox/cloner_vm_debian.yml @@ -30,7 +30,7 @@ # Meme derivation que le fichier ci-dessus : le symlink `underlay.yml` designe deja # l'hebergeur, on n'a rien a redeclarer. Depuis le 2026-08-22 ces secrets ne vivent # plus dans la voute d'un tenant : recopies chez chacun, ils ne pouvaient plus etre - # revoques isolement (docs/frontiere-physique-virtuel.md). + # revoques isolement (docs/conception/frontiere-physique-virtuel.md). setops_voute_underlay: "{{ setops_carte_underlay | realpath | dirname }}/underlay.vault.yml" tasks: @@ -144,7 +144,7 @@ # L'exploitant doit garder son acces a la machine qu'il vient de creer : ecraser sa # cle par celle du runner rendrait le runner seul maitre du terrain, ce qui est # exactement l'inverse de la doctrine (c'est l'humain qui arme, cf. - # docs/filiation-emancipation.md). Deux cles, deux lignes, et cloud-init les pose + # docs/conception/filiation-emancipation.md). Deux cles, deux lignes, et cloud-init les pose # toutes les deux. # # Elle n'arrive ICI que pour le runner d'un tenant : `inventory_host.py` la rend vide diff --git a/promo/histoire.html b/promo/histoire.html index 877f941..26b0132 100644 --- a/promo/histoire.html +++ b/promo/histoire.html @@ -532,7 +532,7 @@ {"hash":"e17ae54fda0884f2b74830bb92d7069dc2c10c59","date":"2026-07-02","subject":"serveur_postfix : résolution du plancher /etc/hosts (native + chroot)"}, {"hash":"5846a08667bfbc712078f3520a9ca08dde56636d","date":"2026-07-02","subject":"serveur_dovecot : remise LMTP fonctionnelle — flux courriel interne prouvé"}, {"hash":"8df1db3b4740ecb1d34082fc13e0cfcd4231c3eb","date":"2026-07-02","subject":"serveur_rspamd (rspamd 3.x) : antispam + DKIM en milter Postfix — prouvé"}, - {"hash":"defe16d1769d17c2d87776f10deef65219c2e35c","date":"2026-07-02","subject":"docs: bilan des pouvoirs de Set-OPS (docs/pouvoirs-set-ops.md)"}, + {"hash":"defe16d1769d17c2d87776f10deef65219c2e35c","date":"2026-07-02","subject":"docs: bilan des pouvoirs de Set-OPS (docs/projet/pouvoirs-set-ops.md)"}, {"hash":"60b7de980f3763489c547a9787230844f35b1b47","date":"2026-07-02","subject":"Licence : CC BY-NC-SA 4.0 → AGPLv3 (verbatim) + modèle libre/services"}, {"hash":"4454e1e18bff73eed1290b5135db4a3fedb23b3c","date":"2026-07-03","subject":"docs: conception des bindings (relations app/base/serveur/domaine)"}, {"hash":"d95b26c2430012f7e665617212cc87e56282a6c1","date":"2026-07-03","subject":"bindings Phase 1 : résolveur de liens dans instancier (relations déclaratives)"}, diff --git a/roles/amorcage_acces/README.md b/roles/amorcage_acces/README.md index db03f4e..d858269 100644 --- a/roles/amorcage_acces/README.md +++ b/roles/amorcage_acces/README.md @@ -6,7 +6,7 @@ seule fois, pour que l'exploitant puisse prendre la main. Puis se retire. ## Ce qu'il ne fait pas Ce n'est **pas** un gestionnaire de comptes. Après son passage, créer, suspendre ou -réaffecter relève d'une personne — pas du dépôt (D-67, `docs/autorisation.md`). +réaffecter relève d'une personne — pas du dépôt (D-67, `docs/exploitation/autorisation.md`). ## Idempotence par existence, pas par conformité @@ -39,6 +39,6 @@ connexion à l'annuaire est dérivée par `resoudre_annuaire`, jamais écrite. ## Après -`docs/autorisation.md` §6 est le runbook de reprise : où administrer quoi, comment se +`docs/exploitation/autorisation.md` §6 est le runbook de reprise : où administrer quoi, comment se rouvrir si on se ferme dehors, et ce qu'il faut régénérer pour que la livraison soit un vrai transfert. diff --git a/roles/amorcage_acces/defaults/main.yml b/roles/amorcage_acces/defaults/main.yml index a24c987..f2ec36f 100644 --- a/roles/amorcage_acces/defaults/main.yml +++ b/roles/amorcage_acces/defaults/main.yml @@ -8,7 +8,7 @@ # promu, deplace — c'est le droit de celui qui exploite. Reconcilier effacerait # le compte cree la veille pour un nouvel employe. # -# Voir docs/autorisation.md (§6 = runbook de reprise). +# Voir docs/exploitation/autorisation.md (§6 = runbook de reprise). amorcage_acces_actif: true diff --git a/roles/amorcage_acces/tasks/main.yml b/roles/amorcage_acces/tasks/main.yml index 6301918..f1885d0 100644 --- a/roles/amorcage_acces/tasks/main.yml +++ b/roles/amorcage_acces/tasks/main.yml @@ -1,6 +1,6 @@ --- # Amorcage des acces — D-67. Voir defaults/main.yml pour la doctrine, et -# docs/autorisation.md §6 pour le runbook de reprise. +# docs/exploitation/autorisation.md §6 pour le runbook de reprise. - name: Résoudre la connexion à l'annuaire ansible.builtin.include_role: @@ -23,7 +23,7 @@ fail_msg: >- `vault_sysadmin_amorcage` et `vault_openldap_admin` sont requis (voûte). Le premier est un jeton d'amorçage à usage unique — pas un mot de passe - permanent : voir docs/autorisation.md §6. + permanent : voir docs/exploitation/autorisation.md §6. when: amorcage_acces_actif | bool # --- LE CŒUR DU RÔLE : on REGARDE avant d'agir -------------------------------- @@ -54,7 +54,7 @@ msg: >- Compte `{{ amorcage_acces_uid }}` déjà présent : Set-OPS n'y touche pas. Les habilitations sont gouvernées par une personne (D-67) — voir - docs/autorisation.md §6. + docs/exploitation/autorisation.md §6. when: - amorcage_acces_actif | bool - amorcage_acces_deja_fait | bool @@ -186,7 +186,7 @@ (amorcage_acces_reset_possible | bool) | ternary('Changement FORCÉ à la première ouverture (ppolicy actif).', 'ATTENTION : rien ne force le changement — l overlay ppolicy n est pas chargé. ' - ~ 'Le changer à la main dès la première connexion (docs/autorisation.md §6).'), + ~ 'Le changer à la main dès la première connexion (docs/exploitation/autorisation.md §6).'), 'À partir d ici, Set-OPS ne touche plus aux habilitations (D-67).' ] }} when: diff --git a/roles/auditd/templates/sonde-audit.sh.j2 b/roles/auditd/templates/sonde-audit.sh.j2 index f074736..dc476a1 100644 --- a/roles/auditd/templates/sonde-audit.sh.j2 +++ b/roles/auditd/templates/sonde-audit.sh.j2 @@ -9,7 +9,7 @@ # dont le demon depend. Une sonde qui aurait compte les regles aurait dit « vert » pendant # toute la panne. On mesure donc la COLLECTE — le service, puis l'ecriture. # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `auditd_sonde_age_max` (le baisser a 1). set -uo pipefail diff --git a/roles/chrony/templates/sonde-horloge.sh.j2 b/roles/chrony/templates/sonde-horloge.sh.j2 index ffc149e..4b0c7ae 100644 --- a/roles/chrony/templates/sonde-horloge.sh.j2 +++ b/roles/chrony/templates/sonde-horloge.sh.j2 @@ -14,7 +14,7 @@ # tombe en panne de l'interieur, avec des symptomes qui ressemblent a tout sauf a une # horloge. # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `chrony_sonde_ecart_max` (le baisser a 0). set -uo pipefail diff --git a/roles/client_artefacts/meta/integration.yml b/roles/client_artefacts/meta/integration.yml index 10fa5bd..91145dd 100644 --- a/roles/client_artefacts/meta/integration.yml +++ b/roles/client_artefacts/meta/integration.yml @@ -1,6 +1,6 @@ --- # Politique d'integration. Voir roles/client_metrique/meta/integration.yml pour le -# raisonnement, et docs/decisions-architecture.md (D-33). +# raisonnement, et docs/projet/decisions-architecture.md (D-33). integration: # DE QUI CETTE INTEGRATION DEPEND, ET POURQUOI L'ORDRE COMPTE. # diff --git a/roles/client_backup/README.md b/roles/client_backup/README.md index f7719a8..046867e 100644 --- a/roles/client_backup/README.md +++ b/roles/client_backup/README.md @@ -58,7 +58,7 @@ Sans eux, le rôle refuse de s'exécuter (assertion). from-zero, déclencher une première sauvegarde plutôt que d'attendre 02:30. - Restauration : **faite par la reconstruction elle-même** depuis le 2026-09-30 — chaque rôle propriétaire inclut `tasks/restaurer.yml` et remet l'état de l'incarnation précédente ; - l'outil de nœud est `setops-restaurer` (cf. `docs/runbooks-exploitation.md` §5.0). + l'outil de nœud est `setops-restaurer` (cf. `docs/exploitation/runbooks-exploitation.md` §5.0). - Témoins : `setops-restaurer temoins` (comparateur `setops-temoins`) confronte l'état vivant à l'instantané d'avant rasage ; `make temoins-etat`, et l'étape `bilan` de la reconstruction. diff --git a/roles/client_backup/meta/flux.yml b/roles/client_backup/meta/flux.yml index ec0fa14..4c49063 100644 --- a/roles/client_backup/meta/flux.yml +++ b/roles/client_backup/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du client de sauvegarde (restic -> dépôt hors-nœud). Voir docs/flux-conception.md. +# Flux réseau du client de sauvegarde (restic -> dépôt hors-nœud). Voir docs/conception/flux-conception.md. flux: - sens: egress port: 22 diff --git a/roles/client_journal/meta/flux.yml b/roles/client_journal/meta/flux.yml index 4836ed6..c5341cb 100644 --- a/roles/client_journal/meta/flux.yml +++ b/roles/client_journal/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du client journal (Alloy -> Loki). Voir docs/flux-conception.md. +# Flux réseau du client journal (Alloy -> Loki). Voir docs/conception/flux-conception.md. flux: - sens: egress port: 3100 diff --git a/roles/client_journal/meta/integration.yml b/roles/client_journal/meta/integration.yml index 99cef6e..aa05b0a 100644 --- a/roles/client_journal/meta/integration.yml +++ b/roles/client_journal/meta/integration.yml @@ -1,6 +1,6 @@ --- # Politique d'integration. Voir roles/client_metrique/meta/integration.yml pour le -# raisonnement, et docs/decisions-architecture.md (D-33). +# raisonnement, et docs/projet/decisions-architecture.md (D-33). integration: # DE QUI CETTE INTEGRATION DEPEND, ET POURQUOI L'ORDRE COMPTE. # diff --git a/roles/client_journal/meta/supervision.yml b/roles/client_journal/meta/supervision.yml index ee28f0f..4d59fd6 100644 --- a/roles/client_journal/meta/supervision.yml +++ b/roles/client_journal/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # CE QUE CETTE SONDE MESURE : les journaux SORTENT-ILS ? Pas « Alloy tourne », pas # « le port de Loki repond » — un connect() ne prouve rien, et cette lecon a deja ete diff --git a/roles/client_journal/tasks/main.yml b/roles/client_journal/tasks/main.yml index 2be1443..e0b8499 100644 --- a/roles/client_journal/tasks/main.yml +++ b/roles/client_journal/tasks/main.yml @@ -312,7 +312,7 @@ enabled: true state: started -# LA SONDE VIT AVEC LE ROLE QU'ELLE MESURE (docs/supervision-conception.md). Le porteur +# LA SONDE VIT AVEC LE ROLE QU'ELLE MESURE (docs/conception/supervision-conception.md). Le porteur # `client_sante` fait tourner tout ce qui vit dans ce repertoire ; il n'a pas a savoir ce # que celle-ci mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/client_journal/templates/sonde-journaux.sh.j2 b/roles/client_journal/templates/sonde-journaux.sh.j2 index 7e69d60..e33f130 100644 --- a/roles/client_journal/templates/sonde-journaux.sh.j2 +++ b/roles/client_journal/templates/sonde-journaux.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « journaux » — les lignes SORTENT-ELLES vers Loki ? # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `client_journal_sonde_url` (port ferme). set -uo pipefail diff --git a/roles/client_metrique/meta/flux.yml b/roles/client_metrique/meta/flux.yml index 8a61866..6dc724e 100644 --- a/roles/client_metrique/meta/flux.yml +++ b/roles/client_metrique/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de node_exporter (propriété du rôle). Voir docs/flux-conception.md. +# Flux réseau de node_exporter (propriété du rôle). Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 9100 diff --git a/roles/client_metrique/meta/integration.yml b/roles/client_metrique/meta/integration.yml index e530ae1..625b4ed 100644 --- a/roles/client_metrique/meta/integration.yml +++ b/roles/client_metrique/meta/integration.yml @@ -1,7 +1,7 @@ --- # Politique d'integration. Declaree ICI, une fois, plutot que recopiee sur chaque # serveur du plan : une ligne recopiee 14 fois n'existe que pour etre oubliee une -# quinzieme. Voir docs/integrations-vm.md et docs/decisions-architecture.md (D-33). +# quinzieme. Voir docs/conception/integrations-vm.md et docs/projet/decisions-architecture.md (D-33). integration: # DE QUI CETTE INTEGRATION DEPEND, ET POURQUOI L'ORDRE COMPTE. # diff --git a/roles/client_metrique/meta/supervision.yml b/roles/client_metrique/meta/supervision.yml index 7bd4d9b..2f6ac01 100644 --- a/roles/client_metrique/meta/supervision.yml +++ b/roles/client_metrique/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # CE QUE CETTE SONDE MESURE. La question utile n'est pas « node_exporter tourne-t-il ? » # — un service actif qui ne rend aucune metrique est vert pour systemd et muet pour diff --git a/roles/client_metrique/tasks/main.yml b/roles/client_metrique/tasks/main.yml index 7391b06..6b602fe 100644 --- a/roles/client_metrique/tasks/main.yml +++ b/roles/client_metrique/tasks/main.yml @@ -122,7 +122,7 @@ enabled: true state: started -# LA SONDE VIT AVEC LE ROLE QU'ELLE MESURE (docs/supervision-conception.md). Le porteur +# LA SONDE VIT AVEC LE ROLE QU'ELLE MESURE (docs/conception/supervision-conception.md). Le porteur # `client_sante` fait tourner tout ce qui vit dans ce repertoire ; il n'a pas a savoir ce # que celle-ci mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/client_metrique/templates/sonde-metriques.sh.j2 b/roles/client_metrique/templates/sonde-metriques.sh.j2 index 13074e4..dc8ed9a 100644 --- a/roles/client_metrique/templates/sonde-metriques.sh.j2 +++ b/roles/client_metrique/templates/sonde-metriques.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « metriques » — cette machine offre-t-elle vraiment ses metriques ? # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `client_metrique_sonde_url` (port ferme, mauvais schema). set -uo pipefail diff --git a/roles/client_pki/defaults/main.yml b/roles/client_pki/defaults/main.yml index 7f7b478..0c3c607 100644 --- a/roles/client_pki/defaults/main.yml +++ b/roles/client_pki/defaults/main.yml @@ -119,7 +119,7 @@ client_pki_reload_services: [] # (~14 min), serre devant la duree de vie (24 h). client_pki_marge_renouvellement: 3600 -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # # LES SEUILS DECOULENT DU MOMENT OU LE RENOUVELLEMENT EST DU — pas d'une intuition. # diff --git a/roles/client_pki/meta/flux.yml b/roles/client_pki/meta/flux.yml index c2a9c5b..126c4ba 100644 --- a/roles/client_pki/meta/flux.yml +++ b/roles/client_pki/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du client PKI (émission ACME + racine step-ca). Voir docs/flux-conception.md. +# Flux réseau du client PKI (émission ACME + racine step-ca). Voir docs/conception/flux-conception.md. flux: - sens: egress port: 8443 diff --git a/roles/client_pki/meta/integration.yml b/roles/client_pki/meta/integration.yml index 599be67..35979a8 100644 --- a/roles/client_pki/meta/integration.yml +++ b/roles/client_pki/meta/integration.yml @@ -1,6 +1,6 @@ --- # Politique d'integration. Voir roles/client_metrique/meta/integration.yml pour le -# raisonnement, et docs/decisions-architecture.md (D-33). +# raisonnement, et docs/projet/decisions-architecture.md (D-33). integration: # DE QUI CETTE INTEGRATION DEPEND, ET POURQUOI L'ORDRE COMPTE. # @@ -15,7 +15,7 @@ integration: universelle: true raison: >- Tout hote fait confiance a l'AC interne et porte un certificat : c'est le - prerequis du chiffrement est-ouest (voir docs/zero-confiance.md). Un hote sans + prerequis du chiffrement est-ouest (voir docs/conception/flux-conception.md, champ `chiffrement`). Un hote sans certificat ne peut ni presenter ni verifier — il retombe en clair en silence. # AUCUNE exemption, et l'autorite non plus. Elle ne s'ENROLE pas aupres d'elle-meme — # sa racine est deja sur son disque — mais elle a besoin de CERTIFICATS comme tout le diff --git a/roles/client_pki/meta/supervision.yml b/roles/client_pki/meta/supervision.yml index e90fc88..69ed440 100644 --- a/roles/client_pki/meta/supervision.yml +++ b/roles/client_pki/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # CE QUE CETTE SONDE MESURE, ET POURQUOI CELA PLUTOT QUE LE RESTE. # diff --git a/roles/client_pki/tasks/main.yml b/roles/client_pki/tasks/main.yml index 3e44891..4760db4 100644 --- a/roles/client_pki/tasks/main.yml +++ b/roles/client_pki/tasks/main.yml @@ -418,7 +418,7 @@ state: started daemon_reload: true -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # # LE ROLE QUI POSSEDE LA VERITE DEPOSE SA PROPRE SONDE. Il connait ses chemins, ses # seuils, son consommateur — le superviseur, lui, ne connait que le verdict. C'est la diff --git a/roles/client_pki/templates/sonde-certificat.sh.j2 b/roles/client_pki/templates/sonde-certificat.sh.j2 index 9fdd0fe..acabbcd 100644 --- a/roles/client_pki/templates/sonde-certificat.sh.j2 +++ b/roles/client_pki/templates/sonde-certificat.sh.j2 @@ -3,7 +3,7 @@ # # SONDE : le certificat d'hote tiendra-t-il jusqu'au prochain renouvellement ? # -# Contrat (docs/supervision-conception.md) : une ligne sur la sortie standard, +# Contrat (docs/conception/supervision-conception.md) : une ligne sur la sortie standard, # 0 = OK, 1 = AVERTISSEMENT, 2 = CRITIQUE. Aucun acces reseau requis — c'est le porteur # (`client_sante`) qui pousse le resultat a Icinga. set -uo pipefail diff --git a/roles/client_resolveur/README.md b/roles/client_resolveur/README.md index d4e854e..6be2cc5 100644 --- a/roles/client_resolveur/README.md +++ b/roles/client_resolveur/README.md @@ -2,7 +2,7 @@ **Résolveur local** par nœud (Unbound) : cache + récursion, avec une **stub-zone** vers l'autoritatif interne (PowerDNS). Rend la résolution *dynamique* sans casser Internet. -Troisième et dernière couche du DNS interne (`docs/dns-interne.md`). +Troisième et dernière couche du DNS interne (`docs/conception/dns-interne.md`). ## Les trois couches 1. `hosts_statiques` — plancher `/etc/hosts`, toujours là, indépendant de tout service ; diff --git a/roles/client_resolveur/meta/flux.yml b/roles/client_resolveur/meta/flux.yml index aa40782..7efacb3 100644 --- a/roles/client_resolveur/meta/flux.yml +++ b/roles/client_resolveur/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du client de résolution. Voir docs/flux-conception.md. +# Flux réseau du client de résolution. Voir docs/conception/flux-conception.md. # # Il n'écoute plus rien : depuis 2026-08-24, le résolveur est un service du tenant et # non un démon local. L'hôte ne fait qu'interroger. diff --git a/roles/client_resolveur/meta/integration.yml b/roles/client_resolveur/meta/integration.yml index 1aafe43..7e7fe3a 100644 --- a/roles/client_resolveur/meta/integration.yml +++ b/roles/client_resolveur/meta/integration.yml @@ -1,6 +1,6 @@ --- # Politique d'integration. Voir roles/client_metrique/meta/integration.yml pour le -# raisonnement, et docs/decisions-architecture.md (D-33). +# raisonnement, et docs/projet/decisions-architecture.md (D-33). integration: # DE QUI CETTE INTEGRATION DEPEND, ET POURQUOI L'ORDRE COMPTE. # diff --git a/roles/client_sante/defaults/main.yml b/roles/client_sante/defaults/main.yml index 367bf51..19d86fd 100644 --- a/roles/client_sante/defaults/main.yml +++ b/roles/client_sante/defaults/main.yml @@ -63,7 +63,7 @@ client_sante_delai_sonde: 20 # CE QUE LE PORTEUR INSTALLE. `curl` pousse le resultat vers l'API d'Icinga ; # `monitoring-plugins-basic` apporte les greffons standard que les roles reutilisent au -# lieu d'ecrire du shell (voir docs/supervision-conception.md). Ils vivent dans +# lieu d'ecrire du shell (voir docs/conception/supervision-conception.md). Ils vivent dans # `/usr/lib/nagios/plugins/`. client_sante_paquets: - curl diff --git a/roles/client_sante/meta/flux.yml b/roles/client_sante/meta/flux.yml index 3da7ca7..d217206 100644 --- a/roles/client_sante/meta/flux.yml +++ b/roles/client_sante/meta/flux.yml @@ -1,6 +1,6 @@ --- # Flux reseau du rapport de sante (resultat passif -> API Icinga). Voir -# docs/flux-conception.md. +# docs/conception/flux-conception.md. flux: - sens: egress port: 5665 diff --git a/roles/client_sante/meta/integration.yml b/roles/client_sante/meta/integration.yml index 5f5fd76..476b8bd 100644 --- a/roles/client_sante/meta/integration.yml +++ b/roles/client_sante/meta/integration.yml @@ -1,6 +1,6 @@ --- # Politique d'integration. Voir roles/client_metrique/meta/integration.yml pour le -# raisonnement, et docs/decisions-architecture.md (D-33). +# raisonnement, et docs/projet/decisions-architecture.md (D-33). integration: # DE QUI CETTE INTEGRATION DEPEND. Le noeud pousse un resultat PASSIF vers Icinga : # sans destinataire, le rapport n'irait nulle part, et un timer qui echoue chaque diff --git a/roles/client_sante/meta/supervision.yml b/roles/client_sante/meta/supervision.yml index f101dfb..214b118 100644 --- a/roles/client_sante/meta/supervision.yml +++ b/roles/client_sante/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # `client_sante` EXECUTE les sondes de tous les roles ; il en DECLARE une a lui (2026-09-28). # diff --git a/roles/client_sante/tasks/main.yml b/roles/client_sante/tasks/main.yml index 7b9976c..368838a 100644 --- a/roles/client_sante/tasks/main.yml +++ b/roles/client_sante/tasks/main.yml @@ -72,7 +72,7 @@ # LES GREFFONS STANDARD, POSES PAR LE PORTEUR ET PAS PAR CHAQUE ROLE (2026-09-14). # -# `docs/supervision-conception.md` dit qu'un greffon Nagios EST une sonde valide, « sans +# `docs/conception/supervision-conception.md` dit qu'un greffon Nagios EST une sonde valide, « sans # la moindre colle », et compte sur les 54 que fournit `monitoring-plugins`. Mesure du # 2026-09-14 sur la flotte : **aucun n'etait installe**. Le document decrivait une # possibilite qui n'existait pas — et chaque role qui avait besoin d'un controle HTTP diff --git a/roles/client_sante/templates/setops-sante.sh.j2 b/roles/client_sante/templates/setops-sante.sh.j2 index ea792d6..cb9fb07 100644 --- a/roles/client_sante/templates/setops-sante.sh.j2 +++ b/roles/client_sante/templates/setops-sante.sh.j2 @@ -103,7 +103,7 @@ echecs=("${restantes[@]}") # Chaque role depose SA sonde dans ce repertoire ; le porteur ne sait pas ce qu'elles # mesurent, et c'est le but : ajouter une sonde n'oblige pas a toucher a ce script. # Contrat : une ligne sur stdout, 0/1/2 en code de sortie -# (docs/supervision-conception.md). +# (docs/conception/supervision-conception.md). # # UNE SONDE QUI JETTE N'EST PAS UNE SONDE VERTE. Sans ce traitement, un script casse # sortirait en 127 et Icinga recevrait un code hors bornes — ou rien. On rapporte donc diff --git a/roles/client_sante/templates/sonde-disque.sh.j2 b/roles/client_sante/templates/sonde-disque.sh.j2 index cc15b2d..54da0b3 100644 --- a/roles/client_sante/templates/sonde-disque.sh.j2 +++ b/roles/client_sante/templates/sonde-disque.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « disque » — reste-t-il de la place, et des inodes, sur chaque systeme de fichiers ? # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Seuils : `client_sante_disque_avert` / `client_sante_disque_crit` (pourcentage utilise), # les memes pour l'espace et pour les inodes. # diff --git a/roles/client_smtp/meta/flux.yml b/roles/client_smtp/meta/flux.yml index 4e2b18d..f67f8e8 100644 --- a/roles/client_smtp/meta/flux.yml +++ b/roles/client_smtp/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du client SMTP (relais des notifications locales). Voir docs/flux-conception.md. +# Flux réseau du client SMTP (relais des notifications locales). Voir docs/conception/flux-conception.md. flux: - sens: egress port: 25 diff --git a/roles/common_packages/templates/sonde-correctifs.sh.j2 b/roles/common_packages/templates/sonde-correctifs.sh.j2 index 2a4d59a..61739bf 100644 --- a/roles/common_packages/templates/sonde-correctifs.sh.j2 +++ b/roles/common_packages/templates/sonde-correctifs.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « correctifs » — des correctifs de securite attendent-ils, et depuis quand ? # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `common_packages_sonde_seuil_heures` (mettre 0). set -uo pipefail diff --git a/roles/hosts_statiques/README.md b/roles/hosts_statiques/README.md index 2047ce6..9ba16dd 100644 --- a/roles/hosts_statiques/README.md +++ b/roles/hosts_statiques/README.md @@ -18,7 +18,7 @@ C'est ce qui rend l'**ordre de reconstruction** possible : appliqué dans la cou déploiement d'une instance neuve. Les trois couches de résolution : ce plancher → PowerDNS autoritatif → Unbound local -(`client_resolveur`, opt-in). Cf. `docs/dns-interne.md`. +(`client_resolveur`, opt-in). Cf. `docs/conception/dns-interne.md`. ## Variables | Variable | Défaut | Rôle | diff --git a/roles/nftables_baseline/templates/sonde-connectivite.sh.j2 b/roles/nftables_baseline/templates/sonde-connectivite.sh.j2 index 767aea4..6772627 100644 --- a/roles/nftables_baseline/templates/sonde-connectivite.sh.j2 +++ b/roles/nftables_baseline/templates/sonde-connectivite.sh.j2 @@ -40,7 +40,7 @@ # machine et sa passerelle, aucun relais. Ouvert -> CRITIQUE ; refuse, rejete, delai -> attendu. # Passerelle introuvable -> AVERTISSEMENT : une garde qui ne s'exerce pas doit le dire. # -# Contrat : une ligne, code 0/1/2 (docs/supervision-conception.md). +# Contrat : une ligne, code 0/1/2 (docs/conception/supervision-conception.md). # `CONNECTIVITE_JSON=` impose une autre liste : c'est le controle negatif. # `CONNECTIVITE_PASSERELLE=` vise une autre « passerelle » : le controle negatif de la # garde (une adresse dont un port interdit repond doit la faire crier). diff --git a/roles/resoudre_base/README.md b/roles/resoudre_base/README.md index c2009c3..c24fb27 100644 --- a/roles/resoudre_base/README.md +++ b/roles/resoudre_base/README.md @@ -5,7 +5,7 @@ consommateur depuis le registre partagé `instance/plan/bases-donnees.yml`. C'est la moitié « **binding app→base** » de la conception des liaisons — le lien est déclaré **côté base** (le registre nomme son `consommateur`), et résolu **dans le rôle consommateur**, -pour que le secret ne quitte jamais ce rôle. Cf. `docs/bindings-conception.md` §5. +pour que le secret ne quitte jamais ce rôle. Cf. `docs/conception/bindings-conception.md` §5. ## Usage ```yaml diff --git a/roles/serveur_artefacts/defaults/main.yml b/roles/serveur_artefacts/defaults/main.yml index f31112d..cf146e5 100644 --- a/roles/serveur_artefacts/defaults/main.yml +++ b/roles/serveur_artefacts/defaults/main.yml @@ -61,12 +61,12 @@ serveur_artefacts_journal: "/var/log/apt-cacher-ng" # quelle machine installe quoi. # # Vide = ce cache va directement à l'amont Debian. C'est le cas du cache du SITE lui-même, -# et de tout écosystème qui s'est émancipé (docs/filiation-emancipation.md). +# et de tout écosystème qui s'est émancipé (docs/conception/filiation-emancipation.md). serveur_artefacts_amont: "" # --- Sonde de supervision ----------------------------------------------------------- # La cible et les seuils sont des VARIABLES pour que la sonde puisse etre mise en defaut -# sans casser le service (docs/supervision-conception.md). +# sans casser le service (docs/conception/supervision-conception.md). serveur_artefacts_sonde_port: "{{ serveur_artefacts_port }}" serveur_artefacts_sonde_repertoire: /var/cache/apt-cacher-ng # Un cache plein ne se plaint pas : il cesse simplement de servir ce qu'il n'a pas pu diff --git a/roles/serveur_artefacts/meta/authentification.yml b/roles/serveur_artefacts/meta/authentification.yml index b64ecca..80fef59 100644 --- a/roles/serveur_artefacts/meta/authentification.yml +++ b/roles/serveur_artefacts/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29. +# Voir docs/conception/authentification.md. Gardee par la preuve P29. authentification: portee: sans-auth-humaine mecanisme: aucun diff --git a/roles/serveur_artefacts/meta/flux.yml b/roles/serveur_artefacts/meta/flux.yml index 7c342cb..475c668 100644 --- a/roles/serveur_artefacts/meta/flux.yml +++ b/roles/serveur_artefacts/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de la source d'artefacts. Voir docs/flux-conception.md. +# Flux réseau de la source d'artefacts. Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 3142 diff --git a/roles/serveur_artefacts/meta/supervision.yml b/roles/serveur_artefacts/meta/supervision.yml index 284b809..050d141 100644 --- a/roles/serveur_artefacts/meta/supervision.yml +++ b/roles/serveur_artefacts/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: cache-apt metier: paquets diff --git a/roles/serveur_artefacts/tasks/main.yml b/roles/serveur_artefacts/tasks/main.yml index 8a8ae04..5233127 100644 --- a/roles/serveur_artefacts/tasks/main.yml +++ b/roles/serveur_artefacts/tasks/main.yml @@ -84,7 +84,7 @@ deploiement ne pourrait plus atteindre la couche qui le corrigerait. Verifier que la machine d'amont tourne, ou vider `serveur_artefacts_amont` pour aller directement chez Debian (c'est une emancipation : voir - docs/filiation-emancipation.md). + docs/conception/filiation-emancipation.md). success_msg: "Amont {{ serveur_artefacts_amont }} joignable." when: - serveur_artefacts_amont | length > 0 @@ -151,7 +151,7 @@ timeout: 30 when: not ansible_check_mode -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_artefacts/templates/sonde-cache-apt-volume.sh.j2 b/roles/serveur_artefacts/templates/sonde-cache-apt-volume.sh.j2 index 1c6d275..d625f50 100644 --- a/roles/serveur_artefacts/templates/sonde-cache-apt-volume.sh.j2 +++ b/roles/serveur_artefacts/templates/sonde-cache-apt-volume.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « cache-apt-volume » — reste-t-il de la place au cache ? # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_artefacts_sonde_pct_avert` / `_pct_crit`. # # SEPAREE DE LA DISPONIBILITE (2026-09-10) : ce verdict-ci appelle un billet, pas un diff --git a/roles/serveur_artefacts/templates/sonde-cache-apt.sh.j2 b/roles/serveur_artefacts/templates/sonde-cache-apt.sh.j2 index 17ae8c8..1c82bf6 100644 --- a/roles/serveur_artefacts/templates/sonde-cache-apt.sh.j2 +++ b/roles/serveur_artefacts/templates/sonde-cache-apt.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « cache-apt » — le cache repond-il ? # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_artefacts_sonde_port` (port ferme). # # ELLE NE MESURE PLUS LE VOLUME, ET C'EST LE POINT (2026-09-10). Les deux etaient fondus diff --git a/roles/serveur_backup/meta/authentification.yml b/roles/serveur_backup/meta/authentification.yml index 2dd1f94..a82f25e 100644 --- a/roles/serveur_backup/meta/authentification.yml +++ b/roles/serveur_backup/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: sans-auth-humaine diff --git a/roles/serveur_backup/meta/flux.yml b/roles/serveur_backup/meta/flux.yml index 5d3013d..da6545e 100644 --- a/roles/serveur_backup/meta/flux.yml +++ b/roles/serveur_backup/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du dépôt de sauvegarde restic (hors-nœud). Voir docs/flux-conception.md. +# Flux réseau du dépôt de sauvegarde restic (hors-nœud). Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 22 diff --git a/roles/serveur_backup/meta/supervision.yml b/roles/serveur_backup/meta/supervision.yml index a6382fe..5c58797 100644 --- a/roles/serveur_backup/meta/supervision.yml +++ b/roles/serveur_backup/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # UNE SEULE SONDE, ET ELLE NE JUGE RIEN DU CONTENU. # diff --git a/roles/serveur_backup/templates/sonde-depot.sh.j2 b/roles/serveur_backup/templates/sonde-depot.sh.j2 index 9ea3c84..4784806 100644 --- a/roles/serveur_backup/templates/sonde-depot.sh.j2 +++ b/roles/serveur_backup/templates/sonde-depot.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « depot » — le depot accepte-t-il encore qu'on y depose ? # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_backup_sonde_racine` (chemin non inscriptible). # # CE QU'ELLE NE MESURE PAS, ET C'EST LA DOCTRINE LA PLUS STRICTE DE CE DEPOT. diff --git a/roles/serveur_backup_site/meta/authentification.yml b/roles/serveur_backup_site/meta/authentification.yml index 802fe4f..721df04 100644 --- a/roles/serveur_backup_site/meta/authentification.yml +++ b/roles/serveur_backup_site/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29. +# Voir docs/conception/authentification.md. Gardee par la preuve P29. authentification: portee: sans-auth-humaine mecanisme: cle-ssh diff --git a/roles/serveur_backup_site/meta/flux.yml b/roles/serveur_backup_site/meta/flux.yml index 907a916..509ad10 100644 --- a/roles/serveur_backup_site/meta/flux.yml +++ b/roles/serveur_backup_site/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du DÉPÔT DE SAUVEGARDE DU SITE. Voir docs/flux-conception.md. +# Flux réseau du DÉPÔT DE SAUVEGARDE DU SITE. Voir docs/conception/flux-conception.md. # # QUATRIÈME SERVICE QUE LE SITE PRÊTE À SES LOCATAIRES — après les paquets # (`serveur_cache_site`), le génome (`serveur_forge_site`) et les noms diff --git a/roles/serveur_backup_site/meta/supervision.yml b/roles/serveur_backup_site/meta/supervision.yml index b30bd36..fefa26c 100644 --- a/roles/serveur_backup_site/meta/supervision.yml +++ b/roles/serveur_backup_site/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # CE QUE `serveur_backup` SURVEILLE DEJA : `depot` — le depot accepte-t-il vraiment une # ecriture ? Vrai pour n'importe quel depot restic. diff --git a/roles/serveur_cache_site/meta/authentification.yml b/roles/serveur_cache_site/meta/authentification.yml index f40bf65..00b4417 100644 --- a/roles/serveur_cache_site/meta/authentification.yml +++ b/roles/serveur_cache_site/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29. +# Voir docs/conception/authentification.md. Gardee par la preuve P29. authentification: portee: sans-auth-humaine mecanisme: aucun diff --git a/roles/serveur_cache_site/meta/flux.yml b/roles/serveur_cache_site/meta/flux.yml index bfafdef..9db6939 100644 --- a/roles/serveur_cache_site/meta/flux.yml +++ b/roles/serveur_cache_site/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du cache d'artefacts DU SITE. Voir docs/flux-conception.md. +# Flux réseau du cache d'artefacts DU SITE. Voir docs/conception/flux-conception.md. # # UN SEUL FLUX, et c'est tout son sens : accepter les caches des écosystèmes voisins. # `serveur_artefacts` porte le reste (servir sa propre flotte, remplir depuis Debian). diff --git a/roles/serveur_cache_site/meta/supervision.yml b/roles/serveur_cache_site/meta/supervision.yml index f95b0f9..ce886c5 100644 --- a/roles/serveur_cache_site/meta/supervision.yml +++ b/roles/serveur_cache_site/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # CE QUE `serveur_artefacts` SURVEILLE DEJA, ET QU'ON NE REFAIT PAS : `cache-apt` (le # cache repond sur son port) et `cache-apt-volume` (il lui reste de la place). Ces deux diff --git a/roles/serveur_collabora/meta/authentification.yml b/roles/serveur_collabora/meta/authentification.yml index 7908e1b..22d6c4e 100644 --- a/roles/serveur_collabora/meta/authentification.yml +++ b/roles/serveur_collabora/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: sans-auth-humaine diff --git a/roles/serveur_collabora/meta/flux.yml b/roles/serveur_collabora/meta/flux.yml index e88a72c..abb65e5 100644 --- a/roles/serveur_collabora/meta/flux.yml +++ b/roles/serveur_collabora/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de Collabora Online (propriété du rôle). Voir docs/flux-conception.md. +# Flux réseau de Collabora Online (propriété du rôle). Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 9980 diff --git a/roles/serveur_collabora/meta/supervision.yml b/roles/serveur_collabora/meta/supervision.yml index 2e10cbc..1f59df8 100644 --- a/roles/serveur_collabora/meta/supervision.yml +++ b/roles/serveur_collabora/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # UNE SEULE SONDE, une seule CAUSE D'ACTION : aller voir collabora. # diff --git a/roles/serveur_collabora/templates/sonde-edition.sh.j2 b/roles/serveur_collabora/templates/sonde-edition.sh.j2 index fafbbfa..238fb4f 100644 --- a/roles/serveur_collabora/templates/sonde-edition.sh.j2 +++ b/roles/serveur_collabora/templates/sonde-edition.sh.j2 @@ -7,7 +7,7 @@ # `monitoring-plugins` : il parle deja l'API des greffons Nagios, gere les delais, les # redirections et vingt ans de cas limites. On lui passe l'adresse et ce qu'on attend, et # on rend SON code de sortie tel quel. Ecrire du shell ici serait se donner du code a -# maintenir et se priver de tout ca — voir docs/supervision-conception.md. +# maintenir et se priver de tout ca — voir docs/conception/supervision-conception.md. # # `/hosting/discovery` n'est pas une page de complaisance : c'est l'adresse que Nextcloud # interroge LUI-MEME pour savoir quels documents Collabora sait ouvrir. Si elle ne repond diff --git a/roles/serveur_debian/meta/authentification.yml b/roles/serveur_debian/meta/authentification.yml index 48b6fb7..adbdad5 100644 --- a/roles/serveur_debian/meta/authentification.yml +++ b/roles/serveur_debian/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: sans-auth-humaine diff --git a/roles/serveur_debian/meta/flux.yml b/roles/serveur_debian/meta/flux.yml index 29fd782..c27e242 100644 --- a/roles/serveur_debian/meta/flux.yml +++ b/roles/serveur_debian/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du socle Debian : le plan de gestion (SSH). Voir docs/flux-conception.md. +# Flux réseau du socle Debian : le plan de gestion (SSH). Voir docs/conception/flux-conception.md. # CRITIQUE : sans cette règle, les nftables générés couperaient l'accès Ansible/SSH. flux: - sens: ingress diff --git a/roles/serveur_debian/meta/supervision.yml b/roles/serveur_debian/meta/supervision.yml index b9f327a..8fb2deb 100644 --- a/roles/serveur_debian/meta/supervision.yml +++ b/roles/serveur_debian/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # CE QUE CETTE SONDE MESURE, ET POURQUOI ELLE MANQUAIT. # diff --git a/roles/serveur_dns_public/README.md b/roles/serveur_dns_public/README.md index de15490..647ccb5 100644 --- a/roles/serveur_dns_public/README.md +++ b/roles/serveur_dns_public/README.md @@ -58,7 +58,7 @@ Au site de TechnoLibre, il arrive par le relais et le tunnel `opt9` de `requin`. `dns_public_pairs` (plan du site, déclaré des deux côtés) fait de chaque site le second serveur de noms de l'autre. Chaque zone désigne les deux (`dns1.chezlepro.ca`, -`dns1.technolibre.ca`). Schémas, flux et ordre de bascule : `docs/dns-interne.md`, section +`dns1.technolibre.ca`). Schémas, flux et ordre de bascule : `docs/conception/dns-interne.md`, section « Deux sites, deux serveurs de noms ». ## Le frontal public : dnsdist (2026-09-16, phase 2) diff --git a/roles/serveur_dns_public/meta/authentification.yml b/roles/serveur_dns_public/meta/authentification.yml index 6ef2ebb..f80d215 100644 --- a/roles/serveur_dns_public/meta/authentification.yml +++ b/roles/serveur_dns_public/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29. +# Voir docs/conception/authentification.md. Gardee par la preuve P29. authentification: portee: sans-auth-humaine raison: >- diff --git a/roles/serveur_dns_public/meta/flux.yml b/roles/serveur_dns_public/meta/flux.yml index 699a297..a484ba5 100644 --- a/roles/serveur_dns_public/meta/flux.yml +++ b/roles/serveur_dns_public/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux reseau du serveur DNS public du site. Voir docs/flux-conception.md. +# Flux reseau du serveur DNS public du site. Voir docs/conception/flux-conception.md. # # PHASE 2 (2026-09-16) : L'INTERNET ENTRE, ET SEULEMENT PAR LE FRONTAL. Declare APRES que # toutes les zones sont signees DNSSEC (P82 le refuse sinon) et que dnsdist borne le debit. diff --git a/roles/serveur_dns_public/meta/supervision.yml b/roles/serveur_dns_public/meta/supervision.yml index c85fbd6..5114930 100644 --- a/roles/serveur_dns_public/meta/supervision.yml +++ b/roles/serveur_dns_public/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: zones-publiques metier: noms_publics diff --git a/roles/serveur_dns_public/tasks/main.yml b/roles/serveur_dns_public/tasks/main.yml index 4170621..4f791fa 100644 --- a/roles/serveur_dns_public/tasks/main.yml +++ b/roles/serveur_dns_public/tasks/main.yml @@ -195,7 +195,7 @@ state: started when: not ansible_check_mode -# --- SONDE (docs/supervision-conception.md) ------------------------------------------- +# --- SONDE (docs/conception/supervision-conception.md) ------------------------------------------- - name: Assurer le répertoire des sondes de supervision ansible.builtin.file: path: /usr/local/lib/setops/sondes diff --git a/roles/serveur_dns_public/templates/sonde-zones-publiques.sh.j2 b/roles/serveur_dns_public/templates/sonde-zones-publiques.sh.j2 index ce0c0fe..72a56f9 100644 --- a/roles/serveur_dns_public/templates/sonde-zones-publiques.sh.j2 +++ b/roles/serveur_dns_public/templates/sonde-zones-publiques.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « zones-publiques » — le serveur public sert-il TOUTES les zones qu'il doit servir ? # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_dns_public_sonde_attendu` (seuil impossible). set -uo pipefail diff --git a/roles/serveur_dovecot/README.md b/roles/serveur_dovecot/README.md index 97896ef..9549722 100644 --- a/roles/serveur_dovecot/README.md +++ b/roles/serveur_dovecot/README.md @@ -2,7 +2,7 @@ **Mailstore** : Dovecot 2.4 (Debian 13) — IMAP pour les utilisateurs, LMTP pour la remise depuis Postfix, authentification et résolution des comptes sur l'annuaire OpenLDAP. -Stockage **Maildir** de boîtes virtuelles. Cf. `docs/courriel-conception.md`. +Stockage **Maildir** de boîtes virtuelles. Cf. `docs/conception/courriel-conception.md`. ## Rôle - Installe `dovecot-core`, `-imapd`, `-lmtpd`, `-ldap`. diff --git a/roles/serveur_dovecot/defaults/main.yml b/roles/serveur_dovecot/defaults/main.yml index c162a34..bc1ed2d 100644 --- a/roles/serveur_dovecot/defaults/main.yml +++ b/roles/serveur_dovecot/defaults/main.yml @@ -1,6 +1,6 @@ --- # Dovecot 2.4 (Debian 13) — IMAP + LMTP + auth LDAP, stockage Maildir des boîtes virtuelles. -# Config par drop-in conf.d/99-setops.conf (syntaxe 2.4). Cf. docs/courriel-conception.md. +# Config par drop-in conf.d/99-setops.conf (syntaxe 2.4). Cf. docs/conception/courriel-conception.md. serveur_dovecot_paquets: - dovecot-core diff --git a/roles/serveur_dovecot/meta/authentification.yml b/roles/serveur_dovecot/meta/authentification.yml index ba91994..9f73f99 100644 --- a/roles/serveur_dovecot/meta/authentification.yml +++ b/roles/serveur_dovecot/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: ldap-direct diff --git a/roles/serveur_dovecot/meta/flux.yml b/roles/serveur_dovecot/meta/flux.yml index 84cca81..624aaaf 100644 --- a/roles/serveur_dovecot/meta/flux.yml +++ b/roles/serveur_dovecot/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de Dovecot (IMAP + LMTP, mailstore). Voir docs/flux-conception.md. +# Flux réseau de Dovecot (IMAP + LMTP, mailstore). Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 24 diff --git a/roles/serveur_dovecot/meta/supervision.yml b/roles/serveur_dovecot/meta/supervision.yml index 382e086..7f2b087 100644 --- a/roles/serveur_dovecot/meta/supervision.yml +++ b/roles/serveur_dovecot/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: boites metier: courriel diff --git a/roles/serveur_dovecot/tasks/main.yml b/roles/serveur_dovecot/tasks/main.yml index 28b4877..20ace1f 100644 --- a/roles/serveur_dovecot/tasks/main.yml +++ b/roles/serveur_dovecot/tasks/main.yml @@ -206,7 +206,7 @@ state: started daemon_reload: true -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_dovecot/templates/sonde-boites.sh.j2 b/roles/serveur_dovecot/templates/sonde-boites.sh.j2 index ec85395..838b630 100644 --- a/roles/serveur_dovecot/templates/sonde-boites.sh.j2 +++ b/roles/serveur_dovecot/templates/sonde-boites.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « boites » — Dovecot repond et trouve un compte dans l'annuaire # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_dovecot_sonde_utilisateur` (compte inexistant). set -uo pipefail diff --git a/roles/serveur_durci/meta/authentification.yml b/roles/serveur_durci/meta/authentification.yml index 9af0c16..290957f 100644 --- a/roles/serveur_durci/meta/authentification.yml +++ b/roles/serveur_durci/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: sans-auth-humaine diff --git a/roles/serveur_durci/meta/supervision.yml b/roles/serveur_durci/meta/supervision.yml index 2d1c941..fe25a7c 100644 --- a/roles/serveur_durci/meta/supervision.yml +++ b/roles/serveur_durci/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du groupe. Voir docs/supervision-conception.md. +# Supervision derivee du groupe. Voir docs/conception/supervision-conception.md. # # POURQUOI CETTE SONDE EXISTE, ET CE QU'ELLE NE MESURE PAS. # diff --git a/roles/serveur_forge_site/defaults/main.yml b/roles/serveur_forge_site/defaults/main.yml index a059010..7c10ae1 100644 --- a/roles/serveur_forge_site/defaults/main.yml +++ b/roles/serveur_forge_site/defaults/main.yml @@ -14,7 +14,7 @@ serveur_forge_site_organisation: "genome" # COMBIEN DE DEPOTS PUBLICS AU MINIMUM. La sonde lit l'API SANS identifiant : elle voit ce # qu'un ecosysteme neuf peut cloner sans rien detenir. Depuis le 2026-10-11, la carte du -# site et les plans des locataires sont PRIVES (`docs/depots-prives-conception.md`) : il +# site et les plans des locataires sont PRIVES (`docs/conception/depots-prives-conception.md`) : il # reste au moins le moteur. Les depots prives se surveillent ailleurs — `make genome-etat`, # `make forge-cles`, et chaque runner qui les tire. On ne fixe pas un compte exact : le # nombre de depots change, la sonde ne doit pas changer avec. diff --git a/roles/serveur_forge_site/meta/authentification.yml b/roles/serveur_forge_site/meta/authentification.yml index 1d266c4..7b4d5fe 100644 --- a/roles/serveur_forge_site/meta/authentification.yml +++ b/roles/serveur_forge_site/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29. +# Voir docs/conception/authentification.md. Gardee par la preuve P29. authentification: portee: sans-auth-humaine mecanisme: aucun diff --git a/roles/serveur_forge_site/meta/flux.yml b/roles/serveur_forge_site/meta/flux.yml index 9c56ff9..f51d7bf 100644 --- a/roles/serveur_forge_site/meta/flux.yml +++ b/roles/serveur_forge_site/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de la FORGE DU GÉNOME DU SITE. Voir docs/flux-conception.md. +# Flux réseau de la FORGE DU GÉNOME DU SITE. Voir docs/conception/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). @@ -41,7 +41,7 @@ flux: partage: true # LA LECTURE DE SON DEPOT PAR LE RUNNER D'UN LOCATAIRE (2026-10-11, - # `docs/depots-prives-conception.md`). Les depots des locataires deviennent prives : chacun + # `docs/conception/depots-prives-conception.md`). Les depots des locataires deviennent prives : chacun # se lit avec une cle de deploiement en lecture seule, et une cle de deploiement ne passe # que par SSH. `runners_locataires` : les seuls runners, lus dans les faces publiees — pas # les supernets. L'utilisateur `git` de ce `sshd` est contraint par la forge : la cle n'y diff --git a/roles/serveur_forge_site/meta/supervision.yml b/roles/serveur_forge_site/meta/supervision.yml index bed0aea..f749243 100644 --- a/roles/serveur_forge_site/meta/supervision.yml +++ b/roles/serveur_forge_site/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # CE QUE `serveur_forgejo` SURVEILLE DEJA : la sonde `forge` — « la forge repond-elle a # son API, et son depot Git est-il lisible ? ». Vrai pour n'importe quelle forge. diff --git a/roles/serveur_forgejo/README.md b/roles/serveur_forgejo/README.md index cbfc635..a689f5c 100644 --- a/roles/serveur_forgejo/README.md +++ b/roles/serveur_forgejo/README.md @@ -47,7 +47,7 @@ Le ciel nocturne ne s'applique qu'aux thèmes **sombres** (`theme-forgejo-dark`, `theme-forgejo-auto`) pour ne pas casser le thème clair. Pour une forge **hors flotte** (instance Forgejo non gérée par Set-OPS), la pose manuelle -des mêmes fichiers est décrite dans [`docs/theme-forgejo-hors-flotte.md`](../../docs/theme-forgejo-hors-flotte.md). +des mêmes fichiers est décrite dans [`docs/exploitation/theme-forgejo-hors-flotte.md`](../../docs/exploitation/theme-forgejo-hors-flotte.md). ## Notes / limites - **Version** à confirmer sur forgejo.org/download ; l'URL suit le motif officiel des releases. diff --git a/roles/serveur_forgejo/defaults/main.yml b/roles/serveur_forgejo/defaults/main.yml index 5c5bce4..dccd52f 100644 --- a/roles/serveur_forgejo/defaults/main.yml +++ b/roles/serveur_forgejo/defaults/main.yml @@ -68,7 +68,7 @@ serveur_forgejo_admin_password: "{{ vault_forgejo_admin | default('') }}" # rem # --- Connexion locale (accès de secours) --- # `false` = le formulaire identifiant/mot de passe n'est PAS proposé au repos ; le SSO # Keycloak est le seul chemin annoncé. Le compte local continue d'exister : on l'atteint -# par `sudo` sur l'hôte (voir docs/authentification.md), qui est le mécanisme de secours +# par `sudo` sur l'hôte (voir docs/conception/authentification.md), qui est le mécanisme de secours # retenu. Une porte de connexion ouverte en permanence contournerait la politique de mot # de passe, le MFA et surtout la révocation centrale — désactiver quelqu'un dans LDAP # laisserait le compte local valide, sans que rien ne le signale. @@ -139,7 +139,7 @@ serveur_forgejo_db_sslrootcert: "/etc/step/certs/root_ca.crt" # secours — ce que `meta/acces.yml` signalait comme `porte_par: aucun`. # # Le claim `groups` est celui que Keycloak emet pour les groupes projetes depuis -# LDAP (group-ldap-mapper). Voir docs/autorisation.md. +# LDAP (group-ldap-mapper). Voir docs/exploitation/autorisation.md. serveur_forgejo_oidc_groupe_claim: "groups" serveur_forgejo_oidc_groupe_admin: "sysadmin" diff --git a/roles/serveur_forgejo/meta/acces.yml b/roles/serveur_forgejo/meta/acces.yml index e9191a3..bddf8a0 100644 --- a/roles/serveur_forgejo/meta/acces.yml +++ b/roles/serveur_forgejo/meta/acces.yml @@ -1,5 +1,5 @@ --- -# Habilitations reconnues par ce service. Voir docs/autorisation.md. +# Habilitations reconnues par ce service. Voir docs/exploitation/autorisation.md. acces: - groupe: sysadmin accorde: admin diff --git a/roles/serveur_forgejo/meta/authentification.yml b/roles/serveur_forgejo/meta/authentification.yml index af9713c..06feea4 100644 --- a/roles/serveur_forgejo/meta/authentification.yml +++ b/roles/serveur_forgejo/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: web-sso diff --git a/roles/serveur_forgejo/meta/flux.yml b/roles/serveur_forgejo/meta/flux.yml index 5cbc893..309aa63 100644 --- a/roles/serveur_forgejo/meta/flux.yml +++ b/roles/serveur_forgejo/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de Forgejo (forge Git). Voir docs/flux-conception.md. +# Flux réseau de Forgejo (forge Git). Voir docs/conception/flux-conception.md. flux: # LE PORT DE LA FORGE N'EST PAS LE MÊME PARTOUT (2026-08-25). # diff --git a/roles/serveur_forgejo/meta/supervision.yml b/roles/serveur_forgejo/meta/supervision.yml index 28156f0..29bf59b 100644 --- a/roles/serveur_forgejo/meta/supervision.yml +++ b/roles/serveur_forgejo/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: forge metier: forge diff --git a/roles/serveur_forgejo/tasks/main.yml b/roles/serveur_forgejo/tasks/main.yml index 55a96af..786e6f6 100644 --- a/roles/serveur_forgejo/tasks/main.yml +++ b/roles/serveur_forgejo/tasks/main.yml @@ -607,7 +607,7 @@ mode: "0600" no_log: true -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_forgejo/templates/sonde-forge.sh.j2 b/roles/serveur_forgejo/templates/sonde-forge.sh.j2 index 727aa07..54b16d6 100644 --- a/roles/serveur_forgejo/templates/sonde-forge.sh.j2 +++ b/roles/serveur_forgejo/templates/sonde-forge.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « forge » — la forge est-elle en etat de servir ? # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_forgejo_sonde_url` (port ferme). # # ON DEMANDE A FORGEJO CE QU'IL PENSE DE LUI-MEME. `/api/healthz` verifie sa BASE et son diff --git a/roles/serveur_grafana/defaults/main.yml b/roles/serveur_grafana/defaults/main.yml index 0bd2392..5cc3273 100644 --- a/roles/serveur_grafana/defaults/main.yml +++ b/roles/serveur_grafana/defaults/main.yml @@ -33,7 +33,7 @@ serveur_grafana_admin_password: "{{ vault_grafana_admin | default('') }}" # rem # --- Connexion locale (accès de secours) --- # `false` = le formulaire identifiant/mot de passe n'est PAS proposé au repos ; le SSO # Keycloak est le seul chemin annoncé. Le compte local continue d'exister : on l'atteint -# par `sudo` sur l'hôte (voir docs/authentification.md), qui est le mécanisme de secours +# par `sudo` sur l'hôte (voir docs/conception/authentification.md), qui est le mécanisme de secours # retenu. Une porte de connexion ouverte en permanence contournerait la politique de mot # de passe, le MFA et surtout la révocation centrale — désactiver quelqu'un dans LDAP # laisserait le compte local valide, sans que rien ne le signale. diff --git a/roles/serveur_grafana/meta/acces.yml b/roles/serveur_grafana/meta/acces.yml index 79312dd..8d3548c 100644 --- a/roles/serveur_grafana/meta/acces.yml +++ b/roles/serveur_grafana/meta/acces.yml @@ -1,5 +1,5 @@ --- -# Habilitations reconnues par ce service. Voir docs/autorisation.md. +# Habilitations reconnues par ce service. Voir docs/exploitation/autorisation.md. # # `groupe` : le groupe LDAP — jamais une personne (D-66). # `accorde` : le vocabulaire DU SERVICE, pas une echelle abstraite. diff --git a/roles/serveur_grafana/meta/authentification.yml b/roles/serveur_grafana/meta/authentification.yml index 472d638..4484682 100644 --- a/roles/serveur_grafana/meta/authentification.yml +++ b/roles/serveur_grafana/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: web-sso diff --git a/roles/serveur_grafana/meta/flux.yml b/roles/serveur_grafana/meta/flux.yml index 0dd948c..dfe3be0 100644 --- a/roles/serveur_grafana/meta/flux.yml +++ b/roles/serveur_grafana/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de Grafana (tableaux de bord). Voir docs/flux-conception.md. +# Flux réseau de Grafana (tableaux de bord). Voir docs/conception/flux-conception.md. # Prometheus et Loki sont co-localisés (datasources en localhost) : aucun flux inter-nœud. flux: # `edge` ET `admin` — PARCE QUE TOUS LES DEPLOIEMENTS N'ONT PAS D'EDGE (2026-09-10). diff --git a/roles/serveur_grafana/meta/supervision.yml b/roles/serveur_grafana/meta/supervision.yml index 479c74f..797b601 100644 --- a/roles/serveur_grafana/meta/supervision.yml +++ b/roles/serveur_grafana/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: tableaux metier: supervision diff --git a/roles/serveur_grafana/tasks/main.yml b/roles/serveur_grafana/tasks/main.yml index a730e8b..587c494 100644 --- a/roles/serveur_grafana/tasks/main.yml +++ b/roles/serveur_grafana/tasks/main.yml @@ -409,7 +409,7 @@ # --- ROTATION DU COMPTE DE SECOURS ------------------------------------------- # `GF_SECURITY_ADMIN_PASSWORD` n'agit qu'a la CREATION du compte : changer la voute # ne changeait rien, et la voute se mettait a mentir en silence. Le runbook de -# reprise (docs/autorisation.md §6) promet pourtant cette rotation — c'est ce qui +# reprise (docs/exploitation/autorisation.md §6) promet pourtant cette rotation — c'est ce qui # transforme une livraison en transfert. Constate le 2026-08-07. # # Idempotence par EMPREINTE : on garde le sha256 du secret applique. Tant qu'il ne @@ -493,7 +493,7 @@ mode: "0600" no_log: true -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_grafana/templates/sonde-tableaux.sh.j2 b/roles/serveur_grafana/templates/sonde-tableaux.sh.j2 index c6b2878..270b507 100644 --- a/roles/serveur_grafana/templates/sonde-tableaux.sh.j2 +++ b/roles/serveur_grafana/templates/sonde-tableaux.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « tableaux » — Grafana repond, sa base tient, et ses SOURCES DE DONNEES aussi. # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_grafana_sonde_url` (port ferme). # # LES SOURCES, DEPUIS LE 2026-09-28. Cette sonde etait verte pendant que les tableaux des diff --git a/roles/serveur_icinga/meta/authentification.yml b/roles/serveur_icinga/meta/authentification.yml index a5f7899..c99a2a6 100644 --- a/roles/serveur_icinga/meta/authentification.yml +++ b/roles/serveur_icinga/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: sans-auth-humaine diff --git a/roles/serveur_icinga/meta/flux.yml b/roles/serveur_icinga/meta/flux.yml index 50e2817..7a0dfe3 100644 --- a/roles/serveur_icinga/meta/flux.yml +++ b/roles/serveur_icinga/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau d'Icinga 2 (moteur de supervision). Voir docs/flux-conception.md. +# Flux réseau d'Icinga 2 (moteur de supervision). Voir docs/conception/flux-conception.md. # IcingaDB (Redis 6380) est co-localisé : consommé en localhost par le frontal Icinga Web 2. flux: - sens: ingress diff --git a/roles/serveur_icinga/meta/supervision.yml b/roles/serveur_icinga/meta/supervision.yml index 90f78d6..91177fd 100644 --- a/roles/serveur_icinga/meta/supervision.yml +++ b/roles/serveur_icinga/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: moteur metier: supervision diff --git a/roles/serveur_icinga/tasks/main.yml b/roles/serveur_icinga/tasks/main.yml index 7152620..9cfd90b 100644 --- a/roles/serveur_icinga/tasks/main.yml +++ b/roles/serveur_icinga/tasks/main.yml @@ -366,7 +366,7 @@ state: absent notify: Redemarrer icinga2 -# LES SONDES DECLAREES PAR LES ROLES (docs/supervision-conception.md). +# LES SONDES DECLAREES PAR LES ROLES (docs/conception/supervision-conception.md). # # On lit les `meta/supervision.yml` sur le CONTROLEUR, pas sur la cible : c'est le depot # qui fait foi, et la cible n'a aucune raison de porter les declarations des autres. @@ -528,7 +528,7 @@ pouvoir les dire. Declarer l'adresse au plan. when: serveur_icinga_destinataire | length == 0 -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_icinga/templates/setops-sondes.conf.j2 b/roles/serveur_icinga/templates/setops-sondes.conf.j2 index d6a119a..b172d04 100644 --- a/roles/serveur_icinga/templates/setops-sondes.conf.j2 +++ b/roles/serveur_icinga/templates/setops-sondes.conf.j2 @@ -1,7 +1,7 @@ /* * Gere par Set-OPS (role serveur_icinga). Ne pas editer a la main. * - * LES SONDES QUE LES ROLES DECLARENT — voir docs/supervision-conception.md. + * LES SONDES QUE LES ROLES DECLARENT — voir docs/conception/supervision-conception.md. * * Rien ici n'est ecrit a la main : chaque service vient d'un `meta/supervision.yml`, et * s'attache aux hotes qui portent le role qui le declare. Ajouter une sonde a un role la diff --git a/roles/serveur_icinga/templates/sonde-moteur.sh.j2 b/roles/serveur_icinga/templates/sonde-moteur.sh.j2 index b13a119..2544e5f 100644 --- a/roles/serveur_icinga/templates/sonde-moteur.sh.j2 +++ b/roles/serveur_icinga/templates/sonde-moteur.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « moteur » — l'etat des controles arrive frais jusqu'a IcingaDB # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_icinga_sonde_age_crit` (age impossible). set -uo pipefail diff --git a/roles/serveur_icingaweb2/meta/acces.yml b/roles/serveur_icingaweb2/meta/acces.yml index c84565a..bb190ad 100644 --- a/roles/serveur_icingaweb2/meta/acces.yml +++ b/roles/serveur_icingaweb2/meta/acces.yml @@ -1,5 +1,5 @@ --- -# Habilitations reconnues par ce service. Voir docs/autorisation.md. +# Habilitations reconnues par ce service. Voir docs/exploitation/autorisation.md. acces: - groupe: sysadmin accorde: Administrateur diff --git a/roles/serveur_icingaweb2/meta/authentification.yml b/roles/serveur_icingaweb2/meta/authentification.yml index f6363b3..1f2b0d2 100644 --- a/roles/serveur_icingaweb2/meta/authentification.yml +++ b/roles/serveur_icingaweb2/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: web-sso diff --git a/roles/serveur_icingaweb2/meta/flux.yml b/roles/serveur_icingaweb2/meta/flux.yml index 52a2349..7c4535b 100644 --- a/roles/serveur_icingaweb2/meta/flux.yml +++ b/roles/serveur_icingaweb2/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau d'Icinga Web 2 (frontal de supervision). Voir docs/flux-conception.md. +# Flux réseau d'Icinga Web 2 (frontal de supervision). Voir docs/conception/flux-conception.md. # Icinga 2 (API 5665) et IcingaDB (Redis 6380) sont co-localisés : consommés en localhost. flux: # `admin` EN PLUS DE `edge` — le meme raisonnement que `serveur_grafana`, qui le portait diff --git a/roles/serveur_icingaweb2/meta/supervision.yml b/roles/serveur_icingaweb2/meta/supervision.yml index 2c7bc49..4df7616 100644 --- a/roles/serveur_icingaweb2/meta/supervision.yml +++ b/roles/serveur_icingaweb2/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # LA SONDE QUI SURVEILLE CELUI QUI REGARDE. C'est le cas le plus retors de tout le # dispositif, et il merite d'etre dit franchement. diff --git a/roles/serveur_keycloak/meta/authentification.yml b/roles/serveur_keycloak/meta/authentification.yml index d0260b1..7788aae 100644 --- a/roles/serveur_keycloak/meta/authentification.yml +++ b/roles/serveur_keycloak/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: socle-identite diff --git a/roles/serveur_keycloak/meta/flux.yml b/roles/serveur_keycloak/meta/flux.yml index b477f75..348859f 100644 --- a/roles/serveur_keycloak/meta/flux.yml +++ b/roles/serveur_keycloak/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de Keycloak (SSO OIDC). Voir docs/flux-conception.md. +# Flux réseau de Keycloak (SSO OIDC). Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 8080 diff --git a/roles/serveur_keycloak/meta/supervision.yml b/roles/serveur_keycloak/meta/supervision.yml index c7c5da8..ba7b607 100644 --- a/roles/serveur_keycloak/meta/supervision.yml +++ b/roles/serveur_keycloak/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: identite metier: connexion diff --git a/roles/serveur_keycloak/tasks/main.yml b/roles/serveur_keycloak/tasks/main.yml index bc7a19c..3513b10 100644 --- a/roles/serveur_keycloak/tasks/main.yml +++ b/roles/serveur_keycloak/tasks/main.yml @@ -446,7 +446,7 @@ - serveur_keycloak_account_theme | length > 0 - not ansible_check_mode -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_keycloak/templates/sonde-identite.sh.j2 b/roles/serveur_keycloak/templates/sonde-identite.sh.j2 index 09d4b96..e1ce867 100644 --- a/roles/serveur_keycloak/templates/sonde-identite.sh.j2 +++ b/roles/serveur_keycloak/templates/sonde-identite.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « identite » — le realm sert sa decouverte OIDC, et Keycloak ATTEINT l'annuaire # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_keycloak_sonde_realm` (realm inexistant) pour la # premiere etape, `serveur_keycloak_sonde_federation` (federation inexistante) pour la seconde. # diff --git a/roles/serveur_loki/meta/authentification.yml b/roles/serveur_loki/meta/authentification.yml index d60aa28..1b130f5 100644 --- a/roles/serveur_loki/meta/authentification.yml +++ b/roles/serveur_loki/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: interne-sans-auth diff --git a/roles/serveur_loki/meta/flux.yml b/roles/serveur_loki/meta/flux.yml index 2c6f721..6ae9667 100644 --- a/roles/serveur_loki/meta/flux.yml +++ b/roles/serveur_loki/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de Loki (journaux). Voir docs/flux-conception.md. +# Flux réseau de Loki (journaux). Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 3100 diff --git a/roles/serveur_loki/meta/supervision.yml b/roles/serveur_loki/meta/supervision.yml index dd8fb94..7c75ff8 100644 --- a/roles/serveur_loki/meta/supervision.yml +++ b/roles/serveur_loki/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: ingestion metier: supervision diff --git a/roles/serveur_loki/tasks/main.yml b/roles/serveur_loki/tasks/main.yml index b8c15d3..7904d52 100644 --- a/roles/serveur_loki/tasks/main.yml +++ b/roles/serveur_loki/tasks/main.yml @@ -334,7 +334,7 @@ enabled: true state: started -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_loki/templates/sonde-frontiere.sh.j2 b/roles/serveur_loki/templates/sonde-frontiere.sh.j2 index 38e7232..8f3ff2e 100644 --- a/roles/serveur_loki/templates/sonde-frontiere.sh.j2 +++ b/roles/serveur_loki/templates/sonde-frontiere.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « journaux-frontiere » — l'equipement qui voit TOUT parle-t-il encore ? # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_loki_sonde_frontiere_etiquette` (nom inconnu). # # POURQUOI CETTE SONDE EXISTE, ET POURQUOI ELLE EST LA PLUS IMPORTANTE DU LOT. diff --git a/roles/serveur_loki/templates/sonde-ingestion.sh.j2 b/roles/serveur_loki/templates/sonde-ingestion.sh.j2 index 257eee0..21fcc31 100644 --- a/roles/serveur_loki/templates/sonde-ingestion.sh.j2 +++ b/roles/serveur_loki/templates/sonde-ingestion.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « ingestion » — l'ingesteur est pret, pas seulement le port ouvert # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_loki_sonde_url` (port ferme). set -uo pipefail diff --git a/roles/serveur_nextcloud/meta/acces.yml b/roles/serveur_nextcloud/meta/acces.yml index 695b113..43e8840 100644 --- a/roles/serveur_nextcloud/meta/acces.yml +++ b/roles/serveur_nextcloud/meta/acces.yml @@ -1,5 +1,5 @@ --- -# Habilitations reconnues par ce service. Voir docs/autorisation.md. +# Habilitations reconnues par ce service. Voir docs/exploitation/autorisation.md. acces: - groupe: sysadmin accorde: admin diff --git a/roles/serveur_nextcloud/meta/authentification.yml b/roles/serveur_nextcloud/meta/authentification.yml index baab605..dce32a8 100644 --- a/roles/serveur_nextcloud/meta/authentification.yml +++ b/roles/serveur_nextcloud/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: web-sso diff --git a/roles/serveur_nextcloud/meta/flux.yml b/roles/serveur_nextcloud/meta/flux.yml index ca146e4..1d3854d 100644 --- a/roles/serveur_nextcloud/meta/flux.yml +++ b/roles/serveur_nextcloud/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de Nextcloud (collaboration). Voir docs/flux-conception.md. +# Flux réseau de Nextcloud (collaboration). Voir docs/conception/flux-conception.md. # Redis (6379) est co-localisé : cache/verrous en localhost. flux: - sens: ingress diff --git a/roles/serveur_nextcloud/meta/supervision.yml b/roles/serveur_nextcloud/meta/supervision.yml index 547926d..fc68219 100644 --- a/roles/serveur_nextcloud/meta/supervision.yml +++ b/roles/serveur_nextcloud/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: collaboration metier: fichiers diff --git a/roles/serveur_nextcloud/tasks/main.yml b/roles/serveur_nextcloud/tasks/main.yml index a06eacd..ee7ab1a 100644 --- a/roles/serveur_nextcloud/tasks/main.yml +++ b/roles/serveur_nextcloud/tasks/main.yml @@ -87,7 +87,7 @@ ansible.builtin.import_tasks: theme.yml when: serveur_nextcloud_branding | bool -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Etat d'une incarnation precedente (base, fichiers, configuration) diff --git a/roles/serveur_nextcloud/templates/sonde-collaboration.sh.j2 b/roles/serveur_nextcloud/templates/sonde-collaboration.sh.j2 index 9519f2d..dfe0921 100644 --- a/roles/serveur_nextcloud/templates/sonde-collaboration.sh.j2 +++ b/roles/serveur_nextcloud/templates/sonde-collaboration.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « collaboration » — installe, hors maintenance, sans migration en attente # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_nextcloud_sonde_url` (port ferme). set -uo pipefail diff --git a/roles/serveur_nginx/meta/authentification.yml b/roles/serveur_nginx/meta/authentification.yml index 8fd78e6..49569eb 100644 --- a/roles/serveur_nginx/meta/authentification.yml +++ b/roles/serveur_nginx/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: sans-auth-humaine diff --git a/roles/serveur_nginx/meta/flux.yml b/roles/serveur_nginx/meta/flux.yml index 24d8cad..322dba0 100644 --- a/roles/serveur_nginx/meta/flux.yml +++ b/roles/serveur_nginx/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de l'edge nginx (propriété du rôle). Voir docs/flux-conception.md. +# Flux réseau de l'edge nginx (propriété du rôle). Voir docs/conception/flux-conception.md. # Cas « edge » : ingress depuis l'extérieur (frontière publique) + egress vers les backends, # ces derniers dérivés des `expose:` des applications (pair: expositions). flux: @@ -41,7 +41,7 @@ flux: # hote du tenant ni un visiteur d'Internet : il arrive du reseau d'administration, # un troisieme chemin que rien ne declarait. Resultat au 2026-08-07 : le sysadmin # ne pouvait atteindre AUCUNE interface web de la flotte qu'il administre — ce qui - # contredisait le runbook de reprise (docs/autorisation.md §6), lequel suppose + # contredisait le runbook de reprise (docs/exploitation/autorisation.md §6), lequel suppose # qu'on ouvre Keycloak dans un navigateur. # # L'edge SEUL recoit ce droit : c'est le point d'entree unique, et ouvrir les diff --git a/roles/serveur_nginx/meta/supervision.yml b/roles/serveur_nginx/meta/supervision.yml index c42b988..5090779 100644 --- a/roles/serveur_nginx/meta/supervision.yml +++ b/roles/serveur_nginx/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: edge metier: acces diff --git a/roles/serveur_nginx/tasks/main.yml b/roles/serveur_nginx/tasks/main.yml index 1e5abcb..e9c017a 100644 --- a/roles/serveur_nginx/tasks/main.yml +++ b/roles/serveur_nginx/tasks/main.yml @@ -154,7 +154,7 @@ enabled: true state: started -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_nginx/templates/sonde-edge.sh.j2 b/roles/serveur_nginx/templates/sonde-edge.sh.j2 index 3a41c3e..53b2270 100644 --- a/roles/serveur_nginx/templates/sonde-edge.sh.j2 +++ b/roles/serveur_nginx/templates/sonde-edge.sh.j2 @@ -4,7 +4,7 @@ # # SONDE « edge » — l'edge ecoute, sa configuration tient, et ce qu'il publie REPOND # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_nginx_sonde_ports` (port qui n'ecoute pas). set -uo pipefail diff --git a/roles/serveur_oauth2_proxy/meta/authentification.yml b/roles/serveur_oauth2_proxy/meta/authentification.yml index 4349467..cd7a7a4 100644 --- a/roles/serveur_oauth2_proxy/meta/authentification.yml +++ b/roles/serveur_oauth2_proxy/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: web-sso diff --git a/roles/serveur_oauth2_proxy/meta/flux.yml b/roles/serveur_oauth2_proxy/meta/flux.yml index 6941d13..536ef40 100644 --- a/roles/serveur_oauth2_proxy/meta/flux.yml +++ b/roles/serveur_oauth2_proxy/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau d'oauth2-proxy (passerelle SSO devant une app sans OIDC natif). Voir docs/flux-conception.md. +# Flux réseau d'oauth2-proxy (passerelle SSO devant une app sans OIDC natif). Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 4180 diff --git a/roles/serveur_oauth2_proxy/meta/supervision.yml b/roles/serveur_oauth2_proxy/meta/supervision.yml index 8328ddd..f3fb721 100644 --- a/roles/serveur_oauth2_proxy/meta/supervision.yml +++ b/roles/serveur_oauth2_proxy/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # UNE SEULE SONDE, une seule CAUSE D'ACTION : aller voir oauth2_proxy. # diff --git a/roles/serveur_openldap/defaults/main.yml b/roles/serveur_openldap/defaults/main.yml index 7a58602..feb6e8c 100644 --- a/roles/serveur_openldap/defaults/main.yml +++ b/roles/serveur_openldap/defaults/main.yml @@ -129,7 +129,7 @@ serveur_openldap_services: "ldap:/// ldaps:/// ldapi:///" # Sans cet overlay, `pwdReset` n'existe pas dans le schema : le changement force a # la premiere ouverture est impossible, et rien ne contraint la qualite ni ne # verrouille apres des echecs repetes. Mesure le 2026-08-07 : seul `back_mdb` -# etait charge. Voir docs/autorisation.md §3. +# etait charge. Voir docs/exploitation/autorisation.md §3. # # Depuis OpenLDAP 2.5, le schema ppolicy est INTEGRE au module : aucun fichier # `.ldif` a charger, contrairement a 2.4. diff --git a/roles/serveur_openldap/meta/authentification.yml b/roles/serveur_openldap/meta/authentification.yml index d591167..7145e32 100644 --- a/roles/serveur_openldap/meta/authentification.yml +++ b/roles/serveur_openldap/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: socle-identite diff --git a/roles/serveur_openldap/meta/flux.yml b/roles/serveur_openldap/meta/flux.yml index 35800e3..2b6eede 100644 --- a/roles/serveur_openldap/meta/flux.yml +++ b/roles/serveur_openldap/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de l'annuaire OpenLDAP (slapd). Voir docs/flux-conception.md. +# Flux réseau de l'annuaire OpenLDAP (slapd). Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 636 diff --git a/roles/serveur_openldap/meta/supervision.yml b/roles/serveur_openldap/meta/supervision.yml index 84dd6f3..f1be0bc 100644 --- a/roles/serveur_openldap/meta/supervision.yml +++ b/roles/serveur_openldap/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: annuaire metier: connexion diff --git a/roles/serveur_openldap/tasks/main.yml b/roles/serveur_openldap/tasks/main.yml index 8f26759..a1d8e84 100644 --- a/roles/serveur_openldap/tasks/main.yml +++ b/roles/serveur_openldap/tasks/main.yml @@ -243,7 +243,7 @@ # --- Politique de mot de passe (overlay ppolicy) ------------------------------ # Sans cet overlay, `pwdReset` n'existe pas dans le schema : `amorcage_acces` ne peut # pas forcer le changement du jeton d'amorcage, et rien ne contraint la qualite ni ne -# verrouille apres des echecs. Voir docs/autorisation.md §3. +# verrouille apres des echecs. Voir docs/exploitation/autorisation.md §3. - name: Ppolicy — Charger le module community.general.ldap_attrs: dn: "cn=module{0},cn=config" @@ -514,7 +514,7 @@ client_backup_acter_etat: restaure when: client_backup_restauration.etat == 'a_restaurer' -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_openldap/templates/sonde-annuaire.sh.j2 b/roles/serveur_openldap/templates/sonde-annuaire.sh.j2 index 52b4707..05da753 100644 --- a/roles/serveur_openldap/templates/sonde-annuaire.sh.j2 +++ b/roles/serveur_openldap/templates/sonde-annuaire.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « annuaire » — l'annuaire repond ET contient ses entrees # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_openldap_sonde_minimum` (seuil impossible). set -uo pipefail diff --git a/roles/serveur_ops/defaults/main.yml b/roles/serveur_ops/defaults/main.yml index 4551bdd..38bb29c 100644 --- a/roles/serveur_ops/defaults/main.yml +++ b/roles/serveur_ops/defaults/main.yml @@ -101,7 +101,7 @@ serveur_ops_forge_amont_ac_depot: "{{ serveur_ops_racine }}/.ac-amont.crt" serveur_ops_depots: - { depot: "set-ops-public", dest: "Set-OPS-public", role: "moteur" } -# --- LES DEPOTS PRIVES (2026-10-11, `docs/depots-prives-conception.md`) -------- +# --- LES DEPOTS PRIVES (2026-10-11, `docs/conception/depots-prives-conception.md`) -------- # # Le plan d'un ecosysteme et la carte du site ne regardent que leur runner — et le runner du # site. Sur la forge du site, ils sont PRIVES : chaque runner les lit en SSH, avec SA cle, diff --git a/roles/serveur_ops/meta/authentification.yml b/roles/serveur_ops/meta/authentification.yml index b77332e..e887e60 100644 --- a/roles/serveur_ops/meta/authentification.yml +++ b/roles/serveur_ops/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29. +# Voir docs/conception/authentification.md. Gardee par la preuve P29. authentification: portee: sans-auth-humaine mecanisme: aucun diff --git a/roles/serveur_ops/meta/flux.yml b/roles/serveur_ops/meta/flux.yml index 6e74dd6..e206f53 100644 --- a/roles/serveur_ops/meta/flux.yml +++ b/roles/serveur_ops/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du poste d'exploitation. Voir docs/flux-conception.md. +# Flux réseau du poste d'exploitation. Voir docs/conception/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. @@ -59,7 +59,7 @@ flux: # pas suivi. `voisins_site` vu d'un locataire, ce sont les AUTRES locataires : la frontiere # ouvrait donc le 443 du runner de chaque locataire vers tout le supernet de l'autre — un # passage entre locataires que rien ne justifiait, la ou elle doit refuser par defaut. - # Trouve en confrontant la frontiere a la face reseau (docs/conception-contextes.md). + # Trouve en confrontant la frontiere a la face reseau (docs/conception/conception-contextes.md). # # Le clonage passe par la regle que declare `serveur_forge_site` (son entree depuis # `voisins_site`, vue du site : ses locataires). La forge DE TRAVAIL d'un ecosysteme, diff --git a/roles/serveur_ops/meta/supervision.yml b/roles/serveur_ops/meta/supervision.yml index 468bd6a..f01cf1b 100644 --- a/roles/serveur_ops/meta/supervision.yml +++ b/roles/serveur_ops/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: runner metier: pilotage diff --git a/roles/serveur_ops/tasks/main.yml b/roles/serveur_ops/tasks/main.yml index f2d4195..bff24ed 100644 --- a/roles/serveur_ops/tasks/main.yml +++ b/roles/serveur_ops/tasks/main.yml @@ -363,7 +363,7 @@ # --- LES DEPOTS PRIVES : EN SSH, OU EN COLIS TANT QUE LE RUNNER NE PEUT PAS --------------- # -# (2026-10-11, `docs/depots-prives-conception.md`.) Le plan d'un ecosysteme et la carte du +# (2026-10-11, `docs/conception/depots-prives-conception.md`.) Le plan d'un ecosysteme et la carte du # site sont prives sur la forge du site. Le runner les lit en SSH, avec SA cle, que le site a # enregistree comme cle de deploiement sur ce seul depot (`make forge-cles`). # @@ -886,7 +886,7 @@ group: "{{ serveur_ops_utilisateur }}" mode: "0644" -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_ops/templates/setops-gui.service.j2 b/roles/serveur_ops/templates/setops-gui.service.j2 index 8ab9598..689e698 100644 --- a/roles/serveur_ops/templates/setops-gui.service.j2 +++ b/roles/serveur_ops/templates/setops-gui.service.j2 @@ -10,7 +10,7 @@ # Ce qui est publie est le nginx local, qui authentifie d'abord. [Unit] Description=Console d'exploitation Set-OPS ({{ setops_instance | default('instance') }}) -Documentation=file://{{ serveur_ops_racine }}/{{ serveur_ops_depot_moteur }}/docs/carte-set-ops.md +Documentation=file://{{ serveur_ops_racine }}/{{ serveur_ops_depot_moteur }}/docs/README.md After=network-online.target Wants=network-online.target diff --git a/roles/serveur_ops/templates/sonde-runner.sh.j2 b/roles/serveur_ops/templates/sonde-runner.sh.j2 index 4785bdb..cc1e23f 100644 --- a/roles/serveur_ops/templates/sonde-runner.sh.j2 +++ b/roles/serveur_ops/templates/sonde-runner.sh.j2 @@ -7,7 +7,7 @@ # # SONDE « runner » — depots propres sur leur branche, et Ansible repond # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_ops_sonde_venv` (chemin inexistant). set -uo pipefail diff --git a/roles/serveur_ops_site/defaults/main.yml b/roles/serveur_ops_site/defaults/main.yml index 4fac4a9..a30881f 100644 --- a/roles/serveur_ops_site/defaults/main.yml +++ b/roles/serveur_ops_site/defaults/main.yml @@ -51,7 +51,7 @@ serveur_ops_site_voute_deposer: true # # `false` PAR DEFAUT, ET CE N'EST PAS DE LA PRUDENCE DECORATIVE. Armer est un ACTE, pas un # reglage : c'est le moment ou un humain remet la cle, et c'est le seul geste que la -# reproduction exige de lui (cf. docs/filiation-emancipation.md). Un defaut a `true` +# reproduction exige de lui (cf. docs/conception/filiation-emancipation.md). Un defaut a `true` # armerait des machines sans que personne ne l'ait decide. # # LA SOURCE EST UN POINTEUR, JAMAIS UNE VALEUR : le chemin du fichier de mot de passe sur diff --git a/roles/serveur_ops_site/meta/authentification.yml b/roles/serveur_ops_site/meta/authentification.yml index 7d3e211..54ccc72 100644 --- a/roles/serveur_ops_site/meta/authentification.yml +++ b/roles/serveur_ops_site/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29. +# Voir docs/conception/authentification.md. Gardee par la preuve P29. authentification: portee: sans-auth-humaine mecanisme: aucun diff --git a/roles/serveur_ops_site/meta/flux.yml b/roles/serveur_ops_site/meta/flux.yml index 85b8155..c863a85 100644 --- a/roles/serveur_ops_site/meta/flux.yml +++ b/roles/serveur_ops_site/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du runner de SITE. Voir docs/flux-conception.md. +# Flux réseau du runner de SITE. Voir docs/conception/flux-conception.md. # # Les flux du POUVOIR DE MATERIALISER : API de l'hyperviseur, shell des noeuds, API de # la frontiere. Chacun est un pouvoir distinct, donc declare a part. @@ -20,7 +20,7 @@ # CE QU'IL RESTE INTERDIT, ET QUI N'EST PAS UNE REGLE MAIS UN FAIT : armer. Le runner du # SITE ne detient pas la voute d'un tenant — elle vit hors depot — et n'en connait pas le # mot de passe. Il peut poser tout ce qui est public ; c'est un HUMAIN qui remet le -# secret, et c'est la que le pouvoir du site s'arrete. Voir docs/filiation-emancipation.md. +# secret, et c'est la que le pouvoir du site s'arrete. Voir docs/conception/filiation-emancipation.md. flux: - sens: egress port: 8006 diff --git a/roles/serveur_ops_site/meta/supervision.yml b/roles/serveur_ops_site/meta/supervision.yml index 1fdb4c3..b7ad73b 100644 --- a/roles/serveur_ops_site/meta/supervision.yml +++ b/roles/serveur_ops_site/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # CE ROLE NE SERT RIEN. Il n'ecoute sur aucun port, ne repond a personne, et une sonde de # disponibilite n'aurait ici aucun sens. Ce qu'il detient, c'est un POUVOIR : celui de diff --git a/roles/serveur_ops_site/templates/sonde-fabric.sh.j2 b/roles/serveur_ops_site/templates/sonde-fabric.sh.j2 index da3def9..5f81b48 100644 --- a/roles/serveur_ops_site/templates/sonde-fabric.sh.j2 +++ b/roles/serveur_ops_site/templates/sonde-fabric.sh.j2 @@ -4,7 +4,7 @@ # SONDE « fabric » — le pare-feu Proxmox, le SDN, la frontiere et les acces WireGuard # disent-ils encore ce que le plan dit ? # -# Contrat : docs/supervision-conception.md — une ligne, 0/1/2/3. Elle ne JOUE pas les +# Contrat : docs/conception/supervision-conception.md — une ligne, 0/1/2/3. Elle ne JOUE pas les # plans (trop lents pour une sonde) : elle lit le constat du minuteur # `setops-conformite-fabric`. Un constat trop VIEUX est une panne a part entiere : sans # lui, un minuteur mort laisserait la derniere bonne nouvelle au vert pour toujours. diff --git a/roles/serveur_ops_site/templates/sonde-genome-a-jour.sh.j2 b/roles/serveur_ops_site/templates/sonde-genome-a-jour.sh.j2 index 2988cde..e8c2bdc 100644 --- a/roles/serveur_ops_site/templates/sonde-genome-a-jour.sh.j2 +++ b/roles/serveur_ops_site/templates/sonde-genome-a-jour.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « genome-a-jour » — la forge du site porte-t-elle ce que le poste a publie ? # -# Contrat : docs/supervision-conception.md — une ligne, 0/1/3. +# Contrat : docs/conception/supervision-conception.md — une ligne, 0/1/3. # # POURQUOI UN FILET (2026-09-28). La forge du site fait autorite (D-81) ; les commits naissent # sur le poste. `make publier` pousse sur eregion PUIS sur la forge du site — mais un diff --git a/roles/serveur_ops_tenant/README.md b/roles/serveur_ops_tenant/README.md index a6c7bab..da37f2f 100644 --- a/roles/serveur_ops_tenant/README.md +++ b/roles/serveur_ops_tenant/README.md @@ -45,4 +45,4 @@ satisfait, et les secrets dormiraient en clair sur une machine. Le rôle refuse - `roles/serveur_ops/README.md` — l'installateur - `roles/serveur_ops_site/README.md` — le pouvoir symétrique, côté fabric -- `docs/implanter-un-tenant-sur-un-site.md` — la séquence complète +- `docs/hebergement/implanter-un-tenant-sur-un-site.md` — la séquence complète diff --git a/roles/serveur_ops_tenant/defaults/main.yml b/roles/serveur_ops_tenant/defaults/main.yml index e5fb910..9495bbd 100644 --- a/roles/serveur_ops_tenant/defaults/main.yml +++ b/roles/serveur_ops_tenant/defaults/main.yml @@ -66,7 +66,7 @@ serveur_ops_tenant_inventaires_connus: # # `false` PAR DEFAUT, ET CE N'EST PAS DE LA PRUDENCE DECORATIVE. Armer est un ACTE, pas un # reglage : c'est le moment ou un humain remet la cle, et c'est le seul geste que la -# reproduction exige de lui (cf. docs/filiation-emancipation.md). Un defaut a `true` +# reproduction exige de lui (cf. docs/conception/filiation-emancipation.md). Un defaut a `true` # armerait des machines sans que personne ne l'ait decide. # # LA SOURCE EST UN POINTEUR, JAMAIS UNE VALEUR : le chemin du fichier de mot de passe sur diff --git a/roles/serveur_ops_tenant/meta/authentification.yml b/roles/serveur_ops_tenant/meta/authentification.yml index 7d3e211..54ccc72 100644 --- a/roles/serveur_ops_tenant/meta/authentification.yml +++ b/roles/serveur_ops_tenant/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29. +# Voir docs/conception/authentification.md. Gardee par la preuve P29. authentification: portee: sans-auth-humaine mecanisme: aucun diff --git a/roles/serveur_ops_tenant/meta/flux.yml b/roles/serveur_ops_tenant/meta/flux.yml index 318cd11..857ad6e 100644 --- a/roles/serveur_ops_tenant/meta/flux.yml +++ b/roles/serveur_ops_tenant/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du runner de TENANT. Voir docs/flux-conception.md. +# Flux réseau du runner de TENANT. Voir docs/conception/flux-conception.md. # # UN SEUL FLUX, ET C'EST LE LIEN DE FILIATION. # @@ -21,7 +21,7 @@ # CE QU'IL NE TRANSPORTE JAMAIS : un secret. Le runner du SITE peut poser le socle, le # moteur, le plan et le plancher de résolution — tout cela est public. Il ne détient pas # la voûte du tenant (elle est hors dépôt) et n'en connaît pas le mot de passe. C'est -# l'humain qui arme ce runner, et c'est voulu : voir `docs/filiation-emancipation.md`. +# l'humain qui arme ce runner, et c'est voulu : voir `docs/conception/filiation-emancipation.md`. flux: - sens: ingress port: 22 diff --git a/roles/serveur_ops_tenant/meta/supervision.yml b/roles/serveur_ops_tenant/meta/supervision.yml index 866182e..76bb8b0 100644 --- a/roles/serveur_ops_tenant/meta/supervision.yml +++ b/roles/serveur_ops_tenant/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: voute metier: pilotage diff --git a/roles/serveur_ops_tenant/tasks/main.yml b/roles/serveur_ops_tenant/tasks/main.yml index 0e04eeb..a99b184 100644 --- a/roles/serveur_ops_tenant/tasks/main.yml +++ b/roles/serveur_ops_tenant/tasks/main.yml @@ -251,7 +251,7 @@ fabriquee. Sa reconstruction lui en donnera une autre, que la flotte refusera. when: serveur_ops_tenant_ssh_cle | length == 0 -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_ops_tenant/templates/sonde-voute.sh.j2 b/roles/serveur_ops_tenant/templates/sonde-voute.sh.j2 index c6dd980..f82c8a7 100644 --- a/roles/serveur_ops_tenant/templates/sonde-voute.sh.j2 +++ b/roles/serveur_ops_tenant/templates/sonde-voute.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « voute » — la voute est presente et chiffree # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_ops_tenant_sonde_voute` (chemin inexistant). set -uo pipefail diff --git a/roles/serveur_postfix/README.md b/roles/serveur_postfix/README.md index 778987f..a87ed7e 100644 --- a/roles/serveur_postfix/README.md +++ b/roles/serveur_postfix/README.md @@ -2,7 +2,7 @@ **MTA** : Postfix 3.x (Debian 13) sur le nœud *edge-mta* — réception SMTP :25, cartes LDAP (domaines, boîtes, alias), remise **LMTP réseau** vers le mailstore (`serveur_dovecot`). -**Ne stocke aucune boîte.** Cf. `docs/courriel-conception.md`. +**Ne stocke aucune boîte.** Cf. `docs/conception/courriel-conception.md`. ## Rôle - Préconfigure Postfix par **debconf** (installation non interactive), installe @@ -25,7 +25,7 @@ Le rôle **accepte** deux liens déclarés côté application dans `plan/applica | `milter` | Passe `serveur_postfix_rspamd_milter` à `true` (rspamd co-localisé) | C'est le sens « **app→app** », résolu par `scripts/instancier.py`. Cf. -`docs/bindings-conception.md`. +`docs/conception/bindings-conception.md`. ## Variables principales | Variable | Défaut | Rôle | diff --git a/roles/serveur_postfix/defaults/main.yml b/roles/serveur_postfix/defaults/main.yml index 3bf593b..0b1dbe1 100644 --- a/roles/serveur_postfix/defaults/main.yml +++ b/roles/serveur_postfix/defaults/main.yml @@ -1,7 +1,7 @@ --- # Postfix 3.x (Debian 13) — MTA du nœud edge-mta : réception :25, cartes LDAP (domaines, # boîtes, alias), remise LMTP réseau vers le nœud mail-store (Dovecot). TLS via step_ca. -# NE STOCKE AUCUNE BOÎTE. Cf. docs/courriel-conception.md + docs/identite-sso.md. +# NE STOCKE AUCUNE BOÎTE. Cf. docs/conception/courriel-conception.md + docs/conception/identite-sso.md. # DEUX MODES, PARCE QU'UN SITE N'A PAS DE BOITES (2026-09-02). # diff --git a/roles/serveur_postfix/meta/authentification.yml b/roles/serveur_postfix/meta/authentification.yml index 94237c9..5582b83 100644 --- a/roles/serveur_postfix/meta/authentification.yml +++ b/roles/serveur_postfix/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: ldap-direct diff --git a/roles/serveur_postfix/meta/flux.yml b/roles/serveur_postfix/meta/flux.yml index 31b5154..17cf99b 100644 --- a/roles/serveur_postfix/meta/flux.yml +++ b/roles/serveur_postfix/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de Postfix (MTA). Voir docs/flux-conception.md. +# Flux réseau de Postfix (MTA). Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 25 diff --git a/roles/serveur_postfix/meta/liens.yml b/roles/serveur_postfix/meta/liens.yml index 779269b..0717231 100644 --- a/roles/serveur_postfix/meta/liens.yml +++ b/roles/serveur_postfix/meta/liens.yml @@ -2,7 +2,7 @@ # Liens (bindings) acceptes par serveur_postfix — resolus par scripts/instancier.py. # Le consommateur declare le lien dans plan/applications.yml (liens: [{vers, role}]) ; # la cible est resolue (FQDN interne derive) et injectee en host_vars du consommateur. -# Placeholders disponibles : {cible.hote} {cible.fqdn} {cible.ip}. Cf. docs/bindings-conception.md. +# Placeholders disponibles : {cible.hote} {cible.fqdn} {cible.ip}. Cf. docs/conception/bindings-conception.md. setops_liens: accepte: mailstore: # ou remettre le courrier (Dovecot LMTP) diff --git a/roles/serveur_postfix/meta/supervision.yml b/roles/serveur_postfix/meta/supervision.yml index 459f2b7..7910606 100644 --- a/roles/serveur_postfix/meta/supervision.yml +++ b/roles/serveur_postfix/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: file-courriel metier: courriel diff --git a/roles/serveur_postfix/tasks/main.yml b/roles/serveur_postfix/tasks/main.yml index 61f502f..48b3f12 100644 --- a/roles/serveur_postfix/tasks/main.yml +++ b/roles/serveur_postfix/tasks/main.yml @@ -242,7 +242,7 @@ tasks_from: auth_locale.yml when: serveur_postfix_submission_actif | bool -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_postfix/templates/sonde-file-courriel.sh.j2 b/roles/serveur_postfix/templates/sonde-file-courriel.sh.j2 index ebd22eb..fbd8ee9 100644 --- a/roles/serveur_postfix/templates/sonde-file-courriel.sh.j2 +++ b/roles/serveur_postfix/templates/sonde-file-courriel.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « file-courriel » — la file d'attente ne s'accumule pas # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_postfix_sonde_avert` / `_crit` (seuils impossibles). set -uo pipefail diff --git a/roles/serveur_postgresql/meta/authentification.yml b/roles/serveur_postgresql/meta/authentification.yml index 5823da6..846500b 100644 --- a/roles/serveur_postgresql/meta/authentification.yml +++ b/roles/serveur_postgresql/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: sans-auth-humaine diff --git a/roles/serveur_postgresql/meta/flux.yml b/roles/serveur_postgresql/meta/flux.yml index 6b99979..b8a4535 100644 --- a/roles/serveur_postgresql/meta/flux.yml +++ b/roles/serveur_postgresql/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de PostgreSQL (propriété du rôle). Voir docs/flux-conception.md. +# Flux réseau de PostgreSQL (propriété du rôle). Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 5432 diff --git a/roles/serveur_postgresql/meta/metriques.yml b/roles/serveur_postgresql/meta/metriques.yml index 249c4b6..a382342 100644 --- a/roles/serveur_postgresql/meta/metriques.yml +++ b/roles/serveur_postgresql/meta/metriques.yml @@ -10,7 +10,7 @@ # `metriques.yml` -> un EXPORTATEUR expose une SERIE. « depuis quand, # et vers ou ? » # -# `docs/supervision-conception.md` le dit deja dans l'autre sens : « une metrique a seuil +# `docs/conception/supervision-conception.md` le dit deja dans l'autre sens : « une metrique a seuil # appartient a Prometheus et Grafana ; melanger les deux rendrait les deux moins # lisibles ». Ce fichier est l'autre moitie de cette phrase. # diff --git a/roles/serveur_postgresql/meta/supervision.yml b/roles/serveur_postgresql/meta/supervision.yml index 24824f2..3fa3480 100644 --- a/roles/serveur_postgresql/meta/supervision.yml +++ b/roles/serveur_postgresql/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: base metier: base diff --git a/roles/serveur_postgresql/tasks/main.yml b/roles/serveur_postgresql/tasks/main.yml index 056005f..2081729 100644 --- a/roles/serveur_postgresql/tasks/main.yml +++ b/roles/serveur_postgresql/tasks/main.yml @@ -278,7 +278,7 @@ client_backup_acter_etat: restaure when: client_backup_restauration.etat == 'a_restaurer' -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_postgresql/templates/sonde-base.sh.j2 b/roles/serveur_postgresql/templates/sonde-base.sh.j2 index 4f62cf3..a254186 100644 --- a/roles/serveur_postgresql/templates/sonde-base.sh.j2 +++ b/roles/serveur_postgresql/templates/sonde-base.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « base » — la base repond a une requete et garde des connexions libres # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_postgresql_sonde_pct_avert` (seuil impossible). set -uo pipefail diff --git a/roles/serveur_powerdns/README.md b/roles/serveur_powerdns/README.md index 785edee..a69fb46 100644 --- a/roles/serveur_powerdns/README.md +++ b/roles/serveur_powerdns/README.md @@ -1,7 +1,7 @@ # Rôle `serveur_powerdns` > **Pour qui :** le mainteneur du DNS d'un écosystème. La vue d'ensemble, avec ses schémas, -> est dans `docs/dns-interne.md`. +> est dans `docs/conception/dns-interne.md`. PowerDNS Authoritative, backend BIND, zones générées par Ansible depuis l'inventaire et le plan. Pas de dépendance à PostgreSQL. Le rôle porte **deux instances**, qui ne se voient pas. diff --git a/roles/serveur_powerdns/meta/authentification.yml b/roles/serveur_powerdns/meta/authentification.yml index afe64e1..51f6bcf 100644 --- a/roles/serveur_powerdns/meta/authentification.yml +++ b/roles/serveur_powerdns/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: sans-auth-humaine diff --git a/roles/serveur_powerdns/meta/flux.yml b/roles/serveur_powerdns/meta/flux.yml index 90a7c52..2d80b11 100644 --- a/roles/serveur_powerdns/meta/flux.yml +++ b/roles/serveur_powerdns/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du DNS autoritatif interne (PowerDNS). Voir docs/flux-conception.md. +# Flux réseau du DNS autoritatif interne (PowerDNS). Voir docs/conception/flux-conception.md. # LE PORT DE L'AUTORITATIF EST DÉRIVÉ DEPUIS LE 2026-08-24, et c'est pour ça qu'il est # déclaré `derive` plutôt que `53` : # diff --git a/roles/serveur_powerdns/meta/supervision.yml b/roles/serveur_powerdns/meta/supervision.yml index 98209d0..f4b9a0c 100644 --- a/roles/serveur_powerdns/meta/supervision.yml +++ b/roles/serveur_powerdns/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: zones metier: noms diff --git a/roles/serveur_powerdns/tasks/main.yml b/roles/serveur_powerdns/tasks/main.yml index 9264cba..e5808c4 100644 --- a/roles/serveur_powerdns/tasks/main.yml +++ b/roles/serveur_powerdns/tasks/main.yml @@ -167,7 +167,7 @@ changed_when: "'RECHARGEE' in serveur_powerdns_reconciliation.stdout" when: not ansible_check_mode -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_powerdns/tasks/zones-publiques.yml b/roles/serveur_powerdns/tasks/zones-publiques.yml index 35a35df..a331732 100644 --- a/roles/serveur_powerdns/tasks/zones-publiques.yml +++ b/roles/serveur_powerdns/tasks/zones-publiques.yml @@ -11,7 +11,7 @@ # Or l'instance principale sert AUSSI la zone `.internal`. Lui faire ecouter l'adresse de # l'hote aurait permis au serveur public du site d'INTERROGER la zone interne du locataire # — de lire la carte de ses machines. C'est precisement ce que -# `docs/responsabilites-locataire-hebergeur.md` refuse a l'hebergeur. +# `docs/hebergement/responsabilites-locataire-hebergeur.md` refuse a l'hebergeur. # # `pdns@public` ne sert que les zones publiques et est la seule a ecouter sur l'hote. # L'instance interne reste sur la boucle locale, sans une ligne changee. diff --git a/roles/serveur_powerdns/templates/sonde-zones.sh.j2 b/roles/serveur_powerdns/templates/sonde-zones.sh.j2 index a37cd09..ef3c327 100644 --- a/roles/serveur_powerdns/templates/sonde-zones.sh.j2 +++ b/roles/serveur_powerdns/templates/sonde-zones.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « zones » — l'autoritatif repond et sert ses zones # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_powerdns_sonde_minimum` (seuil impossible). set -uo pipefail diff --git a/roles/serveur_prometheus/meta/authentification.yml b/roles/serveur_prometheus/meta/authentification.yml index 3b5fb2b..dfd0b9a 100644 --- a/roles/serveur_prometheus/meta/authentification.yml +++ b/roles/serveur_prometheus/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: interne-sans-auth diff --git a/roles/serveur_prometheus/meta/flux.yml b/roles/serveur_prometheus/meta/flux.yml index 05a3ff2..362a20f 100644 --- a/roles/serveur_prometheus/meta/flux.yml +++ b/roles/serveur_prometheus/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de Prometheus (métriques). Voir docs/flux-conception.md. +# Flux réseau de Prometheus (métriques). Voir docs/conception/flux-conception.md. flux: - sens: egress port: 9100 diff --git a/roles/serveur_prometheus/meta/supervision.yml b/roles/serveur_prometheus/meta/supervision.yml index f0f128c..4514b1b 100644 --- a/roles/serveur_prometheus/meta/supervision.yml +++ b/roles/serveur_prometheus/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: collecte metier: supervision diff --git a/roles/serveur_prometheus/tasks/main.yml b/roles/serveur_prometheus/tasks/main.yml index 87be9ce..8f2508b 100644 --- a/roles/serveur_prometheus/tasks/main.yml +++ b/roles/serveur_prometheus/tasks/main.yml @@ -121,7 +121,7 @@ enabled: true state: started -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_prometheus/templates/sonde-collecte.sh.j2 b/roles/serveur_prometheus/templates/sonde-collecte.sh.j2 index 61cb520..1cc0677 100644 --- a/roles/serveur_prometheus/templates/sonde-collecte.sh.j2 +++ b/roles/serveur_prometheus/templates/sonde-collecte.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « collecte » — toutes les cibles declarees repondent au scrape # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_prometheus_sonde_url` (port ferme). set -uo pipefail diff --git a/roles/serveur_redis/meta/authentification.yml b/roles/serveur_redis/meta/authentification.yml index cb8aa8b..6b9ab81 100644 --- a/roles/serveur_redis/meta/authentification.yml +++ b/roles/serveur_redis/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: sans-auth-humaine diff --git a/roles/serveur_redis/meta/flux.yml b/roles/serveur_redis/meta/flux.yml index 51b234a..2a6cdcf 100644 --- a/roles/serveur_redis/meta/flux.yml +++ b/roles/serveur_redis/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de Redis. Voir docs/flux-conception.md. +# Flux réseau de Redis. Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 6379 diff --git a/roles/serveur_redis/meta/supervision.yml b/roles/serveur_redis/meta/supervision.yml index 80f76d3..b3434d1 100644 --- a/roles/serveur_redis/meta/supervision.yml +++ b/roles/serveur_redis/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # UNE SEULE SONDE, ET C'EST LA REGLE « une par CAUSE D'ACTION ». Redis peut cesser de # servir de deux facons, et les deux appellent le meme geste — aller voir Redis : diff --git a/roles/serveur_redis/templates/sonde-cache.sh.j2 b/roles/serveur_redis/templates/sonde-cache.sh.j2 index 67a3037..71acfde 100644 --- a/roles/serveur_redis/templates/sonde-cache.sh.j2 +++ b/roles/serveur_redis/templates/sonde-cache.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « cache » — le cache repond-il, et sert-il encore a quelque chose ? # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_redis_sonde_evictions_crit` (seuil impossible). # # UNE SEULE SONDE, PARCE QU'IL N'Y A QU'UNE CAUSE D'ACTION : « le cache ne sert plus ». diff --git a/roles/serveur_relais/meta/authentification.yml b/roles/serveur_relais/meta/authentification.yml index fca0427..e2d45fc 100644 --- a/roles/serveur_relais/meta/authentification.yml +++ b/roles/serveur_relais/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29. +# Voir docs/conception/authentification.md. Gardee par la preuve P29. authentification: portee: sans-auth-humaine raison: >- diff --git a/roles/serveur_relais/meta/flux.yml b/roles/serveur_relais/meta/flux.yml index ce98ba5..06cddf3 100644 --- a/roles/serveur_relais/meta/flux.yml +++ b/roles/serveur_relais/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux reseau du relais. Voir docs/flux-conception.md. +# Flux reseau du relais. Voir docs/conception/flux-conception.md. # # LE RELAIS N'EST PAS DANS LE PLAN DU SITE : aucun devis ne derive de regle de ces lignes # (son pare-feu est le sien, `templates/nftables.conf.j2`). Elles DISENT ce qui le traverse, diff --git a/roles/serveur_resolveur/README.md b/roles/serveur_resolveur/README.md index a269401..9e57b58 100644 --- a/roles/serveur_resolveur/README.md +++ b/roles/serveur_resolveur/README.md @@ -20,7 +20,7 @@ soigneusement réglées, le tenant A résoudrait les noms du tenant B. C'est l' qu'on protège partout ailleurs. Et un tenant dont le résolveur vit chez l'hébergeur **ne peut plus s'émanciper avec** -(voir `docs/filiation-emancipation.md`). +(voir `docs/conception/filiation-emancipation.md`). La récursion est générique ; **la zone interne ne l'est pas**. C'est ce qui fait du résolveur un service de tenant, et non de fabric. diff --git a/roles/serveur_resolveur/defaults/main.yml b/roles/serveur_resolveur/defaults/main.yml index 4b024f8..20d485a 100644 --- a/roles/serveur_resolveur/defaults/main.yml +++ b/roles/serveur_resolveur/defaults/main.yml @@ -13,7 +13,7 @@ # résolveur partagé par tout le SITE devrait connaître la zone interne de CHAQUE tenant. # Sans vues par réseau soigneusement réglées, le tenant A résoudrait les noms du tenant B # — l'étanchéité qu'on protège partout ailleurs. Et un tenant dont le résolveur vit chez -# l'hébergeur ne peut plus s'émanciper avec (docs/filiation-emancipation.md). +# l'hébergeur ne peut plus s'émanciper avec (docs/conception/filiation-emancipation.md). # # La récursion est générique ; la ZONE INTERNE ne l'est pas. C'est ce qui fait du # résolveur un service de TENANT, et non de fabric. diff --git a/roles/serveur_resolveur/meta/authentification.yml b/roles/serveur_resolveur/meta/authentification.yml index 8b9bd1c..4b8755d 100644 --- a/roles/serveur_resolveur/meta/authentification.yml +++ b/roles/serveur_resolveur/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29. +# Voir docs/conception/authentification.md. Gardee par la preuve P29. authentification: portee: sans-auth-humaine mecanisme: aucun diff --git a/roles/serveur_resolveur/meta/flux.yml b/roles/serveur_resolveur/meta/flux.yml index 994234f..e74cb2b 100644 --- a/roles/serveur_resolveur/meta/flux.yml +++ b/roles/serveur_resolveur/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du résolveur du tenant. Voir docs/flux-conception.md. +# Flux réseau du résolveur du tenant. Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 53 diff --git a/roles/serveur_resolveur/meta/supervision.yml b/roles/serveur_resolveur/meta/supervision.yml index b5f28f6..ec0c899 100644 --- a/roles/serveur_resolveur/meta/supervision.yml +++ b/roles/serveur_resolveur/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: resolution metier: noms diff --git a/roles/serveur_resolveur/tasks/main.yml b/roles/serveur_resolveur/tasks/main.yml index 3d9d692..9e749ed 100644 --- a/roles/serveur_resolveur/tasks/main.yml +++ b/roles/serveur_resolveur/tasks/main.yml @@ -54,7 +54,7 @@ label: "{{ item.nom }} {{ item.type }}" when: not ansible_check_mode -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_resolveur/templates/sonde-resolution.sh.j2 b/roles/serveur_resolveur/templates/sonde-resolution.sh.j2 index a4bec4f..508f968 100644 --- a/roles/serveur_resolveur/templates/sonde-resolution.sh.j2 +++ b/roles/serveur_resolveur/templates/sonde-resolution.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « resolution » — il resout la zone interne ET l'Internet # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_resolveur_sonde_nom_interne` / `_nom_public` (noms inexistants). set -uo pipefail diff --git a/roles/serveur_resolveur_site/meta/authentification.yml b/roles/serveur_resolveur_site/meta/authentification.yml index 5530409..d54c745 100644 --- a/roles/serveur_resolveur_site/meta/authentification.yml +++ b/roles/serveur_resolveur_site/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29. +# Voir docs/conception/authentification.md. Gardee par la preuve P29. authentification: portee: sans-auth-humaine mecanisme: aucun diff --git a/roles/serveur_resolveur_site/meta/flux.yml b/roles/serveur_resolveur_site/meta/flux.yml index 4eefe61..348318b 100644 --- a/roles/serveur_resolveur_site/meta/flux.yml +++ b/roles/serveur_resolveur_site/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau du RÉSOLVEUR DU SITE. Voir docs/flux-conception.md. +# Flux réseau du RÉSOLVEUR DU SITE. Voir docs/conception/flux-conception.md. # # TROISIÈME SERVICE QUE LE SITE PRÊTE À SES LOCATAIRES, après les paquets # (`serveur_cache_site`) et le génome (`serveur_forge_site`). Même patron, même raison : diff --git a/roles/serveur_resolveur_site/meta/supervision.yml b/roles/serveur_resolveur_site/meta/supervision.yml index 86a94b6..452cc15 100644 --- a/roles/serveur_resolveur_site/meta/supervision.yml +++ b/roles/serveur_resolveur_site/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # CE QUE `serveur_resolveur` SURVEILLE DEJA : `resolution` (le resolveur repond-il ?) et # `zones` (sert-il encore ses zones ?). Vrai pour n'importe quel resolveur. diff --git a/roles/serveur_rspamd/README.md b/roles/serveur_rspamd/README.md index 49c7b10..52fce98 100644 --- a/roles/serveur_rspamd/README.md +++ b/roles/serveur_rspamd/README.md @@ -2,7 +2,7 @@ **Antispam + signature DKIM** : rspamd 3.x (Debian 13), branché en **milter** sur Postfix (nœud *edge-mta*), avec Redis local comme backend. **Ne stocke aucune boîte.** -Cf. `docs/courriel-conception.md`. +Cf. `docs/conception/courriel-conception.md`. ## Rôle - Installe `rspamd` et `redis-server` (backend local, non partagé). diff --git a/roles/serveur_rspamd/defaults/main.yml b/roles/serveur_rspamd/defaults/main.yml index 697ff0d..6a1b8fb 100644 --- a/roles/serveur_rspamd/defaults/main.yml +++ b/roles/serveur_rspamd/defaults/main.yml @@ -1,7 +1,7 @@ --- # rspamd 3.x (Debian 13) — antispam + signature DKIM, branché en MILTER sur Postfix # (nœud edge-mta). Backend Redis local. Config par surcharges dans /etc/rspamd/local.d/. -# Cf. docs/courriel-conception.md. NE STOCKE AUCUNE BOÎTE. +# Cf. docs/conception/courriel-conception.md. NE STOCKE AUCUNE BOÎTE. serveur_rspamd_paquets: - rspamd diff --git a/roles/serveur_rspamd/meta/authentification.yml b/roles/serveur_rspamd/meta/authentification.yml index 98aecd8..d2c5b08 100644 --- a/roles/serveur_rspamd/meta/authentification.yml +++ b/roles/serveur_rspamd/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: sans-auth-humaine diff --git a/roles/serveur_rspamd/meta/flux.yml b/roles/serveur_rspamd/meta/flux.yml index 248053e..a883165 100644 --- a/roles/serveur_rspamd/meta/flux.yml +++ b/roles/serveur_rspamd/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de rspamd (antispam + DKIM, milter Postfix). Voir docs/flux-conception.md. +# Flux réseau de rspamd (antispam + DKIM, milter Postfix). Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 11332 diff --git a/roles/serveur_rspamd/meta/supervision.yml b/roles/serveur_rspamd/meta/supervision.yml index 5cef487..bc34b57 100644 --- a/roles/serveur_rspamd/meta/supervision.yml +++ b/roles/serveur_rspamd/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # UNE SEULE SONDE, une seule CAUSE D'ACTION : aller voir rspamd. # diff --git a/roles/serveur_step_ca/meta/authentification.yml b/roles/serveur_step_ca/meta/authentification.yml index cf67887..1c4f311 100644 --- a/roles/serveur_step_ca/meta/authentification.yml +++ b/roles/serveur_step_ca/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: sans-auth-humaine diff --git a/roles/serveur_step_ca/meta/flux.yml b/roles/serveur_step_ca/meta/flux.yml index 1da2751..2fd29d2 100644 --- a/roles/serveur_step_ca/meta/flux.yml +++ b/roles/serveur_step_ca/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux réseau de l'autorité de certification interne (step-ca). Voir docs/flux-conception.md. +# Flux réseau de l'autorité de certification interne (step-ca). Voir docs/conception/flux-conception.md. flux: - sens: ingress port: 8443 diff --git a/roles/serveur_step_ca/meta/supervision.yml b/roles/serveur_step_ca/meta/supervision.yml index bb9bda8..192466e 100644 --- a/roles/serveur_step_ca/meta/supervision.yml +++ b/roles/serveur_step_ca/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. sondes: - nom: autorite metier: confiance diff --git a/roles/serveur_step_ca/tasks/main.yml b/roles/serveur_step_ca/tasks/main.yml index 04d4728..6ffb4eb 100644 --- a/roles/serveur_step_ca/tasks/main.yml +++ b/roles/serveur_step_ca/tasks/main.yml @@ -205,7 +205,7 @@ state: started daemon_reload: true -# --- Sonde de supervision (docs/supervision-conception.md) -------------------------- +# --- Sonde de supervision (docs/conception/supervision-conception.md) -------------------------- # Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la # fait tourner et pousse le verdict, sans savoir ce qu'elle mesure. - name: Assurer le repertoire des sondes de supervision diff --git a/roles/serveur_step_ca/templates/sonde-autorite.sh.j2 b/roles/serveur_step_ca/templates/sonde-autorite.sh.j2 index ead0a1f..25e5ea0 100644 --- a/roles/serveur_step_ca/templates/sonde-autorite.sh.j2 +++ b/roles/serveur_step_ca/templates/sonde-autorite.sh.j2 @@ -3,7 +3,7 @@ # # SONDE « autorite » — l'autorite de certification repond et sa racine est valide # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_step_ca_sonde_url` (port ferme). set -uo pipefail diff --git a/roles/serveur_web_dorsal/meta/authentification.yml b/roles/serveur_web_dorsal/meta/authentification.yml index 2d7fc42..64d64ab 100644 --- a/roles/serveur_web_dorsal/meta/authentification.yml +++ b/roles/serveur_web_dorsal/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: sans-auth-humaine diff --git a/roles/serveur_web_dorsal/meta/flux.yml b/roles/serveur_web_dorsal/meta/flux.yml index e0021b6..6b94092 100644 --- a/roles/serveur_web_dorsal/meta/flux.yml +++ b/roles/serveur_web_dorsal/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux reseau du dorsal web (propriete du role). Voir docs/flux-conception.md. +# Flux reseau du dorsal web (propriete du role). Voir docs/conception/flux-conception.md. # L'app ecoute en LOCALHOST (pas de flux inter-noeud) ; le nginx local la fronte. flux: # LE DORSAL EST RELAYE PAR DEUX PORTES (2026-09-29) : l'edge pour les noms internes diff --git a/roles/serveur_web_dorsal/meta/supervision.yml b/roles/serveur_web_dorsal/meta/supervision.yml index bf4729a..e2925f6 100644 --- a/roles/serveur_web_dorsal/meta/supervision.yml +++ b/roles/serveur_web_dorsal/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # CE QUE `client_sante` RAPPORTE DEJA : les unites systemd EN ECHEC de la machine. C'est # la base, et elle ne suffit pas ici. diff --git a/roles/serveur_web_frontal/meta/authentification.yml b/roles/serveur_web_frontal/meta/authentification.yml index 74fecc2..549782b 100644 --- a/roles/serveur_web_frontal/meta/authentification.yml +++ b/roles/serveur_web_frontal/meta/authentification.yml @@ -1,6 +1,6 @@ --- # Position de ce role dans la directive d'authentification (D-38..D-41). -# Voir docs/authentification.md. Gardee par la preuve P29 : un role sans cette +# Voir docs/conception/authentification.md. Gardee par la preuve P29 : un role sans cette # declaration, ou dont la declaration contredit son code, fait echouer le harnais. authentification: portee: sans-auth-humaine diff --git a/roles/serveur_web_frontal/meta/flux.yml b/roles/serveur_web_frontal/meta/flux.yml index 14bbb48..431bedf 100644 --- a/roles/serveur_web_frontal/meta/flux.yml +++ b/roles/serveur_web_frontal/meta/flux.yml @@ -1,5 +1,5 @@ --- -# Flux reseau du frontal web (propriete du role). Voir docs/flux-conception.md. +# Flux reseau du frontal web (propriete du role). Voir docs/conception/flux-conception.md. # # LE WEB FRONTAL EST LA PORTE PUBLIQUE DU LOCATAIRE (2026-09-29). L'edge expose les services # INTERNES a l'administration ; ce qui est publie sur l'Internet l'est ici, par l'adresse diff --git a/roles/serveur_web_frontal/meta/supervision.yml b/roles/serveur_web_frontal/meta/supervision.yml index 870557c..1b1c0e0 100644 --- a/roles/serveur_web_frontal/meta/supervision.yml +++ b/roles/serveur_web_frontal/meta/supervision.yml @@ -1,5 +1,5 @@ --- -# Supervision derivee du role. Voir docs/supervision-conception.md. +# Supervision derivee du role. Voir docs/conception/supervision-conception.md. # # LE FRONTAL EST LA PORTE PUBLIQUE : s'il tombe, tout ce que le locataire publie tombe avec # lui, pendant que les services derriere restent verts. Et un frontal peut tres bien diff --git a/roles/serveur_web_frontal/templates/sonde-frontal.sh.j2 b/roles/serveur_web_frontal/templates/sonde-frontal.sh.j2 index 1685f60..00e5985 100644 --- a/roles/serveur_web_frontal/templates/sonde-frontal.sh.j2 +++ b/roles/serveur_web_frontal/templates/sonde-frontal.sh.j2 @@ -4,7 +4,7 @@ # SONDE « frontal » — le reverse proxy public tient, son WAF est charge, et chaque # exposition publique repond a travers lui. # -# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_web_frontal_waf_mode` (une valeur que le moteur # refuse fait echouer `nginx -t`). set -uo pipefail diff --git a/scripts/appliquer_opnsense.py b/scripts/appliquer_opnsense.py index 7dd0074..303abde 100644 --- a/scripts/appliquer_opnsense.py +++ b/scripts/appliquer_opnsense.py @@ -49,7 +49,7 @@ def _voute(base: Path) -> dict: La frontiere appartient au MONDE PHYSIQUE : sa cle d'API vit dans la voute de l'underlay, chez l'hebergeur, pas chez un locataire (2026-08-22, cf. - docs/frontiere-physique-virtuel.md). `proxmox_api.voute` porte deja cette regle et son + docs/conception/frontiere-physique-virtuel.md). `proxmox_api.voute` porte deja cette regle et son repli sur la voute du tenant pendant la migration : la reecrire ici aurait fait une dixieme copie le jour meme ou l'on refermait les neuf autres. """ diff --git a/scripts/appliquer_proxmox_fw.py b/scripts/appliquer_proxmox_fw.py index c5a98ff..c38ebaa 100644 --- a/scripts/appliquer_proxmox_fw.py +++ b/scripts/appliquer_proxmox_fw.py @@ -36,7 +36,7 @@ from __future__ import annotations # propose une mise a jour eternelle qu'il vient pourtant d'appliquer. # # REJECT ET NON DROP : cette couche filtre l'interne. Voir la preuve P53 et -# `docs/flux-conception.md` — l'interne parle, la bordure se tait. +# `docs/conception/flux-conception.md` — l'interne parle, la bordure se tait. POLITIQUE_VM = "REJECT" import json diff --git a/scripts/contexte.py b/scripts/contexte.py index 6803fac..94efbd7 100644 --- a/scripts/contexte.py +++ b/scripts/contexte.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """Le contexte d'un ecosysteme : un tronc commun, deux classes (SITE et LOCATAIRE). -Conception : `docs/conception-contextes.md` (arretee avec l'exploitant le 2026-10-04). +Conception : `docs/conception/conception-contextes.md` (arretee avec l'exploitant le 2026-10-04). POURQUOI CE MODULE. Le 2026-10-04, 33 scripts DEVINAIENT leur contexte, chacun a sa facon : le lien `instance/`, le lien `underlay.yml`, les variables `SETOPS_*`, les dossiers freres, @@ -325,7 +325,7 @@ class Site(Ecosysteme): chemin = locataire.depot / NOM_FICHIER_FICHE_SITE entete = (f"# GENERE par le site {self.nom} (scripts/contexte.py --deposer-fiches).\n" "# Ne pas editer : c'est ce que le site attribue et offre a ce locataire.\n" - "# Voir docs/conception-contextes.md §2.4.\n") + "# Voir docs/conception/conception-contextes.md §2.4.\n") chemin.write_text(entete + yaml.safe_dump(self.fiche_pour(locataire), allow_unicode=True, sort_keys=False), encoding="utf-8") return chemin @@ -401,7 +401,7 @@ class Locataire(Ecosysteme): chemin = self.depot / NOM_FICHIER_FACE_RESEAU entete = (f"# GENERE par le locataire {self.nom} (scripts/contexte.py --publier-faces).\n" "# Ne pas editer : c'est ce que ce locataire demande a son site. A republier\n" - "# apres `make instancier` ou `make flux`. Voir docs/conception-contextes.md §2.4.\n") + "# apres `make instancier` ou `make flux`. Voir docs/conception/conception-contextes.md §2.4.\n") chemin.write_text(entete + yaml.safe_dump(self.face_reseau(), allow_unicode=True, sort_keys=False), encoding="utf-8") return chemin @@ -588,7 +588,7 @@ class Locataire(Ecosysteme): "dns_public": dns_public, "sauvegarde": {"cle_publique": cle_sauvegarde}, # SON DEPOT DU GENOME, ET LA CLE QUI LE LIT (2026-10-11, - # `docs/depots-prives-conception.md`). Le depot devient prive sur la forge du site ; + # `docs/conception/depots-prives-conception.md`). Le depot devient prive sur la forge du site ; # le site enregistre cette cle publique comme cle de deploiement EN LECTURE sur ce # seul depot. Une cle publique, rien de secret : la privee vit dans la voute du # locataire et n'arrive au runner qu'a l'armement. diff --git a/scripts/devis_certificats.py b/scripts/devis_certificats.py index ff710c5..feadfb9 100755 --- a/scripts/devis_certificats.py +++ b/scripts/devis_certificats.py @@ -4,7 +4,7 @@ Lit les relevés déposés par `playbooks/maintenance/devis-certificats.yml`. Aucun accès réseau ici. Sort en code 1 s'il y a un écart. -Le défaut traqué est connu et récurrent (voir `docs/autorisation.md` et le journal) : un +Le défaut traqué est connu et récurrent (voir `docs/exploitation/autorisation.md` et le journal) : un certificat renouvelé SUR DISQUE mais toujours servi PÉRIMÉ depuis la mémoire du service, tant que nginx / postfix / dovecot / slapd n'ont pas été rechargés. Rien ne le signale — le fichier est bon, `step` est content, et le client voit un certificat expiré. diff --git a/scripts/devis_opnsense.py b/scripts/devis_opnsense.py index a824c89..326f849 100644 --- a/scripts/devis_opnsense.py +++ b/scripts/devis_opnsense.py @@ -299,7 +299,7 @@ def cibles_par_role(role: str, inventaire: Path) -> list[str]: # # L'outil a bien refuse d'appliquer quoi que ce soit, mais le devis, lui, annoncait un # objet impossible. Un devis qui promet ce que la cible refusera n'est pas un devis. -# LA FACE RESEAU D'ABORD (2026-10-05, docs/conception-contextes.md §6, etape 3). Le locataire +# LA FACE RESEAU D'ABORD (2026-10-05, docs/conception/conception-contextes.md §6, etape 3). Le locataire # publie `face-reseau.yml` : ses groupes et leurs adresses, son administration, son tunnel, ses # zones publiques, le verdict de ses flux conditionnels. La frontiere ne lit plus son inventaire, # ses variables ni son plan. Sans face publiee (transition), l'ancienne lecture, et on le dit. diff --git a/scripts/devis_proxmox_fw.py b/scripts/devis_proxmox_fw.py index f993251..68fec0f 100644 --- a/scripts/devis_proxmox_fw.py +++ b/scripts/devis_proxmox_fw.py @@ -4,7 +4,7 @@ DERIVE du meme registre des flux que les nftables d'hote et que la frontiere. Les trois lisent `roles/*/meta/flux.yml` par les MEMES fonctions : ils ne peuvent pas diverger. -PARTAGE DES ROLES (cf. docs/sdn-evpn.md) : +PARTAGE DES ROLES (cf. docs/conception/sdn-evpn.md) : - ce devis : est-ouest INTRA-tenant, applique par l'hyperviseur ; - `make flux` : la meme politique, rejouee sur l'hote lui-meme (defense en profondeur — une VM compromise franchit deux barrieres) ; @@ -164,7 +164,7 @@ def construire(tenants: list[tuple[str, str, dict]]) -> dict: blocs: list[dict] = [] for nom, pfx, n in tenants: - # LA FACE RESEAU D'ABORD (2026-10-05, docs/conception-contextes.md §6, etape 3). Le + # LA FACE RESEAU D'ABORD (2026-10-05, docs/conception/conception-contextes.md §6, etape 3). Le # locataire publie ses machines, ses groupes, son administration et le verdict de ses # flux conditionnels (`face-reseau.yml`) ; le devis ne lit plus son inventaire ni ses # variables. Sans face publiee (transition), l'ancienne lecture, et on le dit. diff --git a/scripts/devis_proxmox_pools.py b/scripts/devis_proxmox_pools.py index 390d889..665f9c5 100644 --- a/scripts/devis_proxmox_pools.py +++ b/scripts/devis_proxmox_pools.py @@ -109,7 +109,7 @@ def construire(tenants: list[tuple[str, str, dict]]) -> dict: for nom_instance, _prefixe, nomenclature in tenants: index = int(nomenclature["index"]) membres, sans_vmid = [], [] - # LA FACE RESEAU D'ABORD (2026-10-05, docs/conception-contextes.md §6, etape 3) : le + # LA FACE RESEAU D'ABORD (2026-10-05, docs/conception/conception-contextes.md §6, etape 3) : le # locataire publie ses machines, leur VMID et leur etat ; le devis ne lit plus son plan. face = _face_publiee(nom_instance) if face is not None: diff --git a/scripts/devis_reseau.py b/scripts/devis_reseau.py index 01a86c9..a025ddd 100644 --- a/scripts/devis_reseau.py +++ b/scripts/devis_reseau.py @@ -659,7 +659,7 @@ def decouvrir_du_site() -> list[tuple[str, str, dict]]: portes = underlay_mod.tenants_du_site(underlay_mod.charger()) if portes is None: return tenants - # LA FACE RESEAU D'ABORD (2026-10-05, docs/conception-contextes.md §6, etape 3). Les noms + # LA FACE RESEAU D'ABORD (2026-10-05, docs/conception/conception-contextes.md §6, etape 3). Les noms # viennent du site (`underlay.tenants`) ; l'index et les zones, de ce que chaque locataire # PUBLIE (`face-reseau.yml`, champ `nomenclature`) — plus de sa nomenclature. Sans face # publiee (transition), sa nomenclature, et on le dit. diff --git a/scripts/devis_sdn.py b/scripts/devis_sdn.py index 95a023a..a68d278 100644 --- a/scripts/devis_sdn.py +++ b/scripts/devis_sdn.py @@ -6,7 +6,7 @@ cluster, UNE ZONE EVPN (le VRF du tenant), UN VNET par zone de securite, et UN SOUS-RESEAU par VNet avec sa passerelle anycast. Sans ces objets, aucune VM ne peut etre branchee — le plan de controle existe, le plan de donnees non. -Tout DERIVE du seed `index` (cf. docs/sdn-evpn.md §2) : le VNI est +Tout DERIVE du seed `index` (cf. docs/conception/sdn-evpn.md §2) : le VNI est `1000 + index*10 + zone`, le sous-reseau et la passerelle viennent des memes fonctions que l'inventaire. Rien n'est saisi deux fois. diff --git a/scripts/fiche_role.py b/scripts/fiche_role.py index c0fb12e..c09b26a 100755 --- a/scripts/fiche_role.py +++ b/scripts/fiche_role.py @@ -129,7 +129,7 @@ def fiche(role: str) -> str: L.append(f"| `{s['nom']}` | {s.get('ttl', '—')} s | {s.get('raison', '').strip()} |") else: L.append("*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare " - "aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*") + "aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.*") L.append("") # LES DEUX MOITIES DE `metriques.yml` SONT INDEPENDANTES, ET LA FICHE LES LISAIT @@ -150,7 +150,7 @@ def fiche(role: str) -> str: L += ["*Aucun exportateur propre : les séries viennent d'un collecteur universel " "(`node_exporter`), déclaré une seule fois.*", ""] else: - L.append("*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*") + L.append("*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.*") if panneaux: L += ["| panneau | unité | pourquoi on le regarde |", "|---|---|---|"] for p in panneaux: diff --git a/scripts/forge_amorcer.py b/scripts/forge_amorcer.py index 08dc01c..16cae07 100644 --- a/scripts/forge_amorcer.py +++ b/scripts/forge_amorcer.py @@ -46,7 +46,7 @@ sys.path.insert(0, str(RACINE / "scripts")) import underlay as underlay_mod # noqa: E402 -# LES DEPOTS QUI NAISSENT PRIVES (2026-10-11, `docs/depots-prives-conception.md`) : le plan +# LES DEPOTS QUI NAISSENT PRIVES (2026-10-11, `docs/conception/depots-prives-conception.md`) : le plan # d'un ecosysteme et la carte du site ne regardent que leur runner et celui du site. La MEME # liste que `serveur_ops_roles_prives` du role, qui les clone en SSH. ROLES_PRIVES = {"instance", "tenant", "hebergeur"} diff --git a/scripts/forge_cles.py b/scripts/forge_cles.py index 6210257..85308f0 100644 --- a/scripts/forge_cles.py +++ b/scripts/forge_cles.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """Le site enregistre, sur le depot de chaque locataire, la cle qui le lira. Rien d'autre. -POURQUOI (2026-10-11, `docs/depots-prives-conception.md`). Les depots des locataires deviennent +POURQUOI (2026-10-11, `docs/conception/depots-prives-conception.md`). Les depots des locataires deviennent prives sur la forge du site. Chaque runner de locataire lit LE SIEN avec une cle de deploiement EN LECTURE SEULE : la cle publique que sa face reseau publie (`genome.cle_lecture`). Le site l'enregistre avec ses propres identifiants d'administration de la forge ; aucun secret ne passe diff --git a/scripts/forge_etancheite.py b/scripts/forge_etancheite.py index 48b22f5..7f82c82 100644 --- a/scripts/forge_etancheite.py +++ b/scripts/forge_etancheite.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """La forge du site laisse-t-elle chaque runner lire ses depots, et personne d'autre ? -POURQUOI (2026-10-11, `docs/depots-prives-conception.md`). Le plan d'un ecosysteme et la carte +POURQUOI (2026-10-11, `docs/conception/depots-prives-conception.md`). Le plan d'un ecosysteme et la carte du site sont prives sur la forge du site ; chaque runner de locataire lit le sien avec une cle de deploiement en lecture seule. Deux mesures, depuis deux endroits : diff --git a/scripts/instancier.py b/scripts/instancier.py index edeb9b8..b78d5aa 100644 --- a/scripts/instancier.py +++ b/scripts/instancier.py @@ -70,7 +70,7 @@ PLACEMENT = [("noeud", "proxmox_noeud"), ("stockage", "proxmox_stockage"), # Une application declare ses 'liens' ([{vers, role}]) dans plan/applications.yml ; # chaque role decrit les liens qu'il accepte dans roles//meta/liens.yml # (setops_liens.accepte). instancier resout la cible (FQDN interne derive) et injecte -# les variables en host_vars du consommateur. Cf. docs/bindings-conception.md. +# les variables en host_vars du consommateur. Cf. docs/conception/bindings-conception.md. def _domaine_interne() -> str: """Lit domaine_interne dans group_vars/all de l'instance (keystone, non chiffre).""" @@ -90,7 +90,7 @@ def _domaine_interne() -> str: def _fiche_du_site() -> dict | None: """La fiche que l'hebergeur a deposee chez CE locataire (`fiche-site.yml`), ou None. - ETAPE 3 DU CHEMIN (docs/conception-contextes.md §6). Trois valeurs de l'inventaire venaient + ETAPE 3 DU CHEMIN (docs/conception/conception-contextes.md §6). Trois valeurs de l'inventaire venaient d'une lecture DIRECTE du site, monte sur le poste : la zone a deleguer et ses resolveurs, les serveurs de temps, le mode de routage. Generer sur le runner du locataire, qui n'a pas le depot du site, les aurait perdues. La fiche les porte, et l'inventaire devient le meme diff --git a/scripts/inventory_gui.py b/scripts/inventory_gui.py index c41ca83..0b6f90a 100644 --- a/scripts/inventory_gui.py +++ b/scripts/inventory_gui.py @@ -130,7 +130,7 @@ def _depot_hebergeur() -> Path | None: # underlay.yml -> je materialise sur CETTE fabric (j'ai celle du site) # # C'est la meme coupure que `roles/serveur_ops` exige deja dans son assertion, et que -# `docs/responsabilites-locataire-hebergeur.md` nomme : calculer, configurer, materialiser. +# `docs/hebergement/responsabilites-locataire-hebergeur.md` nomme : calculer, configurer, materialiser. def contexte() -> dict: """La portee de cette console — DELEGUEE a la classe qui la sert. @@ -567,7 +567,7 @@ def couches_api() -> list: # APPARTIENT, rendent cette derive impossible : il n'y a plus qu'un seul endroit ou la # charge se compose. # -# CE QUE CHAQUE BRANCHE EST, au sens de `docs/responsabilites-locataire-hebergeur.md` : +# CE QUE CHAQUE BRANCHE EST, au sens de `docs/hebergement/responsabilites-locataire-hebergeur.md` : # # ConsoleLocataire configure SES services — voute du tenant, plan derive d'un seed # ConsoleSite materialise le terrain — voute du site, plan DECLARE (ip, vmid) @@ -1382,7 +1382,7 @@ def veille_site(depot: Path) -> list[dict]: def console(inventaire: Path | None = None) -> Console: """QUELLE console sert cette machine — derive de ce qu'elle peut OUVRIR. - `docs/responsabilites-locataire-hebergeur.md` attache chaque pouvoir a une voute : + `docs/hebergement/responsabilites-locataire-hebergeur.md` attache chaque pouvoir a une voute : calculer n'en demande aucune, configurer celle du tenant, materialiser celle du site. On ne prouve pas qu'une voute s'ouvre — le mot de passe se tape a l'execution — mais son ABSENCE est decisive et se mesure sans rien ouvrir. @@ -1894,7 +1894,7 @@ def ecrire_intrants(payload: dict) -> None: "# API keys > « + ». Le secret n'est affiche qu'a la creation.\n" "#\n" "# Le boitier est HORS FLOTTE Ansible : on ne fait que piloter son API REST\n" - "# depuis le controleur. Cf. docs/frontiere-opnsense.md.\n" + "# depuis le controleur. Cf. docs/conception/frontiere-opnsense.md.\n" "#\n" "# Les interfaces se nomment par leur IDENTIFIANT OPNsense (wan, opt1...), celui\n" "# que parle l'API REST — ni le peripherique FreeBSD (igb1), ni le libelle affiche.\n" @@ -3214,7 +3214,7 @@ let selMachine = null;
Lecture seule. Éditer docs/couches-deploiement.yml ; généré dans playbooks/site.yml par make site.
Vérifier ce qui a été remonté. Un déploiement vert ne dit pas que le service rend son service. Les devis de service lisent le système en marche et le comparent à ce que le plan dérive — ils n'écrivent rien et sortent en erreur s'il y a un écart : make identite-plan, make certificats-plan, make expositions-plan, make postgresql-plan, make courriel-plan. - Détail dans docs/devis-services.md.
`; + Détail dans docs/exploitation/devis-services.md.`; } } diff --git a/scripts/prouver.py b/scripts/prouver.py index 0b070d5..5910fe6 100644 --- a/scripts/prouver.py +++ b/scripts/prouver.py @@ -108,16 +108,28 @@ def preuve_handlers() -> tuple[bool, str]: return True, "Tout notify pointe vers un handler du meme role (49 roles)." +def _documents() -> list[Path]: + """Les documents de `docs/`, sous-dossiers compris, hors pieces d'audit. + + RANGES PAR LECTEUR DEPUIS LE 2026-10-15 (`conception/`, `exploitation/`, `hebergement/`, + `projet/`). Un `glob("*.md")` au premier niveau n'en verrait plus que les portes d'entree : + les gardes qui lisent « tous les documents » en perdraient quarante sans rien dire. + """ + return sorted(p for p in (RACINE / "docs").rglob("*.md") + if "audit" not in p.relative_to(RACINE / "docs").parts) + + def preuve_runbooks() -> tuple[bool, str]: """Les runbooks / registres cites par les surfaces publiques existent.""" attendus = [ - "docs/plan-et-generation.md", "docs/catalogue-services.md", - "docs/dependances-groupes.yml", "docs/dns-interne.md", - "docs/nomenclature-vm.md", "docs/config-proxmox.md", "docs/vm-lifecycle.md", - "docs/procedure-template-debian13-proxmox.md", "docs/positionnement.md", - "docs/bindings-conception.md", "docs/flux-conception.md", - "docs/couches-deploiement.yml", "docs/registre-flux.md", - "docs/carte-set-ops.md", "docs/runbooks-exploitation.md", + "docs/conception/plan-et-generation.md", "docs/projet/catalogue-services.md", + "docs/dependances-groupes.yml", "docs/conception/dns-interne.md", + "docs/conception/nomenclature-vm.md", "docs/exploitation/config-proxmox.md", "docs/exploitation/vm-lifecycle.md", + "docs/exploitation/procedure-template-debian13-proxmox.md", "docs/projet/positionnement.md", + "docs/conception/bindings-conception.md", "docs/conception/flux-conception.md", + "docs/couches-deploiement.yml", "docs/conception/registre-flux.md", + "docs/README.md", "docs/architecture.md", "docs/setup.md", "docs/usage.md", + "docs/conception/mecanismes.md", "docs/exploitation/runbooks-exploitation.md", "exemples/vault.exemple.yml", "exemples/instance.exemple.yml", ] manquants = [f for f in attendus if not (RACINE / f).exists()] @@ -573,8 +585,8 @@ def preuve_enumerations_annoncees() -> tuple[bool, str]: Une annonce enfouie au milieu d'une phrase reste hors de portee, et c'est assume : mieux vaut une garde etroite qui dit vrai qu'une large qui devine. """ - docs = (sorted((RACINE / "docs").glob("*.md")) + sorted((RACINE / "wiki").glob("*.md")) - + [RACINE / "AGENTS.md", RACINE / "README.md", RACINE / "QUICKSTART.md"]) + docs = (_documents() + sorted((RACINE / "wiki").glob("*.md")) + + [RACINE / "AGENTS.md", RACINE / "README.md"]) mot = "|".join(NOMBRES_FR) forme_a = rf"\bil y (?:en )?a\s+(?:\*\*)?({mot})(?:\*\*)?\b[^:]{{0,20}}:\s*$" forme_b = rf"\bles\s+(?:\*\*)?({mot})(?:\*\*)?\s+lignes\s+du\s+§\s*(\d+)" @@ -628,7 +640,7 @@ def preuve_enumerations_annoncees() -> tuple[bool, str]: def preuve_habilitations_declarees() -> tuple[bool, str]: """Chaque service qui accorde quelque chose declare A QUI, et par quel mecanisme. - LA LACUNE QUE CETTE PREUVE COMBLE (2026-09-07). `docs/autorisation.md` posait la + LA LACUNE QUE CETTE PREUVE COMBLE (2026-09-07). `docs/exploitation/autorisation.md` posait la regle — un service nomme un GROUPE, jamais une personne (D-66) — et `meta/acces.yml` la portait. Rien ne la verifiait : ni qu'un service `web-sso` en porte un, ni que le mecanisme annonce existe. Le §5 d'`authentification.md` dit pourtant l'inverse en @@ -802,7 +814,7 @@ def preuve_authentification() -> tuple[bool, str]: # LE TABLEAU DU DOCUMENT DOIT DIRE LA MEME CHOSE QUE LES DECLARATIONS (2026-09-06). # - # `docs/authentification.md` §5 recopie ces portees avec, en troisieme colonne, soit un + # `docs/conception/authentification.md` §5 recopie ces portees avec, en troisieme colonne, soit un # COMPTE, soit la LISTE des roles. Les deux derivent de ce qu'on vient de lire — et les # deux avaient cesse d'etre vrais : la table annoncait 12 roles `sans-auth-humaine`, il # y en a 21. Personne ne l'avait vu parce que rien ne les confrontait ; la preuve lisait @@ -810,7 +822,7 @@ def preuve_authentification() -> tuple[bool, str]: # # On accepte les DEUX formes, parce que les deux sont legitimes : un compte quand la # liste serait illisible, la liste quand elle tient et qu'elle informe davantage. - doc = RACINE / "docs" / "authentification.md" + doc = RACINE / "docs" / "conception" / "authentification.md" if doc.is_file(): for ligne in doc.read_text(encoding="utf-8").splitlines(): m = re.match(r"\|\s*`([a-z-]+)`\s*\|.*\|\s*([^|]+?)\s*\|\s*$", ligne) @@ -820,13 +832,13 @@ def preuve_authentification() -> tuple[bool, str]: reels = sorted(n.replace("serveur_", "") for n in par_portee.get(portee, [])) if cellule.isdigit(): if int(cellule) != len(reels): - fautes.append(f"docs/authentification.md : la portee '{portee}' est " + fautes.append(f"docs/conception/authentification.md : la portee '{portee}' est " f"annoncee pour {cellule} role(s), il y en a {len(reels)}") else: cites = sorted(x.strip().replace("-", "_") for x in cellule.split(",") if x.strip()) if cites != reels: - fautes.append(f"docs/authentification.md : la portee '{portee}' cite " + fautes.append(f"docs/conception/authentification.md : la portee '{portee}' cite " f"{cites}, les declarations disent {reels}") if fautes: @@ -835,7 +847,7 @@ def preuve_authentification() -> tuple[bool, str]: resume = ", ".join(f"{k} {len(v)}" for k, v in sorted(par_portee.items())) suffixe = f" ; {len(lacunes)} lacune(s) nommee(s) : {', '.join(lacunes)}" if lacunes else "" return True, (f"{total} role(s) serveur declares ({resume}){suffixe} ; " - f"le tableau de docs/authentification.md dit la meme chose.") + f"le tableau de docs/conception/authentification.md dit la meme chose.") def preuve_propriete_des_intrants() -> tuple[bool, str]: @@ -1924,12 +1936,12 @@ def _existe_quelque_part(nom: str) -> bool: def _carte_chiffres_mesures() -> dict[str, int]: """Ce que la carte affirme, recompte a la source.""" - dec = (RACINE / "docs" / "decisions-architecture.md") + dec = (RACINE / "docs" / "projet" / "decisions-architecture.md") texte = dec.read_text(encoding="utf-8") if dec.is_file() else "" return { "roles": len([p for p in (RACINE / "roles").glob("*") if p.is_dir()]), "README de roles": len(list((RACINE / "roles").glob("*/README.md"))), - "documents": len(list((RACINE / "docs").glob("*.md"))), + "documents": len(_documents()), "pieces d'audit": len([p for p in (RACINE / "docs" / "audit").glob("*") if p.is_file()]), # UNE FICHE GENEREE N'EST PAS UNE UNITE D'APPRENTISSAGE (2026-09-14). Les @@ -1957,7 +1969,7 @@ def preuve_comptes_de_la_prose() -> tuple[bool, str]: que le tableau « Le depot en chiffres ». Les MEMES nombres vivent ailleurs, en pleine phrase, et ils avaient tous derive : - docs/devis-services.md : « porte 35 preuves » -> 56 + docs/exploitation/devis-services.md : « porte 35 preuves » -> 56 AGENTS.md : « les 35 preuves » -> 56 docs/pouvoirs-set-ops : « ≈50 roles » -> 65 docs/catalogue-services : « les 29 groupes » -> 40 @@ -1990,7 +2002,7 @@ def preuve_comptes_de_la_prose() -> tuple[bool, str]: "groupes": len(list((RACINE / "playbooks" / "groupes").glob("*.yml"))), } fichiers = sorted( - list((RACINE / "docs").glob("*.md")) + list((RACINE / "wiki").glob("*.md")) + _documents() + list((RACINE / "wiki").glob("*.md")) + [RACINE / "AGENTS.md", RACINE / "README.md", RACINE / "CLAUDE.md"]) ecarts: list[str] = [] @@ -2046,10 +2058,11 @@ def preuve_comptes_de_la_prose() -> tuple[bool, str]: def preuve_carte_dit_vrai() -> tuple[bool, str]: """La carte d'orientation designe des choses qui existent, et compte juste. - CE QU'EST LA CARTE. `docs/carte-set-ops.md` est l'index du MAINTENEUR : l'ordre de - lecture du corpus, et surtout le catalogue des MECANISMES TRANSVERSES avec, pour - chacun, OU IL VIT DANS LE CODE. Son but est ecrit en toutes lettres : « ne plus - re-deterrer ce qui existe ». + CE QU'EST LA CARTE. Depuis la refonte du 2026-10-15, deux fichiers : l'INDEX + (`docs/README.md`, l'ordre de lecture du corpus et « le depot en chiffres ») et le + catalogue des MECANISMES TRANSVERSES (`docs/conception/mecanismes.md`) avec, pour + chacun, OU IL VIT DANS LE CODE. Leur but : « ne plus re-deterrer ce qui existe ». + Ils formaient jusque-la un seul fichier, la « carte d'orientation », aujourd'hui retiree. POURQUOI UNE GARDE (mesure du 2026-08-26). Un POINTEUR MORT est le defaut couteux : la carte dit ou vit un mecanisme, quelqu'un ne l'y trouve pas, et le reimplemente a @@ -2062,10 +2075,14 @@ def preuve_carte_dit_vrai() -> tuple[bool, str]: `catalogue-services.md` avait deja sa garde (P38) ; la carte n'en avait aucune. """ - carte = RACINE / "docs" / "carte-set-ops.md" - if not carte.is_file(): - return False, "docs/carte-set-ops.md est introuvable." - texte = carte.read_text(encoding="utf-8") + index = RACINE / "docs" / "README.md" + mecanismes = RACINE / "docs" / "conception" / "mecanismes.md" + absents = [str(f.relative_to(RACINE)) for f in (index, mecanismes) if not f.is_file()] + if absents: + return False, f"{', '.join(absents)} introuvable(s)." + # Les pointeurs se lisent dans les deux ; les chiffres dans l'index seul. + texte_index = index.read_text(encoding="utf-8") + texte = texte_index + "\n" + mecanismes.read_text(encoding="utf-8") manques: list[str] = [] # --- Les pointeurs --------------------------------------------------------- @@ -2126,7 +2143,7 @@ def preuve_carte_dit_vrai() -> tuple[bool, str]: # ce code ecrit sans diacritiques comme tout le reste du depot. Comparer les deux # tels quels ferait echouer la preuve sur son propre alphabet. annonces = {} - for etiq, valeur in re.findall(r"^\| *([^|]+?) *\| *(\d+) *\|", texte, re.M): + for etiq, valeur in re.findall(r"^\| *([^|]+?) *\| *(\d+) *\|", texte_index, re.M): annonces[_sans_accents(etiq).lower()] = int(valeur) for etiquette, attendu in _carte_chiffres_mesures().items(): @@ -2214,7 +2231,7 @@ def preuve_panneaux_assembles() -> tuple[bool, str]: return False, "Panneaux declares :\n - " + "\n - ".join(fautes) if not mesures: return True, ("Aucun panneau declare — rien a assembler " - "(cf. docs/supervision-conception.md).") + "(cf. docs/conception/supervision-conception.md).") return True, (f"{len(mesures)} panneau(x) declare(s) dans " f"{len({m.split('/')[0] for m in mesures})} role(s), tous avec titre, " f"expression, raison et une unite que la table sait traduire.") @@ -2497,7 +2514,7 @@ def preuve_sondes_declarees_et_deposees() -> tuple[bool, str]: CE QU'ELLE NE FAIT PAS. Elle ne juge pas si la sonde MESURE quelque chose d'utile, ni si elle peut echouer. Ca, aucune lecture statique ne le dira : c'est au controle - negatif de chaque sonde, exige par `docs/supervision-conception.md` et trace au + negatif de chaque sonde, exige par `docs/conception/supervision-conception.md` et trace au CHANGELOG. """ roles = RACINE / "roles" @@ -2578,7 +2595,7 @@ def preuve_sondes_declarees_et_deposees() -> tuple[bool, str]: return False, "Sondes de supervision :\n - " + "\n - ".join(fautes) if not mesures: return True, ("Aucune sonde declaree — la supervision se limite a `sante` et " - "`sauvegarde` (cf. docs/supervision-conception.md).") + "`sauvegarde` (cf. docs/conception/supervision-conception.md).") return True, (f"{len(mesures)} sonde(s) declaree(s) ET deposee(s), chacune avec sa " f"raison et son `ttl` : {', '.join(mesures)}.") @@ -3092,7 +3109,7 @@ def preuve_silences_declares() -> tuple[bool, str]: def preuve_registre_flux_a_jour() -> tuple[bool, str]: """La matrice d'audit des flux dit ce que le moteur declare AUJOURD'HUI. - POURQUOI (mesure du 2026-08-26). `docs/registre-flux.md` est GENERE depuis les + POURQUOI (mesure du 2026-08-26). `docs/conception/registre-flux.md` est GENERE depuis les `roles/*/meta/flux.yml`, et c'est le document qu'un humain lit pour savoir ce que le pare-feu laisse passer. Son existence etait verifiee (P31) ; sa FRAICHEUR ne l'etait pas. @@ -3108,9 +3125,9 @@ def preuve_registre_flux_a_jour() -> tuple[bool, str]: `generer_registre` est une fonction PURE : on la rejoue en memoire et on compare. Rien n'est ecrit — une preuve qui repare ce qu'elle mesure ne mesure plus rien. """ - fichier = RACINE / "docs" / "registre-flux.md" + fichier = RACINE / "docs" / "conception" / "registre-flux.md" if not fichier.is_file(): - return False, "docs/registre-flux.md est introuvable." + return False, "docs/conception/registre-flux.md est introuvable." try: sys.path.insert(0, str(RACINE / "scripts")) import resoudre_flux as RF @@ -3129,7 +3146,7 @@ def preuve_registre_flux_a_jour() -> tuple[bool, str]: for i, (x, y) in enumerate(zip(a, b)) if x != y][:3] if len(a) != len(b): ecarts.append(f"longueurs differentes : {len(a)} lignes contre {len(b)}") - return False, ("`docs/registre-flux.md` ne dit plus ce que le moteur declare. " + return False, ("`docs/conception/registre-flux.md` ne dit plus ce que le moteur declare. " "Rejouer `make flux` et commiter le resultat.\n - " + "\n - ".join(ecarts)) @@ -3272,9 +3289,9 @@ def preuve_catalogue_a_jour() -> tuple[bool, str]: - que la description soit JUSTE. Qu'un service soit dit « eprouve » a bon droit se juge en revue, contre le CHANGELOG. Mecaniser ce jugement serait se mentir. """ - catalogue = RACINE / "docs" / "catalogue-services.md" + catalogue = RACINE / "docs" / "projet" / "catalogue-services.md" if not catalogue.is_file(): - return False, "docs/catalogue-services.md absent" + return False, "docs/projet/catalogue-services.md absent" texte = catalogue.read_text(encoding="utf-8", errors="ignore") roles = {d.name for d in (RACINE / "roles").iterdir() if d.is_dir() and d.name.startswith(("serveur_", "client_"))} @@ -3389,6 +3406,23 @@ def preuve_documentation_outillage() -> tuple[bool, str]: manques.append(f"{len(muettes)} cible(s) make sans texte d'aide `##` : " + ", ".join(sorted(muettes)[:6]) + ("…" if len(muettes) > 6 else "")) + # LA REFERENCE DES COMMANDES SUIT LE MAKEFILE (2026-10-15). `docs/usage.md` range chaque + # cible publique par famille ; une liste qui en suit une autre prend du retard, sauf si + # une garde les compare. Dans les deux sens : une cible absente de la reference, ou une + # cible citee qui n'existe plus. + publiques = {ligne.split(":")[0] for ligne in makefile.splitlines() + if re.match(r"^[A-Za-z][A-Za-z0-9_-]*:", ligne) and "##" in ligne} + usage = RACINE / "docs" / "usage.md" + citees = set(re.findall(r"`make ([A-Za-z][A-Za-z0-9_-]*)", usage.read_text(encoding="utf-8")) + ) if usage.is_file() else set() + absentes, fantomes = sorted(publiques - citees), sorted(citees - publiques) + if absentes: + manques.append(f"{len(absentes)} cible(s) absente(s) de docs/usage.md : " + + ", ".join(absentes[:6]) + ("…" if len(absentes) > 6 else "")) + if fantomes: + manques.append(f"docs/usage.md cite {len(fantomes)} cible(s) inexistante(s) : " + + ", ".join(fantomes[:6])) + sans_readme = sorted( d.name for d in (RACINE / "roles").iterdir() if d.is_dir() and not (d / "README.md").exists() @@ -4253,7 +4287,7 @@ def preuve_remise_tenue() -> tuple[bool, str]: qui donne le controle d'une organisation etait le seul geste lourd du depot sans procedure, sans outil et sans garde. - LA REMISE SE FAIT EN DEUX TEMPS (`docs/remise-au-client.md`) : l'IDENTITE d'abord — le + LA REMISE SE FAIT EN DEUX TEMPS (`docs/hebergement/remise-au-client.md`) : l'IDENTITE d'abord — le client gouverne ses gens des le premier jour — puis la MACHINE, a une echeance convenue : sa cle SSH entre, celle de l'hebergeur sort, la voute change de mot de passe. @@ -4711,7 +4745,7 @@ def preuve_runbooks_suivent_le_makefile() -> tuple[bool, str]: def preuve_fiche_du_site() -> tuple[bool, str]: """La fiche que chaque site destine a ses locataires dit-elle ce qu'ils portent deja ? - POURQUOI (2026-10-04, `docs/conception-contextes.md` §2.4). Le site informait le locataire + POURQUOI (2026-10-04, `docs/conception/conception-contextes.md` §2.4). Le site informait le locataire par trois canaux, sans fiche : des copies ecrites a la main (index, adresse publique, intrants, racine), une lecture DIRECTE du site par l'instancier (temps, delegation DNS, routage SDN), et le genome. La fiche les reunit. Avant qu'un seul consommateur bascule sur @@ -4739,7 +4773,7 @@ def preuve_face_reseau() -> tuple[bool, str]: """La face reseau que chaque locataire publie dit-elle ce que les consommateurs du site en tirent aujourd'hui, en lisant ses fichiers internes ? - POURQUOI (2026-10-04, `docs/conception-contextes.md` §2.4). Le site lisait six fichiers + POURQUOI (2026-10-04, `docs/conception/conception-contextes.md` §2.4). Le site lisait six fichiers internes de ses locataires — nomenclature, inventaire, `group_vars`, acces, domaines. La face reseau les publie, calculee chez le locataire. Avant que le site la lise a leur place (etape 3), elle doit dire EXACTEMENT ce que la decouverte, le devis Proxmox, la frontiere @@ -4762,7 +4796,7 @@ def preuve_flux_concordent() -> tuple[bool, str]: """Le pare-feu de chaque machine (nftables, resolu par le locataire) et celui de Proxmox (devise par le site) admettent-ils les memes entrees ? - POURQUOI (2026-10-04, `docs/conception-contextes.md` §2.4, constat 2). Les flux etaient + POURQUOI (2026-10-04, `docs/conception/conception-contextes.md` §2.4, constat 2). Les flux etaient calcules DEUX FOIS, par le locataire et par le site, chacun avec sa version du moteur. La face reseau publie ceux du locataire (`flux-genere/*.connectivite.json`). Machine par machine et port par port, les sources admises doivent etre les memes, une fois neutralisees @@ -4787,7 +4821,7 @@ def preuve_frontiere_identites() -> tuple[bool, str]: """Les alias, les routes et la traduction sortante par lesquels la frontiere designe chaque locataire disent-ils ce que sa face reseau et la fiche du site portent ? - POURQUOI (2026-10-04, `docs/conception-contextes.md` §2.4). La frontiere est le dernier + POURQUOI (2026-10-04, `docs/conception/conception-contextes.md` §2.4). La frontiere est le dernier consommateur du site qui lit l'interieur des locataires. Premier temps de sa bascule : les identites — supernet (ses zones), administration par interface, tunnel, un alias par groupe qui a des flux de bordure, une route par zone, la sortie par l'adresse publique attribuee. @@ -4810,7 +4844,7 @@ def preuve_frontiere_entrees_publiques() -> tuple[bool, str]: """Les regles du WAN, les redirections et le tunnel d'administration d'un locataire disent-ils ce que sa face reseau ouvre a tous ? - POURQUOI (2026-10-04, `docs/conception-contextes.md` §2.4). Second temps de la frontiere. + POURQUOI (2026-10-04, `docs/conception/conception-contextes.md` §2.4). Second temps de la frontiere. Machine par machine, chaque entree ouverte a tous (`0.0.0.0/0`) dans la face doit avoir sa regle WAN et, si elle a un port, sa redirection depuis l'adresse que la fiche du site attribue — et rien de plus. Le port public d'un locataire est son port local ; s'il en @@ -4833,7 +4867,7 @@ def preuve_frontiere_administration() -> tuple[bool, str]: """Par la gestion, le VPN et le tunnel, l'administration atteint-elle chez chaque locataire exactement ce que sa face reseau lui ouvre ? - POURQUOI (2026-10-05, `docs/conception-contextes.md` §2.4). Troisieme temps de la frontiere, + POURQUOI (2026-10-05, `docs/conception/conception-contextes.md` §2.4). Troisieme temps de la frontiere, premiere moitie. Le SSH, les entrees qui nomment l'administration parmi leurs sources, et les entrees publiques que leur flux ouvre au poste (`poste`, faux pour le 25 de Postfix). Le tunnel atteint toute la flotte, sur les ports que la politique du site lui accorde. @@ -4855,7 +4889,7 @@ def preuve_frontiere_sorties() -> tuple[bool, str]: """Les regles de sortie d'un locataire vers l'Internet disent-elles ce que sa face reseau publie (`sorties_externes`) ? - POURQUOI (2026-10-05, `docs/conception-contextes.md` §2.4). Dernier temps de la frontiere. + POURQUOI (2026-10-05, `docs/conception/conception-contextes.md` §2.4). Dernier temps de la frontiere. Le locataire ne relevait pas ses sorties (ses machines les acceptent toutes) ; il les publie desormais, et la frontiere doit les laisser passer, elles et rien d'autre. En chemin, deux sorties de `serveur_ops` se sont revelees fausses et ont ete retirees (85, 87). @@ -4877,7 +4911,7 @@ def preuve_inventaire_portable() -> tuple[bool, str]: """Chaque locataire porte-t-il la fiche a jour de son site, et son inventaire se genere-t-il SANS le site, a l'octet pres ? - POURQUOI (2026-10-05, `docs/conception-contextes.md` §6, etape 3). L'instancier lisait le site + POURQUOI (2026-10-05, `docs/conception/conception-contextes.md` §6, etape 3). L'instancier lisait le site monte sur le poste pour trois valeurs (temps, delegation DNS, routage) ; genere ailleurs, l'inventaire les perdait. Il lit desormais la fiche que le site depose. Deux conditions : la fiche deposee est celle que le site calcule aujourd'hui ; et l'inventaire genere sans le site @@ -4901,7 +4935,7 @@ def preuve_inventaire_portable() -> tuple[bool, str]: def preuve_face_publiee() -> tuple[bool, str]: """Chaque locataire a-t-il publie (`face-reseau.yml`) la face reseau qu'il calcule aujourd'hui ? - POURQUOI (2026-10-05, `docs/conception-contextes.md` §6, etape 3). Les consommateurs du site + POURQUOI (2026-10-05, `docs/conception/conception-contextes.md` §6, etape 3). Les consommateurs du site lisent desormais ce fichier au lieu des fichiers internes du locataire. Une face perimee leur ferait poser une configuration fausse ; une face absente les ferait retomber sur l'ancienne lecture. Les deux sont refusees ici. A republier apres `make instancier` ou `make flux`. @@ -4921,7 +4955,7 @@ def preuve_clonage_publie() -> tuple[bool, str]: """Chaque machine publiee porte-t-elle les parametres de clonage que rend `parametres-proxmox` sur l'inventaire du locataire ? - POURQUOI (2026-10-05, `docs/conception-contextes.md`, materialisation M1). Le runner du site + POURQUOI (2026-10-05, `docs/conception/conception-contextes.md`, materialisation M1). Le runner du site va cloner les VM d'un locataire d'apres sa face, sans monter son depot. Elle doit donc porter exactement ce que `make creer-vm` evalue aujourd'hui : VMID, adresse, pont, ressources, noeud, DNS, domaine, cles d'amorcage (publiques). Compare a la commande meme, lancee a part. @@ -4942,7 +4976,7 @@ def preuve_cle_lecture_genome() -> tuple[bool, str]: """Chaque locataire publie-t-il son depot du genome et la cle de son runner qui le lira — et cette cle est-elle l'une de celles que sa flotte connait ? - POURQUOI (2026-10-11, `docs/depots-prives-conception.md`). Les depots des locataires + POURQUOI (2026-10-11, `docs/conception/depots-prives-conception.md`). Les depots des locataires deviennent prives sur la forge du site : chaque runner lit le sien avec une cle de deploiement en lecture seule, que le site enregistre d'apres la face. Une cle absente laisserait le runner sans genome apres l'insemination ; une cle hors de @@ -4983,7 +5017,7 @@ def preuve_materialisation_par_la_face() -> tuple[bool, str]: """Les commandes du site qui nomment leur locataire tirent-elles de sa face les memes intrants que l'ancien chemin ? - POURQUOI (2026-10-05, `docs/conception-contextes.md`, materialisation M2). `locataire-creer`, + POURQUOI (2026-10-05, `docs/conception/conception-contextes.md`, materialisation M2). `locataire-creer`, `locataire-raser` et `placement-plan TENANT=` ne montent plus le depot du locataire : ils lisent sa face. Creer, raser et placer doivent donc viser exactement les memes machines, VMID, valeurs et ponts que `flotte-creer`, `raser` et `placement-plan` sur l'instance montee diff --git a/scripts/remise.py b/scripts/remise.py index d8669a0..1ab49d3 100644 --- a/scripts/remise.py +++ b/scripts/remise.py @@ -16,7 +16,7 @@ LA REMISE SE FAIT EN DEUX TEMPS, et ce decoupage est tout le sujet. TEMPS 2 — la MACHINE. A une date convenue : la cle SSH du client entre au plan, celle de l'hebergeur en sort, la voute change de mot de passe, les secrets applicatifs - tournent. C'est l'etape 8 de `docs/migration-tenant.md` — « revoquer, pas + tournent. C'est l'etape 8 de `docs/hebergement/migration-tenant.md` — « revoquer, pas transmettre » — appliquee a une livraison plutot qu'a un depart. CE QUE CE SCRIPT NE FAIT JAMAIS : @@ -422,7 +422,7 @@ def cmd_inscrire(args) -> int: "empreinte_sha256": _empreinte(f)} for f, nature, _ in pieces], }, # LE RESPONSABLE DESIGNE (D-18) EST DECLARE ICI, ET NULLE PART AILLEURS. - # `docs/migration-tenant.md` le decide depuis longtemps et laisse ouverte la + # `docs/hebergement/migration-tenant.md` le decide depuis longtemps et laisse ouverte la # question « ou est-il declare ». La remise est le moment ou la reponse existe : # c'est la personne qui RECOIT, et la nommer ailleurs qu'au moment de la remise # reviendrait a la deviner. @@ -517,7 +517,7 @@ def cmd_recleer(args) -> int: print(f" ! {m}", file=sys.stderr) print("\n L'ordre, et il ne se permute pas : la cle du client entre, puis la " "notre sort,\n puis la voute est re-cletee, puis les secrets tournent, puis " - "on deploie.\n Voir docs/remise-au-client.md §4.", file=sys.stderr) + "on deploie.\n Voir docs/hebergement/remise-au-client.md §4.", file=sys.stderr) return 1 if not args.confirmer: diff --git a/scripts/resoudre_flux.py b/scripts/resoudre_flux.py index 41bff62..8af9db3 100644 --- a/scripts/resoudre_flux.py +++ b/scripts/resoudre_flux.py @@ -2,16 +2,16 @@ """Resolveur des flux reseau Set-OPS : meta/flux.yml -> registre d'audit + apercus nftables. Agrege les `roles//meta/flux.yml`, resout les `pair`, et produit : - - docs/registre-flux.md : la MATRICE D'AUDIT (niveau moteur, role->role : port, + - docs/conception/registre-flux.md : la MATRICE D'AUDIT (niveau moteur, role->role : port, sens, chiffrement, raison). Deterministe, sans donnee d'instance. - des APERCUS nftables par hote (IP resolues, `ip saddr` = moindre privilege, policy drop) sous /flux-genere/.nft. Fichiers GENERES et inspectables — NON actives (l'activation reste un geste dedie, teste par noeud). -NON destructif : n'active aucun pare-feu. Voir docs/flux-conception.md. +NON destructif : n'active aucun pare-feu. Voir docs/conception/flux-conception.md. Usage : - python3 scripts/resoudre_flux.py registre # (re)genere docs/registre-flux.md + python3 scripts/resoudre_flux.py registre # (re)genere docs/conception/registre-flux.md python3 scripts/resoudre_flux.py nftables # apercus par hote (requiert l'inventaire) python3 scripts/resoudre_flux.py verifier # valide le schema de tous les flux.yml """ @@ -30,7 +30,7 @@ from inventory_rules import instance_courante, est_groupe_operationnel RACINE = Path(__file__).resolve().parents[1] ROLES = RACINE / "roles" -REGISTRE = RACINE / "docs" / "registre-flux.md" +REGISTRE = RACINE / "docs" / "conception" / "registre-flux.md" INSTANCE = instance_courante() SENS = {"ingress", "egress"} @@ -81,7 +81,7 @@ CHIFFREMENT = {"tls-requis", "tls", "starttls", "ssh", "tls-cible", "wireguard", # jamais ceux des locataires. Le mot ne peut designer que les bonnes machines. # `runners_locataires` — LES RUNNERS DES LOCATAIRES QUE CE SITE HEBERGE (2026-10-11), vus du # site. Chacun lit SON depot du genome sur la forge du site, en SSH, avec une cle de -# deploiement en lecture seule (`docs/depots-prives-conception.md`). Des HOTES, lus dans les +# deploiement en lecture seule (`docs/conception/depots-prives-conception.md`). Des HOTES, lus dans les # faces publiees — jamais les supernets : ouvrir le SSH de la forge a toutes les machines d'un # locataire en ferait un droit d'entree general. MOTS_PAIR = {"edge", "flotte", "externe", "localhost", "expositions", "derive", "admin", @@ -845,7 +845,7 @@ def generer_nftables(flux_par_role: dict[str, list[dict]], site: bool = False) - # CE QUE CHAQUE VM DEMANDE A L'EXTERIEUR (2026-10-05). Ses machines acceptent tout en # sortie : nftables n'en a pas besoin, et ce generateur ne les relevait donc pas. Mais la # FRONTIERE, elle, filtre ces sorties, et la face reseau du locataire doit les lui dire - # (docs/conception-contextes.md). Relevees ICI, avec les memes conditions que les entrees. + # (docs/conception/conception-contextes.md). Relevees ICI, avec les memes conditions que les entrees. sorties_externes: dict[str, set[tuple]] = {} for hote in sorted(actifs_noms): groupes = [g for g, membres in _enfants(data).items() diff --git a/scripts/site_inventaire.py b/scripts/site_inventaire.py index fd47279..70c1aed 100755 --- a/scripts/site_inventaire.py +++ b/scripts/site_inventaire.py @@ -227,7 +227,7 @@ def inventaire() -> dict: except Exception: return out for nom_depot, prefixe, _n in decouverts: - # LA FACE RESEAU D'ABORD (2026-10-05, docs/conception-contextes.md §6, etape 3). Le + # LA FACE RESEAU D'ABORD (2026-10-05, docs/conception/conception-contextes.md §6, etape 3). Le # locataire PUBLIE la cle qu'il depose (`face-reseau.yml`) ; le site ne fouille plus # ses `group_vars`, dont le chemin etait ecrit en dur (`principal`). Sans face # publiee (transition), l'ancienne lecture, et on le dit. diff --git a/scripts/tests/test_portee_console.py b/scripts/tests/test_portee_console.py index 0471cdd..c8341af 100644 --- a/scripts/tests/test_portee_console.py +++ b/scripts/tests/test_portee_console.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """La portee de la console : un pouvoir se mesure sur ce qu'on peut OUVRIR. -`docs/responsabilites-locataire-hebergeur.md` §2 attache chaque pouvoir a une voute : +`docs/hebergement/responsabilites-locataire-hebergeur.md` §2 attache chaque pouvoir a une voute : calculer plan -> inventaire aucune voute configurer des roles sur ses machines voute du TENANT diff --git a/scripts/voute.py b/scripts/voute.py index 48b86a5..b931358 100644 --- a/scripts/voute.py +++ b/scripts/voute.py @@ -41,7 +41,7 @@ MOTIF_VAULT = re.compile(r"\b(vault_[a-z0-9_]+)") # Secrets du MONDE PHYSIQUE : ils n'ont pas le prefixe `vault_`, et depuis le 2026-08-22 # ils ne vivent PLUS dans la voute d'un tenant mais dans celle de l'underlay, chez -# l'hebergeur (docs/frontiere-physique-virtuel.md). Un tenant qui les porte encore est un +# l'hebergeur (docs/conception/frontiere-physique-virtuel.md). Un tenant qui les porte encore est un # reste de migration, pas une exigence — d'ou leur retrait des attentes du gabarit. # `vault_relais_wg_cle_privee` (2026-10-13) : la cle du relais de la face publique, meme # nature — elle appartient au SITE (`underlay.vault.yml`), jamais a un locataire. diff --git a/wiki/Autorisation-et-RBAC.md b/wiki/Autorisation-et-RBAC.md index 432a4ae..e0f6c48 100644 --- a/wiki/Autorisation-et-RBAC.md +++ b/wiki/Autorisation-et-RBAC.md @@ -52,7 +52,7 @@ d'Explore. > quelqu'un créerait une dette qu'on découvre le jour du départ, service par service — et il > faudrait un déploiement pour révoquer. L'assignation explicite à `testmail` de l'exemple > ci-dessus reste utile pour *comprendre* la mécanique du claim ; ce n'est pas la façon dont -> on donne un accès. Voir `docs/autorisation.md` §5. +> on donne un accès. Voir `docs/exploitation/autorisation.md` §5. --- diff --git a/wiki/Courriel.md b/wiki/Courriel.md index e09efb2..870930b 100644 --- a/wiki/Courriel.md +++ b/wiki/Courriel.md @@ -71,5 +71,5 @@ Tu as appris **MTA/MDA/MUA, SMTP vs soumission, IMAP, la déliverabilité** — ## Pour aller plus loin *(dépôt)* - Rôles : `roles/serveur_postfix`, `roles/serveur_dovecot`, `roles/serveur_rspamd`. -- Conception + Étape B (déliverabilité publique) : `docs/courriel-conception.md`. +- Conception + Étape B (déliverabilité publique) : `docs/conception/courriel-conception.md`. - Notifications système des nœuds : `client_smtp` (relais vers le MTA). diff --git a/wiki/DNS-et-résolution.md b/wiki/DNS-et-résolution.md index 2fe0bb1..1c52faf 100644 --- a/wiki/DNS-et-résolution.md +++ b/wiki/DNS-et-résolution.md @@ -86,6 +86,6 @@ Tu as appris **la hiérarchie de résolution** (hosts → récursif → autorita ## Pour aller plus loin *(dépôt)* - Rôles : `roles/hosts_statiques` (le plancher), `roles/serveur_powerdns`, `roles/client_resolveur`. -- Conception des 3 couches + frontière publique : `docs/dns-interne.md`. -- Le DNS **public** — le locataire écrit sa zone, deux sites la servent (`dns1.chezlepro.ca`, `dns1.technolibre.ca`) : schémas des processus et des flux dans `docs/dns-interne.md`, et `roles/serveur_dns_public`. -- Note : `client_resolveur` est une **intégration universelle** (elle suit l'existence de `serveur_resolveur`) — voir l'unité *Liaisons* et `docs/integrations-vm.md`. +- Conception des 3 couches + frontière publique : `docs/conception/dns-interne.md`. +- Le DNS **public** — le locataire écrit sa zone, deux sites la servent (`dns1.chezlepro.ca`, `dns1.technolibre.ca`) : schémas des processus et des flux dans `docs/conception/dns-interne.md`, et `roles/serveur_dns_public`. +- Note : `client_resolveur` est une **intégration universelle** (elle suit l'existence de `serveur_resolveur`) — voir l'unité *Liaisons* et `docs/conception/integrations-vm.md`. diff --git a/wiki/Home.md b/wiki/Home.md index 16365df..bde24d7 100644 --- a/wiki/Home.md +++ b/wiki/Home.md @@ -3,7 +3,7 @@ > **Pour qui :** celui qui **apprend le métier**. Chaque unité part d'un fondamental TIC, pas > d'un produit. Pour *exploiter* dès aujourd'hui, va à > **[Reprendre l'écosystème](Reprendre-l-écosystème)** ; pour *modifier* le moteur, la carte -> du dépôt est dans `docs/carte-set-ops.md`. +> du dépôt est dans `docs/conception/mecanismes.md` (index : `docs/README.md`). Bienvenue. **Set-OPS** est le moteur Ansible qui déploie un **écosystème numérique souverain complet** (Alliance Boréale · *tout est libre*). Mais c'est aussi, et volontairement, un **outil @@ -24,7 +24,7 @@ des **méthodes 100 % génériques**. | Section | Contenu | |---|---| | **Unités d'apprentissage** | Un fondamental TIC par page, toujours selon le même moule (ci-dessous). Des *services* (identité, PKI, courriel…) **et** de la *méthode* (le plan, le multi-instance, la preuve). | -| **Opérations (runbooks)** | Les procédures ne vivent **pas** ici : elles sont dans le dépôt, `docs/runbooks-exploitation.md`. Le wiki y pointe (même règle que la référence technique, ci-dessous). | +| **Opérations (runbooks)** | Les procédures ne vivent **pas** ici : elles sont dans le dépôt, `docs/exploitation/runbooks-exploitation.md`. Le wiki y pointe (même règle que la référence technique, ci-dessous). | | **[Glossaire](Glossaire)** | Les concepts-clés en une phrase (seed, bindings, le plancher, hôte fantôme, voûte…). | | **Référence technique** | Le *détail du « comment »* vit **dans le dépôt** (`docs/`, README des rôles) — ce wiki y **pointe**, ne le **recopie pas** (pour éviter la dérive). | | **[Les rôles, un par un](Rôles)** | La seule exception à la règle ci-dessus, et elle la confirme : ces 68 fiches sont **générées** depuis les `meta/` de chaque rôle (`make fiches`). Le motif de la règle est la *dérive* ; une page qui relit sa source à chaque génération ne peut pas dériver. Corriger une fiche veut dire corriger la **déclaration**, jamais la page. | diff --git a/wiki/Identité-et-SSO.md b/wiki/Identité-et-SSO.md index b93c95c..1471170 100644 --- a/wiki/Identité-et-SSO.md +++ b/wiki/Identité-et-SSO.md @@ -104,4 +104,4 @@ Change les produits, le **schéma reste**. C'est ça, un savoir générique. - Rôles : `roles/serveur_openldap`, `roles/serveur_keycloak`, `roles/serveur_oauth2_proxy`. - Passerelle générique : `roles/serveur_oauth2_proxy/` (README) — placer du SSO devant *toute* app. - Thème de connexion (identité Alliance) : `roles/serveur_keycloak/files/themes/alliance-boreale/`. -- Concept de liaison **requise** (IdP ⟶ annuaire) : `docs/bindings-conception.md` §11. +- Concept de liaison **requise** (IdP ⟶ annuaire) : `docs/conception/bindings-conception.md` §11. diff --git a/wiki/La-preuve.md b/wiki/La-preuve.md index 4b75e0f..55eeb0c 100644 --- a/wiki/La-preuve.md +++ b/wiki/La-preuve.md @@ -49,7 +49,7 @@ Trois idées la portent : > sont toutes **statiques** : elles lisent le dépôt, sans un seul appel réseau. Elles établissent > qu'il est cohérent *avec lui-même* — jamais que le système déployé lui ressemble. C'est dans > cet angle mort qu'un certificat d'autorité a pu rester expiré huit heures sous un harnais vert. -> La conformité du **déployé** est l'affaire des **devis de service** (voir `docs/devis-services.md`). +> La conformité du **déployé** est l'affaire des **devis de service** (voir `docs/exploitation/devis-services.md`). Ce n'est pas un framework de test parallèle : le harnais **orchestre** l'outillage existant, il ne réimplémente aucune validation. diff --git a/wiki/Le-plan-et-l-adressage-dérivé.md b/wiki/Le-plan-et-l-adressage-dérivé.md index 729230e..bd4d6ef 100644 --- a/wiki/Le-plan-et-l-adressage-dérivé.md +++ b/wiki/Le-plan-et-l-adressage-dérivé.md @@ -85,7 +85,7 @@ nomenclature de Set-OPS ». --- ## Pour aller plus loin *(dépôt)* -- Le plan et sa génération : `docs/plan-et-generation.md`. +- Le plan et sa génération : `docs/conception/plan-et-generation.md`. - La dérivation, en code : `scripts/inventory_rules.py` (`supernet_de`, `vlan_de`…). - Le seed multi-instance : unité **[Multi-instance & fédération](Multi-instance-et-fédération)**. - La règle prouvée : unité **[La preuve](La-preuve)** (P20). diff --git a/wiki/Le-réseau-des-tenants.md b/wiki/Le-réseau-des-tenants.md index 20e6f7e..5acd5b6 100644 --- a/wiki/Le-réseau-des-tenants.md +++ b/wiki/Le-réseau-des-tenants.md @@ -156,7 +156,7 @@ ils descendent tous d'un seul nombre — donc ils ne peuvent pas se contredire. 4. **Change `index` dans un modèle** (jamais en production) et régénère : combien de valeurs ont bougé ? C'est la mesure exacte de ce que la dérivation t'épargne. -**Pour aller plus loin** : `docs/sdn-evpn.md` dans le dépôt (référence technique), +**Pour aller plus loin** : `docs/conception/sdn-evpn.md` dans le dépôt (référence technique), [Le plan & l'adressage dérivé](Le-plan-et-l-adressage-dérivé), [Multi-instance & fédération](Multi-instance-et-fédération). diff --git a/wiki/Liaisons-bindings.md b/wiki/Liaisons-bindings.md index 4e01fba..16c38d5 100644 --- a/wiki/Liaisons-bindings.md +++ b/wiki/Liaisons-bindings.md @@ -84,6 +84,6 @@ produit. C'est un **modèle mental** qui vaut de NetScaler à Kubernetes. --- ## Pour aller plus loin *(dépôt)* -- Conception + **taxonomie (niveau × modalité)** : `docs/bindings-conception.md` (§11). +- Conception + **taxonomie (niveau × modalité)** : `docs/conception/bindings-conception.md` (§11). - Résolveurs : `roles/resoudre_base`, `roles/resoudre_annuaire` ; registres : `instance/plan/`. - Toutes les autres unités sont, au fond, des liaisons en action. diff --git a/wiki/Multi-instance-et-fédération.md b/wiki/Multi-instance-et-fédération.md index e0698a3..2609371 100644 --- a/wiki/Multi-instance-et-fédération.md +++ b/wiki/Multi-instance-et-fédération.md @@ -177,7 +177,7 @@ pas « le symlink de Set-OPS ». --- ## Pour aller plus loin *(dépôt)* -- Le guide complet : `docs/multi-instances.md`. +- Le guide complet : `docs/conception/multi-instances.md`. - Le seed et la dérivation : unité **[Le plan & l'adressage dérivé](Le-plan-et-l-adressage-dérivé)**. - L'isolation réseau (VLAN, ACL, OPNsense) : `make devis-reseau` + `scripts/devis_reseau.py`. - Les garde-fous prouvés : unité **[La preuve](La-preuve)** (P21). diff --git a/wiki/Métriques-et-journaux.md b/wiki/Métriques-et-journaux.md index b943e0f..57cbd1a 100644 --- a/wiki/Métriques-et-journaux.md +++ b/wiki/Métriques-et-journaux.md @@ -75,4 +75,4 @@ Tu as appris **métriques vs logs, pull vs push, le motif agent** — pas « Pro ## Pour aller plus loin *(dépôt)* - Rôles : `roles/serveur_prometheus`, `roles/serveur_loki`, `roles/serveur_grafana`. - Agents : `roles/client_metrique` (node_exporter), `roles/client_journal` (→ Loki). -- Ces agents sont des **intégrations universelles** (posées par dérivation, gardées par P26) : unités **Liaisons** et `docs/integrations-vm.md`. +- Ces agents sont des **intégrations universelles** (posées par dérivation, gardées par P26) : unités **Liaisons** et `docs/conception/integrations-vm.md`. diff --git a/wiki/Reprendre-l-écosystème.md b/wiki/Reprendre-l-écosystème.md index 92afc4d..ec13c67 100644 --- a/wiki/Reprendre-l-écosystème.md +++ b/wiki/Reprendre-l-écosystème.md @@ -38,14 +38,14 @@ d'appeler quelqu'un. > restée expirée **huit heures** sous un harnais entièrement vert. Voir > [Vérifier le déployé](Vérifier-le-déployé). -Détail de ce que chaque devis vérifie — et de ce qu'il ne vérifie pas : `docs/devis-services.md`. +Détail de ce que chaque devis vérifie — et de ce qu'il ne vérifie pas : `docs/exploitation/devis-services.md`. --- ## ② Entrer Un prérequis et trois pièges, tous à la première connexion. Le runbook complet est dans -`docs/autorisation.md` **§6** ; voici l'ordre et la raison de chaque geste. +`docs/exploitation/autorisation.md` **§6** ; voici l'ordre et la raison de chaque geste. **1. La clé de voûte — une voûte, une clé.** Chaque dépôt a **sa** clé, nommée d'après lui : `~/.config/setops-vault-`. Il n'y a **rien à exporter** — le `Makefile` @@ -58,7 +58,7 @@ python3 scripts/voutes.py etat **Sans la clé de ton écosystème, rien n'est possible** — ni les devis ci-dessus, ni un déploiement. C'est la première chose à sortir de la machine (`make cles-exporter`, cf. -`docs/sortir-les-cles-du-poste.md`), avec les `vault.yml` de chaque instance, qui ne sont +`docs/exploitation/sortir-les-cles-du-poste.md`), avec les `vault.yml` de chaque instance, qui ne sont pas versionnés. > Ce paragraphe a désigné un `ANSIBLE_VAULT_PASSWORD_FILE` unique jusqu'au 2026-09-06. Ce @@ -98,15 +98,15 @@ make inventaire-ui # la même chose, en console web | Pour comprendre | Va lire | |---|---| | ce que fait chaque service et pourquoi celui-là | [Accueil du wiki](Home), unités d'apprentissage | -| qui parle à qui, sur quel port | `docs/flux-conception.md` | +| qui parle à qui, sur quel port | `docs/conception/flux-conception.md` | | comment un service en atteint un autre | [Liaisons (bindings)](Liaisons-bindings) | -| la carte du dépôt, pour **modifier** | `docs/carte-set-ops.md` | +| la carte du dépôt, pour **modifier** | `docs/conception/mecanismes.md` | --- ## ④ Quand ça casse -Les procédures : `docs/runbooks-exploitation.md`. +Les procédures : `docs/exploitation/runbooks-exploitation.md`. Deux réflexes qui évitent la moitié des fausses pistes : @@ -131,14 +131,14 @@ Les trois que tu rencontreras, et où chacun est traité : | Le signal | Ce qu'il te fera croire | Où c'est expliqué | |---|---|---| -| un `connect()` TCP qui réussit **vers le vide** | que le port est ouvert | `docs/frontiere-opnsense.md` — la frontière répond à la poignée sans jamais relayer. Le contrôle : sonder `172.31.99.99`, et n'accepter que la **livraison**. C'est ce que fait `make frontiere-mesurer`. | +| un `connect()` TCP qui réussit **vers le vide** | que le port est ouvert | `docs/conception/frontiere-opnsense.md` — la frontière répond à la poignée sans jamais relayer. Le contrôle : sonder `172.31.99.99`, et n'accepter que la **livraison**. C'est ce que fait `make frontiere-mesurer`. | | `make prouver` **tout vert** | que le système va bien | [Vérifier le déployé](Vérifier-le-déployé) — les preuves lisent le dépôt, jamais les machines. | -| `Connection timed out during banner exchange` | que le réseau est en cause | `docs/runbooks-exploitation.md` **§3** — c'est le plus souvent une VM pas encore là, ou `sshd` qui refuse une rafale. | +| `Connection timed out during banner exchange` | que le réseau est en cause | `docs/exploitation/runbooks-exploitation.md` **§3** — c'est le plus souvent une VM pas encore là, ou `sshd` qui refuse une rafale. | --- ## Ce que tu dois changer en priorité -Avant d'oublier, et c'est dans `docs/autorisation.md` §6.8 : le mot de passe d'amorçage +Avant d'oublier, et c'est dans `docs/exploitation/autorisation.md` §6.8 : le mot de passe d'amorçage (section ② ci-dessus), les secrets restants de la voûte, et tout accès hérité de la livraison qui n'est pas à toi. diff --git a/wiki/Rôle-amorcage_acces.md b/wiki/Rôle-amorcage_acces.md index f9c8fdf..eba4953 100644 --- a/wiki/Rôle-amorcage_acces.md +++ b/wiki/Rôle-amorcage_acces.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-apparmor.md b/wiki/Rôle-apparmor.md index 8f09991..2a235fa 100644 --- a/wiki/Rôle-apparmor.md +++ b/wiki/Rôle-apparmor.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-auditd.md b/wiki/Rôle-auditd.md index 9b69c29..d169ef2 100644 --- a/wiki/Rôle-auditd.md +++ b/wiki/Rôle-auditd.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-chrony.md b/wiki/Rôle-chrony.md index 0173da4..bab143b 100644 --- a/wiki/Rôle-chrony.md +++ b/wiki/Rôle-chrony.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-client_artefacts.md b/wiki/Rôle-client_artefacts.md index 149ce71..5787a5e 100644 --- a/wiki/Rôle-client_artefacts.md +++ b/wiki/Rôle-client_artefacts.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-client_backup.md b/wiki/Rôle-client_backup.md index 857f9fa..ff31330 100644 --- a/wiki/Rôle-client_backup.md +++ b/wiki/Rôle-client_backup.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-client_journal.md b/wiki/Rôle-client_journal.md index 9b389e4..50d578b 100644 --- a/wiki/Rôle-client_journal.md +++ b/wiki/Rôle-client_journal.md @@ -26,7 +26,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-client_pki.md b/wiki/Rôle-client_pki.md index 1bdfc14..86c2e1d 100644 --- a/wiki/Rôle-client_pki.md +++ b/wiki/Rôle-client_pki.md @@ -23,7 +23,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-client_resolveur.md b/wiki/Rôle-client_resolveur.md index 41b5aa0..1d6f732 100644 --- a/wiki/Rôle-client_resolveur.md +++ b/wiki/Rôle-client_resolveur.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-client_sante.md b/wiki/Rôle-client_sante.md index 7fdd9eb..0f224d4 100644 --- a/wiki/Rôle-client_sante.md +++ b/wiki/Rôle-client_sante.md @@ -25,7 +25,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-client_smtp.md b/wiki/Rôle-client_smtp.md index cabb238..93c0146 100644 --- a/wiki/Rôle-client_smtp.md +++ b/wiki/Rôle-client_smtp.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-cloud_init.md b/wiki/Rôle-cloud_init.md index 48cc686..f1365aa 100644 --- a/wiki/Rôle-cloud_init.md +++ b/wiki/Rôle-cloud_init.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-cloud_init_retrait.md b/wiki/Rôle-cloud_init_retrait.md index 8946ce3..8026ba6 100644 --- a/wiki/Rôle-cloud_init_retrait.md +++ b/wiki/Rôle-cloud_init_retrait.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-common_packages.md b/wiki/Rôle-common_packages.md index f16642a..53c34d4 100644 --- a/wiki/Rôle-common_packages.md +++ b/wiki/Rôle-common_packages.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-core_dumps.md b/wiki/Rôle-core_dumps.md index 7fe36cc..6badc49 100644 --- a/wiki/Rôle-core_dumps.md +++ b/wiki/Rôle-core_dumps.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-fail2ban_ssh.md b/wiki/Rôle-fail2ban_ssh.md index 2dcf304..a0757fe 100644 --- a/wiki/Rôle-fail2ban_ssh.md +++ b/wiki/Rôle-fail2ban_ssh.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-hardening_packages.md b/wiki/Rôle-hardening_packages.md index 44308ce..414adfc 100644 --- a/wiki/Rôle-hardening_packages.md +++ b/wiki/Rôle-hardening_packages.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-hosts_statiques.md b/wiki/Rôle-hosts_statiques.md index 4df9a78..329ad0e 100644 --- a/wiki/Rôle-hosts_statiques.md +++ b/wiki/Rôle-hosts_statiques.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-journald.md b/wiki/Rôle-journald.md index f5a242e..e4ad380 100644 --- a/wiki/Rôle-journald.md +++ b/wiki/Rôle-journald.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-motd.md b/wiki/Rôle-motd.md index c47d46c..32810ed 100644 --- a/wiki/Rôle-motd.md +++ b/wiki/Rôle-motd.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-nftables_baseline.md b/wiki/Rôle-nftables_baseline.md index 09c113a..15e387c 100644 --- a/wiki/Rôle-nftables_baseline.md +++ b/wiki/Rôle-nftables_baseline.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-paquets_tiers.md b/wiki/Rôle-paquets_tiers.md index b4f4e6d..90c2e06 100644 --- a/wiki/Rôle-paquets_tiers.md +++ b/wiki/Rôle-paquets_tiers.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-qemu_guest_agent.md b/wiki/Rôle-qemu_guest_agent.md index 5ca76b1..6644a67 100644 --- a/wiki/Rôle-qemu_guest_agent.md +++ b/wiki/Rôle-qemu_guest_agent.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-resoudre_annuaire.md b/wiki/Rôle-resoudre_annuaire.md index ba40ca7..dafd4fe 100644 --- a/wiki/Rôle-resoudre_annuaire.md +++ b/wiki/Rôle-resoudre_annuaire.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-resoudre_base.md b/wiki/Rôle-resoudre_base.md index 4fb8049..7558118 100644 --- a/wiki/Rôle-resoudre_base.md +++ b/wiki/Rôle-resoudre_base.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-resoudre_idp.md b/wiki/Rôle-resoudre_idp.md index ccdef8f..372c69b 100644 --- a/wiki/Rôle-resoudre_idp.md +++ b/wiki/Rôle-resoudre_idp.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-resoudre_politique_mdp.md b/wiki/Rôle-resoudre_politique_mdp.md index ff1e859..ae28b07 100644 --- a/wiki/Rôle-resoudre_politique_mdp.md +++ b/wiki/Rôle-resoudre_politique_mdp.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_artefacts.md b/wiki/Rôle-serveur_artefacts.md index d9dacf0..d9f49c4 100644 --- a/wiki/Rôle-serveur_artefacts.md +++ b/wiki/Rôle-serveur_artefacts.md @@ -28,7 +28,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_backup.md b/wiki/Rôle-serveur_backup.md index c979213..b16f2de 100644 --- a/wiki/Rôle-serveur_backup.md +++ b/wiki/Rôle-serveur_backup.md @@ -26,7 +26,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_backup_site.md b/wiki/Rôle-serveur_backup_site.md index 1e2dd9c..a4a872f 100644 --- a/wiki/Rôle-serveur_backup_site.md +++ b/wiki/Rôle-serveur_backup_site.md @@ -26,7 +26,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_cache_site.md b/wiki/Rôle-serveur_cache_site.md index 116013d..dc143f8 100644 --- a/wiki/Rôle-serveur_cache_site.md +++ b/wiki/Rôle-serveur_cache_site.md @@ -26,7 +26,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_collabora.md b/wiki/Rôle-serveur_collabora.md index b5b0d0c..21096d7 100644 --- a/wiki/Rôle-serveur_collabora.md +++ b/wiki/Rôle-serveur_collabora.md @@ -28,7 +28,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_debian.md b/wiki/Rôle-serveur_debian.md index d8f4fb4..1a323c4 100644 --- a/wiki/Rôle-serveur_debian.md +++ b/wiki/Rôle-serveur_debian.md @@ -33,7 +33,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_dns_public.md b/wiki/Rôle-serveur_dns_public.md index d8d0dad..3a4619b 100644 --- a/wiki/Rôle-serveur_dns_public.md +++ b/wiki/Rôle-serveur_dns_public.md @@ -30,7 +30,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_dovecot.md b/wiki/Rôle-serveur_dovecot.md index c7e5eb4..d2cd2d5 100644 --- a/wiki/Rôle-serveur_dovecot.md +++ b/wiki/Rôle-serveur_dovecot.md @@ -30,7 +30,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_durci.md b/wiki/Rôle-serveur_durci.md index 8e99672..71f32eb 100644 --- a/wiki/Rôle-serveur_durci.md +++ b/wiki/Rôle-serveur_durci.md @@ -23,7 +23,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_forge_site.md b/wiki/Rôle-serveur_forge_site.md index d0da235..d1fa28a 100644 --- a/wiki/Rôle-serveur_forge_site.md +++ b/wiki/Rôle-serveur_forge_site.md @@ -26,7 +26,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_forgejo.md b/wiki/Rôle-serveur_forgejo.md index 95a4845..5ce70c5 100644 --- a/wiki/Rôle-serveur_forgejo.md +++ b/wiki/Rôle-serveur_forgejo.md @@ -29,7 +29,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_grafana.md b/wiki/Rôle-serveur_grafana.md index a74cae3..bfe8cb8 100644 --- a/wiki/Rôle-serveur_grafana.md +++ b/wiki/Rôle-serveur_grafana.md @@ -27,7 +27,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_icinga.md b/wiki/Rôle-serveur_icinga.md index 689aa1e..2e59a3c 100644 --- a/wiki/Rôle-serveur_icinga.md +++ b/wiki/Rôle-serveur_icinga.md @@ -31,7 +31,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_icingaweb2.md b/wiki/Rôle-serveur_icingaweb2.md index 3480bac..44e924e 100644 --- a/wiki/Rôle-serveur_icingaweb2.md +++ b/wiki/Rôle-serveur_icingaweb2.md @@ -27,7 +27,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_keycloak.md b/wiki/Rôle-serveur_keycloak.md index 9933804..830c61f 100644 --- a/wiki/Rôle-serveur_keycloak.md +++ b/wiki/Rôle-serveur_keycloak.md @@ -26,7 +26,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_loki.md b/wiki/Rôle-serveur_loki.md index d49e4bd..3e0ded9 100644 --- a/wiki/Rôle-serveur_loki.md +++ b/wiki/Rôle-serveur_loki.md @@ -34,7 +34,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_nextcloud.md b/wiki/Rôle-serveur_nextcloud.md index 4104215..2356dfb 100644 --- a/wiki/Rôle-serveur_nextcloud.md +++ b/wiki/Rôle-serveur_nextcloud.md @@ -26,7 +26,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_nginx.md b/wiki/Rôle-serveur_nginx.md index db6a3ac..4623874 100644 --- a/wiki/Rôle-serveur_nginx.md +++ b/wiki/Rôle-serveur_nginx.md @@ -30,7 +30,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_oauth2_proxy.md b/wiki/Rôle-serveur_oauth2_proxy.md index 536eda1..8cac024 100644 --- a/wiki/Rôle-serveur_oauth2_proxy.md +++ b/wiki/Rôle-serveur_oauth2_proxy.md @@ -26,7 +26,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_openldap.md b/wiki/Rôle-serveur_openldap.md index c28d498..ddb6702 100644 --- a/wiki/Rôle-serveur_openldap.md +++ b/wiki/Rôle-serveur_openldap.md @@ -31,7 +31,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_ops.md b/wiki/Rôle-serveur_ops.md index 3d80b2b..9ec5e27 100644 --- a/wiki/Rôle-serveur_ops.md +++ b/wiki/Rôle-serveur_ops.md @@ -29,7 +29,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_ops_site.md b/wiki/Rôle-serveur_ops_site.md index b57bfb9..ea81fdf 100644 --- a/wiki/Rôle-serveur_ops_site.md +++ b/wiki/Rôle-serveur_ops_site.md @@ -27,7 +27,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_ops_tenant.md b/wiki/Rôle-serveur_ops_tenant.md index bacc371..4b82cd3 100644 --- a/wiki/Rôle-serveur_ops_tenant.md +++ b/wiki/Rôle-serveur_ops_tenant.md @@ -26,7 +26,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_postfix.md b/wiki/Rôle-serveur_postfix.md index c3a413a..35c69e9 100644 --- a/wiki/Rôle-serveur_postfix.md +++ b/wiki/Rôle-serveur_postfix.md @@ -33,7 +33,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_powerdns.md b/wiki/Rôle-serveur_powerdns.md index 1ba3805..1177828 100644 --- a/wiki/Rôle-serveur_powerdns.md +++ b/wiki/Rôle-serveur_powerdns.md @@ -30,7 +30,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_prometheus.md b/wiki/Rôle-serveur_prometheus.md index 2b9a419..9f60c15 100644 --- a/wiki/Rôle-serveur_prometheus.md +++ b/wiki/Rôle-serveur_prometheus.md @@ -26,7 +26,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_redis.md b/wiki/Rôle-serveur_redis.md index 5c92f9f..1c06b48 100644 --- a/wiki/Rôle-serveur_redis.md +++ b/wiki/Rôle-serveur_redis.md @@ -26,7 +26,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_resolveur.md b/wiki/Rôle-serveur_resolveur.md index c56bc62..cccb513 100644 --- a/wiki/Rôle-serveur_resolveur.md +++ b/wiki/Rôle-serveur_resolveur.md @@ -27,7 +27,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_resolveur_site.md b/wiki/Rôle-serveur_resolveur_site.md index 33ec51f..ba81207 100644 --- a/wiki/Rôle-serveur_resolveur_site.md +++ b/wiki/Rôle-serveur_resolveur_site.md @@ -27,7 +27,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_rspamd.md b/wiki/Rôle-serveur_rspamd.md index d365c3d..be2650d 100644 --- a/wiki/Rôle-serveur_rspamd.md +++ b/wiki/Rôle-serveur_rspamd.md @@ -28,7 +28,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_step_ca.md b/wiki/Rôle-serveur_step_ca.md index 0995b7b..9792701 100644 --- a/wiki/Rôle-serveur_step_ca.md +++ b/wiki/Rôle-serveur_step_ca.md @@ -26,7 +26,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_web_dorsal.md b/wiki/Rôle-serveur_web_dorsal.md index ac42286..f0a1c2d 100644 --- a/wiki/Rôle-serveur_web_dorsal.md +++ b/wiki/Rôle-serveur_web_dorsal.md @@ -29,7 +29,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-serveur_web_frontal.md b/wiki/Rôle-serveur_web_frontal.md index effab58..6d1dcbb 100644 --- a/wiki/Rôle-serveur_web_frontal.md +++ b/wiki/Rôle-serveur_web_frontal.md @@ -28,7 +28,7 @@ graph LR ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-ssh_baseline.md b/wiki/Rôle-ssh_baseline.md index 2ef1882..ee5b7a8 100644 --- a/wiki/Rôle-ssh_baseline.md +++ b/wiki/Rôle-ssh_baseline.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-ssh_hardening.md b/wiki/Rôle-ssh_hardening.md index 7d004ec..6090bf8 100644 --- a/wiki/Rôle-ssh_hardening.md +++ b/wiki/Rôle-ssh_hardening.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-sudo_ansible.md b/wiki/Rôle-sudo_ansible.md index 644d15c..5a7d6df 100644 --- a/wiki/Rôle-sudo_ansible.md +++ b/wiki/Rôle-sudo_ansible.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-sysctl_hardening.md b/wiki/Rôle-sysctl_hardening.md index b820c47..2bb27fa 100644 --- a/wiki/Rôle-sysctl_hardening.md +++ b/wiki/Rôle-sysctl_hardening.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-systemd_ssh_auto.md b/wiki/Rôle-systemd_ssh_auto.md index a7dcaf5..96035e8 100644 --- a/wiki/Rôle-systemd_ssh_auto.md +++ b/wiki/Rôle-systemd_ssh_auto.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-template_cleanup.md b/wiki/Rôle-template_cleanup.md index f867d5a..3fa0c24 100644 --- a/wiki/Rôle-template_cleanup.md +++ b/wiki/Rôle-template_cleanup.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/Rôle-unattended_upgrades.md b/wiki/Rôle-unattended_upgrades.md index 96d02fb..04f24ad 100644 --- a/wiki/Rôle-unattended_upgrades.md +++ b/wiki/Rôle-unattended_upgrades.md @@ -16,11 +16,11 @@ graph LR ## Ce qu'il rend à la supervision -*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.* +*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/conception/supervision-conception.md`.* ## Ce qu'il expose en séries -*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.* +*Aucun exportateur déclaré — voir `docs/conception/metriques-conception.md`.* ## Ce qu'il coûte, et qui entre diff --git a/wiki/_Sidebar.md b/wiki/_Sidebar.md index 64a376d..cdc383f 100644 --- a/wiki/_Sidebar.md +++ b/wiki/_Sidebar.md @@ -41,7 +41,7 @@ - [Vérifier le déployé](Vérifier-le-déployé) **Opérations** -- Runbooks → dépôt `docs/runbooks-exploitation.md` +- Runbooks → dépôt `docs/exploitation/runbooks-exploitation.md` **Repères** - [Glossaire](Glossaire)