La reconstruction de Technolibre s'est arretee a l'insemination : la cle d'hote de la
forge s'ecrivait dans /opt/setops/.ssh, que le role ne creait que plus loin. Les runners
existants l'avaient deja ; seule une machine neuve le montre.
95 preuves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
L'epreuve du colis sur le runner de Technolibre : git bundle verify exige un depot
existant, et l'insemination est le cas ou il n'existe pas encore. Le clone verifie le
colis lui-meme ; un depot existant le verifie avant de tirer. Les colis restes d'un
passage interrompu sont retires.
make forge-cles rend aussi chaque depot prive ou public selon le role que lui donne le
plan du site, et seulement une fois les cles de lecture en place.
95 preuves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mesure sur le terrain : chaque runner lit son depot en SSH avec sa cle de deploiement,
et la forge lui refuse les autres, alors meme que les depots sont publics. Le role ne
clone plus en HTTPS que les depots publics ; les depots instance, tenant et hebergeur
passent en SSH, cle d'hote epinglee, commande SSH posee dans leur config git. Avant
l'armement, le controleur les apporte en git bundle. La cle d'hote de la forge est
declaree au plan du site et offerte par la fiche. genome_etat et genome_pousser lisent
l'API authentifies ; la sonde genome-servi compte les publics ; forge_amorcer cree
prives les depots des ecosystemes et du site. make forge-etancheite mesure le tout.
Les depots restent publics.
95 preuves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Debut du chantier des depots prives (docs/depots-prives-conception.md). La face reseau
publie genome: {depot, cle_lecture} ; P95 exige que la cle soit connue de la flotte, et
l'armement refuse une voute qui en remettrait une autre. make forge-cles enregistre
chaque cle en lecture seule sur le seul depot que la face nomme, retire une cle
perimee, ne touche jamais celle du runner du site. Flux SSH vers la forge du site
depuis les seuls runners des locataires (paire runners_locataires).
Rien n'est encore applique sur le terrain ; les depots restent publics.
95 preuves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Route en lecture /api/a-traiter et vue sous Veille, par gravite (a prendre, a savoir,
verifie). Locataire : genome face a la forge, face reseau, fiche du site, plan face a
l'inventaire, machines prevues. Site : genome, sa carte et chaque depot de locataire
face a la forge, face, index et fiche de chaque locataire. Les deux : joignabilite et
prerequis. Le niveau de la forge se lit par git ls-remote, sans rien ecrire.
94 preuves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
La cle du runner du site transitait par la face du locataire : lue dans le plan du
site, publiee dans la face, relue par le site. Le runner d'un locataire, sans ce
plan, recalculait une face sans elle. La face ne la porte plus ; le site l'ajoute en
clonant la machine qui porte serveur_ops_tenant, et elle seule, en tete des cles
(clonage_rendu). Le clonage par la face reste identique a l'octet pres au chemin du
poste (P93 le compare cle comprise). La console juge de nouveau la face partout.
94 preuves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sur le runner de Technolibre, la vue Lien avec le site disait la face a republier :
la cle d'amorcage d'ops-01 vient du plan du site, absent du runner, et la face
recalculee la perdait. Republier d'ici l'aurait retiree. La face se lit partout et
ne se juge plus que la ou le site est monte, comme la fiche. Un test le garde.
94 preuves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deux routes en lecture, /api/lien-site et /api/locataires-heberges, et deux vues
sous Veille : le locataire voit sa face reseau publiee et la fiche que son site lui
a deposee, le site voit ce que chaque locataire lui a publie. Chaque fichier est
montre avec son commit, que l'autre bout lit.
Un site de reprise ne juge plus la fiche deposee par l'hebergeur actif : il la
declarait perimee a chaque lecture (SITE-Technolibre). Un test le garde.
94 preuves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lot 1 de la refonte (affichage seul, aucune route ni pouvoir touche) :
- en-tete d identite colore par portee, PROD avec le nom ;
- navigation propre au locataire et au site, encadre Cette console peut ;
- parc en tableau groupe par categorie ; noeuds de la fabric et machines du site ;
- Verifier puis Deployer en tete de fiche ; assistants hors portee replies ;
- bandeau Plan modifie a la place du point sur le bouton.
Rapport de preuves du jour versionne, carte a 53 pieces d audit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
L assistant Tenir un site en etat ne proposait que locataire-creer, qui clone toutes
les VM manquantes. Il porte desormais l etape creer-vm (TENANT, HOTE), qui lit les
parametres de clonage de la face reseau publiee. Sans TENANT, la cible refuse.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
La sortie 80/443 que le socle donnait a toute machine ne servait plus a apt
(tout passe par le cache du site) mais a de la telemetrie et a des sorties
non declarees. Elle devient conditionnelle (seulement_si artefacts_amorcage
vide) ; la telemetrie de Grafana, Loki, Alloy et la verification de version
de Collabora sont coupees a la source ; rspamd et la sonde du genome
declarent leur sortie. Le devis du site evalue enfin seulement_si, ce qui
retire aussi le 465/587 vers un Postfix du site qui n'ecoute que sur 25.
Garde : test_conditions_site.py. Journal (125).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(122) Technolibre : trois passages, le dernier de bout en bout en 36 min ;
runner monte depuis le site seulement, pip freeze egal au verrou.
(123) Chezlepro : 43 min d'une traite, memes constats.
94 preuves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le requirements.yml genere portait version: \1 (regex_replace dans un bloc
YAML) ; ansible-galaxy refusait, et la reprise de la reconstruction de
Technolibre s'est arretee apres avoir pris roues et collections au site.
Version tiree du nom par decoupage, sans expression reguliere ; rejoue sur
le poste, les trois collections s'installent hors ligne.
test_verrou_runner.py rend desormais le fichier avec Jinja2 et compare.
94 preuves. CHANGELOG (121).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
La copie fichier par fichier du verrou ne cree pas son dossier, contrairement
a l'ancienne copie du cache entier. La reconstruction de Technolibre s'est
arretee a l'insemination sur un runner neuf (roues bien prises au site).
test_verrou_runner.py exige desormais que chaque dossier vise soit cree avant.
CHANGELOG (121) : l'arret, et le blocage site-pki-01 -> 10.37.32.1:8006 vu a
la frontiere, qui est la sonde de connectivite (resultat attendu).
94 preuves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
En --check, rien n'est telecharge depuis le site : le cache du controleur
reste vide et les messages annoncaient les 15 roues et les 3 collections
absentes du depot. Ils se taisent desormais en simulation.
CHANGELOG (121) : serveur_artefacts deploye au site, 18 sommes servies
conformes depuis ops-01, serveur_ops simule sur ce runner.
94 preuves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
verrou-runner.yml fige les 15 roues et les 3 collections qui tournent sur le
runner de Technolibre, avec URL amont et somme SHA-256. Le cache du runner
tenait deux versions de six bibliotheques selon le jour du montage.
- serveur_artefacts depose ces 18 fichiers au depot de binaires du site.
- serveur_ops les prend au site d'abord, somme verifiee ; repli sur Internet
dit en clair ; plus aucun pip download ni collection download ; seuls les
fichiers du verrou sont deposes sur le runner.
- ansible-core epingle a 2.18.19 (la version deployee).
- P70 exige le verrou au site ; test_verrou_runner.py dans make test.
AGENTS.md et CLAUDE.md : version allegee par l'operateur.
94 preuves. CHANGELOG (121).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Technolibre (43 min) et Chezlepro (44 min), d'une traite : 10 jeux restaures, temoins sans ecart, minuteurs apt remis a l'heure sur 12 VM, applications Nextcloud prises au site. Code a etiqueter : v2026.10.09.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Les minuteurs apt persistants d'un clone portaient la trace du gabarit (2026-06-21) et rattrapaient un passage dans l'heure suivant la naissance : apt-daily-upgrade a pris le verrou du cache des archives en plein amorcage d'infra-pki-01. Une trace plus ancienne que la machine est remise a l'heure et le minuteur relance, avant toute operation apt. Les correctifs restent automatiques.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
user_oidc et richdocuments epinglees (version, sha256), tenues par site-cache-01 dans le depot de binaires, installees par app_tierce.yml : site d'abord, amont en repli dit, somme puis signature (occ integrity:check-app), activation. P70 comprend les listes d'artefacts. L'app store a 77 ko/s avait arrete la reconstruction de Technolibre.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
client_backup (Technolibre, site) et serveur_backup (site) deployes ; les six services de sauvegarde du site OK apres relance. La difference de mot de passe vue en simulation n'etait qu'un blanc de fin.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
restic snapshots --latest 1 rend un instantane par groupe (machine et chemins) : la sonde gardait le premier, l'ancien, depuis qu'un jeu a ete ajoute a site-mon-01 (EN RETARD a tort, PERIME promis a 50 h). Meme motif cote serveur_backup. Le temoin de Loki ne compte plus l'index compacte. Journal (114), (115).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
La reconstruction de Technolibre s'est arretee : la recette a juge Prometheus 18 s apres sa relance par le premier depot d'obs-01. Elle redemande desormais, puis juge. Journal (112) Keycloak et (113).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
serveur_icinga deploye au site : catalogue pose, epinglage des paquets tiers. icingadb-redis 8.2.9 -> 8.2.10 (installe depuis le cache, invisible en --check) ; Icinga 2 et Icinga DB reconnectes. VM 99998 supprimee par l'exploitant.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Correction de (109) : la liaison des morceaux fonctionne (copie ~60 ms) ; les 10,75 s viennent de l'arret propre de Loki, qui attend un envoi d'Alloy jusqu'a son delai de 10 s. Aucune perte mesuree ; laisse tel quel.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copier 6 550 morceaux arretait Loki 13 s au site ; les lier prend 40 ms. Ils sont adresses par leur contenu ; chunks/index loge delete_requests.gz, qui se reecrit, et reste vraiment copie.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Les machines sauvegardees du site n'avaient pas setops-restaurer. client_backup deploye au site : 0 echec ; Prometheus arrete 523 ms, un releve manque ; Loki 13 s, aucun journal perdu.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Frontiere sans changement ; pare-feu Proxmox et nftables de mon-01 ouverts a obs-01 ; premier depot : Prometheus arrete 85 a 151 ms, Loki 582 a 614 ms, ecart maximal 30 s.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Les metriques et les journaux repartaient de zero a chaque reconstruction. setops-copie-a-froid arrete le service le temps de copier et le relance quoi qu il arrive ; les roles remettent la copie avant de demarrer ; les temoins jugent la couverture, pas les fichiers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le colis du genome ne portait que la branche : les etiquettes de release
n'arrivaient jamais sur la forge du site. Il les porte desormais, le runner les
pousse sans forcer, et la forge est relue par son API. publier.py pousse aussi
les etiquettes vers eregion. Le wiki, jamais publie sur la forge du site, l'est.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Technolibre puis Chezlepro, 43 min chacun, temoins sans ecart. L'AC d'Icinga
restauree garde l'environnement ; l'historique d'avant reste, 0 ligne orpheline.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sur les deux locataires : l'AC d'Icinga est desormais sauvegardee. Rejoues sur
Chezlepro, les temoins par cle voient les 412 lignes d'historique perdues que le
comptage cachait.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
L'historique d'Icinga DB etait exclu de la restauration (2026-09-30) : son
environnement derive de l'AC d'Icinga, recreee a chaque reconstruction. L'AC est
desormais un jeu de sauvegarde, remis avant api setup ; la base d'Icinga est
restauree, et son schema n'est importe que sur une base vierge.
Les temoins comparaient PostgreSQL par nombre de lignes et n'ont pas vu 412
lignes d'historique remplacees par 380 neuves. Ils comparent desormais par cle.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le devis lisait le gabarit du tenant : il validait chez Technolibre un 99998 que
plus rien ne clone, et refusait Chezlepro, qui suit la regle et n'en declare plus.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Premier essai reel sur Technolibre : pg_dumpall --clean recree template1, et
les bases vivantes etaient lues sans les modeles. Le test reproduit le filtre.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
M4 a reconstruit Technolibre par le site qui la nomme ; les 7 jeux sont revenus
de l'instantane de 11:34, mais le premier depot d'apres reconstruction l'a chasse
par --keep-daily le jour meme : plus rien a quoi comparer.
Le depot d'avant rasage est etiquete avant-raser et garde jusqu'a la
reconstruction suivante. Le bilan dit ce qui a ete restaure et si c'est encore
au depot. setops-restaurer temoins et make temoins-etat comparent l'etat vivant
a cet instantane : une perte ou une identite changee est un ecart.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sur le chemin TENANT=, raser annoncait un ecosysteme monte (rien n'est
monte sur le runner du site) et le devis de placement un tenant « ? ».
Les deux en-tetes disent desormais ce qui est vise et d'ou vient la liste.
Le pre-vol lui-meme est consigne : 13 VM, aucun conflit, placement conforme.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
reconstruire_locataire lance locataire-raser et locataire-creer TENANT= sur
le runner du site, sans monter le depot du locataire comme instance.
Trou de M2 corrige avant tout usage : le sous-make cloner-vm nommait le pool
par l'instance montee (hors de tout pool sur le site, pool de l'autre
locataire sur le poste). devis_proxmox_pools.py --pool-du-locataire le
derive de la face.
test_appels_locataire.py : un faux ansible-playbook consigne la ligne qui
part ; 26 machines, ancien chemin, site et poste identiques a l'argument
pres. Temoin : l'ancienne ligne de pool fait echouer le test.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
locataire-creer, locataire-raser et placement-plan TENANT= lisent la face
reseau du locataire, sans monter son depot comme instance. flotte-creer,
creer-vm et raser acceptent TENANT= ; sans lui, l'ancien chemin est inchange.
P94 : creer, raser et placer par la face visent les memes machines, VMID,
valeurs et ponts que l'ancien chemin, chacun mesure par sa commande lancee
a part. 116 controles dans test_contexte.py, temoins compris.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Chaque machine porte ce que parametres-proxmox rend, par la meme fonction.
P93 compare a la commande lancee a part pour les 26 machines.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
devis_proxmox_pools et vpn_admin prennent machines, VMID, etat, pairs et
index dans la face publiee. Sorties identiques a un worktree complet de
la version precedente ; temoins d'alteration verts.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
La face publie aussi fonctions ; les pools retrouvent leurs VM. La
comparaison a l'ancien code est refaite dans un git worktree complet :
les sept sorties du site sont identiques. Garde de regression ajoutee.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
decouvrir_du_site part de underlay.tenants et prend index et zones dans
la face publiee. Les sept sorties du site sont identiques a HEAD, a
l'octet pres ; frontiere-plan ne voit rien a faire.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
devis_opnsense prend dans la face publiee les adresses des groupes,
l'intrant d'administration, les verdicts, le tunnel et les zones
publiees. Devis identique a l'octet pres, a HEAD comme par le repli.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
La face publie le verdict des flux conditionnels ; devis_proxmox_fw y lit
inventaire, verdicts et administration. Devis identique, octet pour octet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
face-reseau.yml publiee chez chaque locataire (make face-reseau-publier) ;
les comptes de sauvegarde et le DNS public du site la lisent au lieu des
fichiers internes. Inventaire du site identique, octet pour octet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le site depose fiche-site.yml chez ses locataires (make fiches-site-
deposer) ; l'instancier y lit temps, delegation DNS et routage. Sans le
site, l'inventaire genere est identique au versionne, a l'octet pres.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
resoudre_flux publie les sorties vers l'Internet de chaque machine ;
verifier_sorties les confronte aux regles de sortie de la frontiere.
Le contrat site <-> locataire est entierement publie et prouve.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
La sonde connectivite essaie l'API Proxmox (8006) sur la passerelle par
defaut : chez un locataire en SDN, c'est l'hyperviseur dans son VRF, hors
de la frontiere. Ouvert -> CRITIQUE. Temoin : CONNECTIVITE_PASSERELLE.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>