voute du site : vault_pg_exportateur, et la chaine est complete

Le gabarit de voute reclamait cette cle pour serveur_postgresql ; la voute reelle
du site ne l avait pas. Le gabarit disait quoi mettre, personne ne l avait mis.

40 caracteres alphanumeriques : le mot de passe entre dans une URI de connexion
PostgreSQL, et un @ ou un / y couperait l URI en deux — l echec dirait mauvais
mot de passe au lieu d URI mal formee.

Gardes passees : copie de surete, dechiffrement vers un FICHIER jamais vers un
tube, relecture du YAML, en-tete verifie apres, empreinte comparee, 15 cles
relues, clair passe au shred. Le premier rechiffrement produisait du 1.2
etiquete la ou la voute portait du 1.1 — refait sans etiquette, parce que le
runner du site ouvre avec un unique fichier-cle.

Compte setops_metriques : ni superuser, ni createdb, ni createrole, membre de
pg_monitor et rien d autre.

Les huit panneaux des deux tableaux derives repondent, mesures sur le site.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
This commit is contained in:
Daniel Allaire 2026-09-14 17:16:23 -04:00
parent b02d3c900e
commit bb88f1f981
2 changed files with 59 additions and 1 deletions

View file

@ -1,5 +1,63 @@
# CHANGELOG — Set-OPS # 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 ## 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 Les roles declaraient leurs panneaux dans `meta/metriques.yml`, Prometheus en derivait deja

View file

@ -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). | | 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. | | 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). | | 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 | | 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). | | 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 | | 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 |