La revision a commence par un balayage par motifs — chemins morts, cibles make absentes, comptes derives. Il a trouve une trentaine d ecarts et rate presque tout le reste : un motif ne voit que ce qui s exprime en motif. make hote-planifier en est l exemple. La cible EXISTE, donc le controle passait au vert. C est une cible depreciee qui refuse et sort en 2, recommandee par AGENTS.md, et qui contredit la REGLE D OR du meme fichier trois ecrans plus haut. Il fallait lire pour la voir. 74 documents lus un par un. 66 corriges, 8 exacts. CE QUI ETAIT FRANCHEMENT FAUX AGENTS.md, la source d autorite, annoncait la flotte pas encore executee contre des VM reelles. Elle a ete rasee et remontee depuis zero trois fois. ecosysteme-chezlepro.md, le document montre a un client, portait la meme phrase : il se sous-vendait gravement. courriel-conception.md s ouvrait sur aucun role n est encore ecrit, au-dessus de son propre paragraphe 1 qui les nomme. autorisation.md se terminait sur rien n est construit alors qu il rapporte des mesures datees du role en fonctionnement. hebergeur-exploitation.md disait rien n est fait d un depot qui existe. filiation-emancipation.md se contredisait a deux ecrans de distance. DES MODELES DECRITS D APRES UN MONDE ANTERIEUR Le resolveur : cinq documents decrivaient un Unbound par VM en opt-in, trois le donnaient en exemple d integration FACULTATIVE — il est universel depuis le 2026-08-24. L adressage de nomenclature-vm.md : reseau unique, VLAN 11-15, VMID a cinq chiffres. Le nommage SDN de sdn-evpn.md contre le code : c est le wiki qui avait raison. CE QUI CASSE AU PREMIER ESSAI Le nom du gabarit dore etait faux a quatre endroits, dont la procedure qui le FABRIQUE et le critere R2 de l epreuve d operateur independant. preparer-un-site-hebergeur.md avertissait qu une VM faite a la main serait detruite : raser derive du plan, il ne la detruira jamais — le risque est l inverse. Un mot de passe d essai en clair dans un depot public. DEUX PREUVES ETENDUES, ET UNE QUI SE TROMPAIT ELLE-MEME P57 couvre les groupes : elle a signale aussitot 29 groupes annonces au-dessus d un tableau qui en cite 40. P29 confronte le tableau de authentification.md aux declarations reelles : 12 annonces, 21 reels. Et P57 imposait un chiffre faux — 56 preuves alors que le depot en porte 57, la conditionnelle vivant hors de tout comptage. Un garde-fou qui fait respecter une erreur ajoute l assurance a l erreur. CE QUI RESTE, ET QU AUCUNE PREUVE NE TIENT Deux comptes trouves a la main. Et une lacune reelle : rien ne garde les meta/acces.yml — ni qu un service web-sso en porte un, ni que le groupe qu il nomme existe. P29 tient les positions d authentification, personne ne tient les habilitations. make prouver : CONFORME, 56 OK, 0 echec, 1 saute. 0 lien mort. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
10 KiB
Les pouvoirs de Set-OPS
Pour qui : qui évalue le moteur — ce qu'il sait faire, et ce qu'il ne sait pas encore.
Bilan des capacités du moteur. Établi le 2026-07-02, revu le 2026-09-06 : la frontière ⭐/🔧 avait cessé de dire vrai — deux reconstructions depuis zéro (2026-08-13, puis 2026-09-02) ont fait passer côté ⭐ presque tout ce que le §5 annonçait « à éprouver ». Fondé sur l'état réel du dépôt (≈65 rôles, ≈60 playbooks, le moteur de plan, la GUI). Le détail rôle par rôle vit dans
catalogue-services.md; ici on ne garde que le bilan.Deux niveaux de maturité sont distingués honnêtement :
- ⭐ Prouvé — déployé et vérifié de bout en bout sur cluster Proxmox réel.
- 🔧 Outillé — le rôle existe et est câblable par le plan, mais n'a pas (encore) été éprouvé en déploiement réel. À valider avant de le déclarer « prouvé » (cf. la méthode « éprouver l'outil avant le rôle »).
En une phrase
Set-OPS est un moteur souverain qui transforme un plan déclaratif en écosystème numérique complet — PKI, identité, DNS, web, courriel — cloné depuis un golden template durci, piloté par une GUI utilisable sans IA, en multi-tenant, tout en logiciel libre.
Le cœur d'infrastructure et la couche des services applicatifs (SSO, données, forge, observabilité, supervision, collaboration) sont prouvés de bout en bout : la flotte a été rasée puis remontée d'un seul trait, deux fois, sans échec.
1. Le moteur — transformer une intention en écosystème
Pouvoir central : plan déclaratif → écosystème vivant. On décrit quoi (des fichiers
plan/*.yml), Set-OPS fait comment.
scripts/instancier.py— litnomenclature / serveurs / applications / bases-donnees.ymlet dérive tout : VMID, IP, groupes d'inventaire, dimensionnement. ⭐- Nomenclature fédérée — le seul champ saisi est l'
index; supernet, VLAN, IP, passerelle et VMID en dérivent, sans collision possible entre instances. Le VMID est le miroir de l'adresse sur neuf chiffres —<VLAN><octet d'hôte><rang>, soit117602101pour1176·021·01: on retrouve la VM depuis son adresse, et l'inverse, sans registre. P20 interdit d'écrire un adressage au plan. ⭐ - Dimensionnement automatique — chaque rôle porte une
meta/empreinte.yml(cœurs / RAM / disque) ; l'outil somme les empreintes et taille la VM hôte. ⭐ - Multi-instance = multi-tenant — le symlink
instance/pointe vers un dépôt par écosystème, avec voûte et identité propres. Lab et prod ne sont qu'un cas particulier. ⭐ - Cycle de vie complet (cibles
make) :preparer-modele → instancier → creer-vm → deployer → verifier. ⭐
2. Le plan de contrôle — exploitable sans IA
Impératif fondateur : un sysadmin exploite l'outil sans IA ; l'IA n'assiste que le mainteneur.
- GUI souveraine (
scripts/inventory_gui.py, stdlib pure, aucune dépendance) : visualise le plan, bouton « Pousser » (crée la VM pour un serveur / déploie pour une app ou une base), sonde de vivacité, passage auto en « actif », jeton d'authentification. ⭐ - Voûte au déploiement — secrets chiffrés par Ansible Vault, jamais en clair dans la
GUI, qui n'en montre que les noms. Une voûte, une clé (2026-08-28) : chaque dépôt a la
sienne, et le
Makefileles rassemble tout seul (scripts/voutes.py), sans rien exporter ni rendre l'exécution interactive. ⭐ - Validation intégrée —
syntax-check,ansible-lint(profil production),verifier. ⭐
3. Le socle — un golden template durci
⭐ Prouvé : clone + application du socle de bout en bout sur le cluster Proxmox.
- Base :
common_packages,chrony,qemu_guest_agent,cloud_init,motd,hosts_statiques(plancher de résolution, indépendant du DNS),sudo_ansible,template_cleanup. - SSH :
ssh_baselinepuisssh_hardening(bascule mot de passe → clé, seulement après validation de l'accès par clé). - Durcissement — les dix rôles que compose le groupe
serveur_durci:hardening_packages,sysctl_hardening,core_dumps,unattended_upgrades,apparmor,auditd,fail2ban_ssh,journald,ssh_hardening,nftables_baseline(éteint dans le rôle, armé par le plan :hotes_actifsle met àtrue, le gabarit doré le laisse àfalse— le pare-feu n'est pas une propriété du rôle, c'est une décision de l'instance). Le jeu de règles n'est pas écrit à la main : il est dérivé du registre des flux (meta/flux.yml→scripts/resoudre_flux.py). - Proxmox : clonage depuis le golden template + redimensionnement disque (grow-only).
Séparation nette : Proxmox + cloud-init donnent l'identité initiale de la VM ; Set-OPS + Ansible font la configuration réelle du serveur.
4. Les piliers d'infrastructure — tous prouvés ⭐
| Domaine | Rôle(s) | Preuve |
|---|---|---|
| PKI | serveur_step_ca + client_pki |
AC interne + mTLS avec SAN, empreinte racine câblée |
| Identité | serveur_openldap |
LDAPS réel sur certificat step_ca |
| DNS interne | serveur_powerdns |
résolution interne |
| Reverse-proxy | serveur_nginx |
frontal web |
| Courriel (Étape A) | serveur_dovecot + serveur_postfix + serveur_rspamd |
flux complet : SMTP → validation LDAP → LMTP → boîte → lecture IMAP + antispam + signature DKIM |
La messagerie interne est un service souverain complet : réception SMTP, validation des boîtes par annuaire LDAP, remise LMTP réseau chiffrée step_ca vers le stockage, accès IMAP authentifié LDAP, filtrage antispam et signature DKIM en milter. Topologie MTA dédié en périphérie / boîtes à l'intérieur (défense en profondeur).
5. Les services applicatifs — prouvés depuis ⭐
Ce paragraphe annonçait, jusqu'au 2026-09-06, des rôles « construits mais à éprouver ».
Ils l'ont été : la reconstruction depuis zéro les a tous repris sur machine nue
(2026-08-13, puis 15/15 et 14/14 hôtes le 2026-09-02, make valider à 0 échec).
- SSO web :
serveur_keycloak— OpenLDAP source de vérité, fédération LDAP automatisée, courriel en bind LDAP direct. ⭐ - Passerelle SSO :
serveur_oauth2_proxy— met au SSO une application sans OIDC natif (éprouvé devant Icinga Web 2). ⭐ - Données :
serveur_postgresql,serveur_redis— bases et comptes dérivés du registre, TLSverify-fullde bout en bout. ⭐ - Forge logicielle :
serveur_forgejo— Git + PostgreSQL + SSO OIDC. ⭐ - Observabilité :
serveur_prometheus,serveur_grafana,serveur_loki, avec les clientsclient_metriqueetclient_journal. ⭐ - Supervision :
serveur_icinga,serveur_icingaweb2— Icinga 2 + IcingaDB + Web 2 + BPM. Sans agent sur les hôtes : contrôles actifs depuis le cœur, résultats passifs poussés par l'API. ⭐ - Sauvegardes :
serveur_backup,client_backup— restic hors-nœud, chaque nœud vérifiant son propre dépôt distant, restauration éprouvée. ⭐ - Plateforme webapp :
serveur_web_frontal,serveur_web_dorsal— statique et natif (venv + systemd + nginx), zéro conteneur. ⭐ - Intégrations transverses :
client_pki,client_backup,client_smtp,client_metrique,client_journal,client_resolveur,client_artefacts. ⭐
Reste 🔧 outillé — déployé, mais dont l'usage n'est pas consigné comme preuve :
- Collaboration :
serveur_nextcloud,serveur_collabora(natif, plus de conteneur). Base et client OIDC dérivés du plan, posés par la reconstruction ; le dépôt d'un fichier et l'édition partagée à deux, eux, n'ont pas été consignés. 🔧
Deux noms ont été retirés de ce paragraphe parce qu'ils n'ont jamais existé :
client_supervision(la supervision est sans agent — cf.catalogue-services.md) et les « méta-rôles d'agrégation »identity/storage. La conformité passe parplaybooks/groupes/, un playbook par groupe ; les répertoiresplaybooks/applications/,database/,web/,monitoring/,backup/ne contiennent qu'un README d'espace réservé.
6. Les patrons d'ingénierie — la valeur invisible ⭐
- Pont de certificat step_ca → service, avec resynchronisation au renouvellement (unité
systemd
.path). Réutilisé par openldap, dovecot, postfix. - Ordonnancement socle-first — le plancher
/etc/hostsest posé avant les clients qui en dépendent (ex.client_pkisur un nœud neuf). - Sûreté en check-mode —
when: not ansible_check_modesur les tâches de service, pour un dry-run fiable même quand le service n'est pas encore installé. - Idempotence —
changed=0au redéploiement (prouvé). - Méthode « éprouver l'outil avant le rôle » — inspecter empiriquement le vrai binaire avant d'écrire le rôle qui l'enveloppe. A évité les bugs de premier déploiement (rspamd : zéro bug ; pivot Stalwart → Postfix/Dovecot/rspamd décidé sur preuve).
- Machine d'épreuve jetable (
make cloner-vm) — l'instrument de la méthode ci-dessus : une Debian issue du gabarit doré, sur le réseau choisi, en deux minutes, hors du plan. Le moteur ne la connaît pas — donc aucune politique, aucun certificat, aucune sauvegarde, etmake raserne la détruira jamais. À détruire à la main. Voirvm-lifecycle.md§4bis.
Prochaines frontières
- Consigner l'usage de la collaboration (dépôt de fichier, édition partagée) — le seul 🔧 qui reste.
- Courriel Étape B (public) : DNS public (MX, SPF, DKIM — clé
setops._domainkeydéjà générée, DMARC), MX externe et réputation, PTR / FCrDNS. - Les équipements de l'hébergeur — hyperviseurs, commutateurs, frontière : ni inventaire,
ni sauvegarde de configuration, ni supervision. Les VM du site en ont depuis le 2026-09-02,
les équipements non (cf.
hebergeur-exploitation.md). - Seuils d'adoption d'outils tiers (NetBox, AWX) plutôt que de réimplémenter le plan de contrôle maison, qui reste volontairement gelé.
Principe fondateur : tout est libre. L'univers numérique (Alliance Boréale / Chezlepro / Set-OPS) se construit exclusivement avec du logiciel libre.