diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ff14ee..2c71b92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,63 @@ # CHANGELOG — Set-OPS +## 2026-09-14 (16) — Le dernier maillon : l'exportateur PostgreSQL, et huit panneaux qui repondent + +L'entree precedente laissait le tableau de PostgreSQL assemble, charge, et **vide** : +`serveur_postgresql` saute son exportateur tant que `vault_pg_exportateur` n'est pas dans +la voute. Il y est maintenant, et la chaine est complete de bout en bout. + +### Le secret, pose avec ses gardes + +`vault_pg_exportateur` etait deja au **gabarit** de voute — `scripts/voute.py lister` le +reclamait pour `serveur_postgresql`. Il manquait a la voute REELLE du site. Le gabarit +disait quoi mettre, personne ne l'avait mis : c'est exactement ce que ce gabarit existe +pour attraper, et il l'a attrape. + +Quarante caracteres **alphanumeriques**, et ce n'est pas de la pruderie : ce mot de passe +entre dans une URI de connexion PostgreSQL (`DATA_SOURCE_NAME`). Un « @ », un « : » ou un +« / » y couperait l'URI en deux, et l'echec dirait « mauvais mot de passe » au lieu de +« URI mal formee ». + +LES GARDES, toutes passees : copie de surete avant toute ecriture ; dechiffrement vers un +FICHIER et jamais vers un tube — `ansible-vault` ecrit sur stderr, et un tube ferme le fait +echouer en silence ; relecture du YAML avant de rechiffrer ; en-tete `$ANSIBLE_VAULT` +verifie apres ; empreinte comparee ; les quinze cles relues une a une ; copies en clair +passees au `shred`, pas au `rm`. + +UN DETOUR, CORRIGE AVANT DE NUIRE. Le premier rechiffrement, fait sous +`--encrypt-vault-id`, a produit du **format 1.2 avec une etiquette** la ou la voute portait +du 1.1 sans etiquette. Le runner du site ouvre cette voute avec un unique fichier-cle : une +etiquette qu'il ne connait pas etait un risque pour rien. Rechiffree en 1.1, comme avant. + +### Le compte, et ce qu'il peut + + setops_metriques superuser=f createdb=f createrole=f membre de : pg_monitor + +`pg_monitor` donne les vues de statistiques et **elles seules** — aucune donnee +applicative. Faire tourner un exportateur en `postgres` serait donner les cles de la base +pour lire des compteurs. + +### Les huit panneaux, mesures + +| tableau | panneau | ce que Prometheus rend | +|---|---|---| +| client_metrique | Memoire disponible | 10 series, 20 % a 87 % | +| | Espace libre (le plus serre) | 10 series, 28 Go a 401 Go | +| | Charge par coeur | 10 series | +| | Trafic reseau entrant | 10 series, 65 o/s a 5,4 Mo/s | +| serveur_postgresql | Connexions utilisees | 1 serie | +| | Taux de succes du cache | 1 serie | +| | Taille des bases | 4 series, 7,5 a 10,9 Mo | +| | Transactions par seconde | 1 serie | + +DEUX PANNEAUX ONT MIS DEUX MINUTES A REPONDRE, et il fallait savoir pourquoi avant de +conclure. Les deux emploient `rate(...[5m])` : un taux exige au moins deux echantillons +dans la fenetre, et l'exportateur venait de naitre. La verification n'a pas attendu en +esperant — elle est allee lire les metriques BRUTES chez l'exportateur (4 series chacune) +puis dans Prometheus (4 series chacune) : les noms etaient bons, seul le temps manquait. +Un panneau vide parce qu'une metrique n'existe pas et un panneau vide parce qu'il est trop +tot se ressemblent parfaitement, et n'appellent pas le meme geste. + ## 2026-09-14 (15) — Le generateur de tableaux : les panneaux declares deviennent des tableaux Les roles declaraient leurs panneaux dans `meta/metriques.yml`, Prometheus en derivait deja diff --git a/docs/audit/preuve-2026-09-14.md b/docs/audit/preuve-2026-09-14.md index be39d1e..9d0da9e 100644 --- a/docs/audit/preuve-2026-09-14.md +++ b/docs/audit/preuve-2026-09-14.md @@ -72,7 +72,7 @@ | P57 | Comptes en prose : les chiffres du depot sur lui-meme | — | ✅ OK | Les comptes ecrits en prose correspondent a la mesure (77 preuves, 68 roles, 41 groupes). | | P58 | Habilitations : chaque service dit a quel GROUPE, et par quoi | — | ✅ OK | 8 habilitation(s) declarees, toutes nommant un groupe, un mecanisme connu et une raison ; les `role-realm` sont projetees. | | P59 | Enumerations annoncees : le nombre correspond a ce qui suit | — | ✅ OK | 2 enumeration(s) annoncee(s) correspondent a ce qu'elles annoncent (formes non ambigues seulement). | -| P60 | Wiki publie : la forge sert ce que le depot dit | AFF-002 | ✅ OK | Le wiki publie correspond au depot : `wiki/` n'a pas bouge depuis `311f33d` (publie le 2026-09-14). | +| P60 | Wiki publie : la forge sert ce que le depot dit | AFF-002 | ✅ OK | Le wiki publie correspond au depot : `wiki/` n'a pas bouge depuis `392da4d` (publie le 2026-09-14). | | P61 | Schema du plan : il decrit tout ce que les plans contiennent | AFF-033 | ✅ OK | Le schema decrit 47 champ(s) sur 6 registres ; il couvre tout ce que les plans reels contiennent, et la FORME de chaque champ (scalaire / objet / table) corresp | | P62 | Schema du plan : il decrit tout ce que le MOTEUR accepte | AFF-033 | ✅ OK | Les 4 validateurs n'acceptent aucun champ que le schema ignore (applications:8, bases_donnees:4, domaines_publics:5, serveurs:3 champ(s) lus par validateur). | | P63 | cloud-init nait avec la VM et ne lui survit pas | — | ✅ OK | cloud-init est au gabarit (la premiere seconde), absent du socle (pas de va-et-vient), et retire par le durcissement — avec la garde qui verifie que le reseau s |