Commit graph

126 commits

Author SHA1 Message Date
02bbba61b3 Nomenclature : VLAN dérivé (index × 10 + zone) pour réseau convergé
Sur un trunk convergé (tenants partagent l'infra), les VLAN doivent être uniques
GLOBALEMENT. deriver_nomenclature (ip-miroir) dérive VLAN = index×10 + zone : chaque
tenant son bloc de 10, 1-9 réservés à l'infra partagée. Le VLAN contenant le tenant,
le VMID mène avec le VLAN (VLAN·octet·seq, ≤ 9 chiffres Proxmox). compact (lab)
inchangé. GUI (miroir) + validation 1-4094 : compatibles.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 20:38:44 -04:00
a1cfe77b4a Modèles : extraire les modèles assemblés vers un dépôt privé (Set-OPS-modeles)
Le public ne garde que le modèle générique 'socle' (preuve libre reproductible).
Les modèles assemblés (identite/observabilite/forge/collaboration/presence-web/
integral) = actif commercial, déplacés dans Set-OPS-modeles (privé). Le moteur
(rôles, machinerie) reste libre.

NB : ces modèles restent dans l'HISTORIQUE git de ce dépôt — mettre Set-OPS-Public
en visibilité privée sur le Forgejo, ou réécrire l'historique (git filter-repo).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 19:31:50 -04:00
61a6526ffb Modèle presence-web : complété (rôles web existent) — expose + group_vars d'exemple
Les rôles serveur_web_frontal/dorsal existent maintenant → presence-web passe de
« rôles à construire » à . Apps frontal/dorsal exposées (site./app.<domaine>),
group_vars d'exemple (sites statiques + webapp Python). Instancie proprement.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 18:50:46 -04:00
af13fc37c9 Rôles web : renommer web_frontal/dorsal -> serveur_web_frontal/dorsal (convention)
Aligne sur la convention serveur_* de tous les rôles de service (vars incluses).
Le modèle presence-web (pré-existant) utilisait déjà ces noms -> il colle enfin.
Aussi : serveur_web_dorsal ne chown plus le code (reste root, lecture seule pour
l'app = plus sûr + git idempotent, fini le 'propriété douteuse' au pull).
Idempotence prouvée (2e passage changed=0). lint production.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 18:49:31 -04:00
c8ccbb5e97 client_pki : ré-émettre le cert sur dérive de SAN (fin du rm manuel)
Le garde 'creates:' sautait la ré-émission même quand les SAN voulus changeaient
(ex: nouvelle exposition -> client_pki_sans mis à jour). Contourné 3× à la main ce
soir. Corrigé : on lit les SAN du cert existant (openssl) et on ré-émet si le cert
est absent OU si un SAN voulu manque, puis on recharge les consommateurs
(client_pki_reload_services). Idempotent (SAN à jour -> sauté) + dérive détectée,
prouvés. ansible-lint production : 0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 18:43:23 -04:00
eee7dbd108 web_dorsal : rôle webapps dynamiques (2e brique plateforme, 100% natif)
Runtime (venv/paquets) + service systemd + nginx local, derrière l'edge, ZÉRO
conteneur. Chaque app : git clone (depth 1) → venv + pip → unité systemd durcie
(app en localhost, user webapp, NoNewPrivileges/PrivateTmp) → vhost nginx local
qui la fronte. data_dir persistant pour l'état local (SQLite) ; BD réseau via
resoudre_base sinon.

Éprouvé bout-en-bout sur web-frontal-01 par le rôle : monregistraire (FastAPI+
uvicorn+SQLite) cloné de Forgejo, servi via l'edge en HTTPS step-ca, API OK.
Avec web_frontal, la plateforme webapp native est complète. lint production: 0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 18:37:47 -04:00
72b7579c6e web_frontal : git clone superficiel (depth 1) + git installé + fix nom de tâche
Chemin git prouvé de bout en bout : le rôle clone le site depuis le Forgejo
souverain (depth 1 — pas l'historique lourd) et le sert derrière l'edge.
Éprouvé sur web-frontal-01 (Alliance Boréale servi via edge depuis /srv/web,
cloné de Forgejo). ansible-lint production : 0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 18:22:11 -04:00
f453f77268 web_frontal : rôle sites statiques (1re brique plateforme webapp, 100% natif)
nginx + sites statiques depuis un dépôt git souverain, derrière l'edge. Pas de
conteneur, pas de runtime, pas de BD — l'éthos libre/natif. Chaque site :
git clone → vhost (headers sécurité + CSP self-only, gzip, try_files). SAN edge
+ plancher auto-dérivés. meta/flux.yml (ingress 80 depuis edge).

Spike prouvé sur web-frontal-01 (site Alliance Boréale servi via edge, HTTPS
step-ca vérifié, CSP en place). NB : le chemin git-clone est codifié mais le
spike a servi via copie locale → à éprouver (pousser le site en Forgejo).
Les apps dynamiques (dorsal systemd) = rôle à venir. ansible-lint production: 0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 18:12:19 -04:00
1f9cc0a0d3 Modèles : nouveau modèle 'collaboration' + collaboration dans 'integral'
Ce qui manquait aux modèles = la collaboration (Nextcloud/Collabora), placeholder
'rôles à construire' du README, désormais bâti.

- exemples/modeles/collaboration/ : socle + identité + nœud collab (8 VM, zone
  Collaboration VLAN 20) ; nextcloud+collabora exposés (cloud/bureau, websocket auto),
  base nextcloud, client Keycloak nextcloud. SANs edge + plancher auto-dérivés.
- integral : + collab-01 (zone Applications), nextcloud/collabora/base/client — il
  tient enfin sa promesse de « tout ».
- README : collaboration .

Les deux modèles instancient proprement (collab dérivé, expositions auto).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 16:21:25 -04:00
0d2bc2c2e9 Machinerie d'exposition : SAN auto-dérivés + vhost WebSocket-aware
Élimine 3 gotchas du spike Nextcloud/Collabora :
- instancier dérive sans_exposition par edge (FQDN exposés du plan) → le cert edge
  (client_pki_sans) se met à jour tout seul, plus de liste manuelle en group_vars ;
- champ 'websocket' sur une application → le vhost d'exposition ajoute la map
  $http_upgrade + en-têtes Upgrade/Connection + timeout long (Collabora, éditeurs live) ;
- (plancher /etc/hosts : le mécanisme d'alias existait déjà, publier_expositions=true).

Prouvé sur le lab : cert edge couvre les 6 expositions, bureau 200 en WebSocket.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 15:30:22 -04:00
da4976aa98 serveur_collabora : rôle codifié depuis le spike (Docker, WOPI)
Conteneur collabora/code (restart always), publié sur localhost + IP LAN
(gotcha : bind localhost seul → 502 depuis l'edge), aliasgroup = domaine
Nextcloud, ssl.termination à l'edge, attente santé /hosting/capabilities.
meta/flux.yml (ingress 9980 depuis edge) alimente le registre des flux.

Docker (prouvé au spike) ; CODE natif = option future à spiker. Tag à épingler.
ansible-lint profil production : 0 échec.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 15:03:07 -04:00
79d0529686 serveur_nextcloud : rôle codifié depuis le spike (13 gotchas encodés)
Maison numérique souveraine (offres maison-obnl + cabinet). Tâches découpées :
paquets → php (512M + TLS PG) → install (occ, PG verify-full) → exposition
(vhost .mjs) → configure (overwrite/redis/anti-SSRF/import CA) → OIDC user_oidc
→ Collabora richdocuments (WOPI split URL) → thème Alliance (ciel étoilé).

Chaque réglage encode un piège prouvé sur collab-01 : imagick Debian 13,
PGSSLMODE dans php-fpm, MIME .mjs, allow_local_remote_servers (SSRF), import
root step-ca, memory_limit 512M, public_wopi_url après activate-config…

Version épinglée (robustesse). ansible-lint profil production : 0 échec.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 15:00:39 -04:00
c98bc8393f Registre des flux : schéma meta/flux.yml + pilote (postgresql/metrique/nginx)
Couche accès du zéro-confiance (complète le chiffrement). Chaque rôle possède
ses flux (comme meta/empreinte) : sens/port/protocole/pair/chiffrement/raison.
Résolu par le plan (pair→IP) → génère les règles nftables (default deny) ET le
registre d'audit. Doc de conception + 3 pilotes validés (résolveur-démo).

Séquence : schéma+pilote (fait) → résolveur → remplir les rôles → générer +
registre → activer nftables prudemment (action destructive).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 09:41:42 -04:00
04d807c78d Module Collaboration : squelette serveur_nextcloud (defaults/meta/README)
Cœur de l'offre maison-obnl (OBNL/coops). Surface de config posée (BD via
resoudre_base, Redis, OIDC Keycloak, Collabora WOPI, exposé cloud.<domaine>,
sauvegarde Tier 1). tasks/main.yml VOLONTAIREMENT absent : attend le spike
empirique (éprouver l'outil avant le rôle) — déployer + prouver OIDC/WOPI/
fichiers sur un vrai nœud avant de codifier.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 01:39:11 -04:00
5f3af67322 CHANGELOG 2026-07-05 : zéro-confiance (métriques/logs/courriel), VMID ip-miroir, Technolibre, FQDN, découplage tenant, modèles
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 01:14:49 -04:00
6eb178598f Modèles partiels rafraîchis (socle/identite/observabilite/forge) + presence-web flaggé
Réalignés sur le moule integral : 6 zones (numéros/VLAN cohérents), vmid_schema
ip-miroir, fonctions éprouvées (data→data-sql, idm→id-ldap+id-sso, mon→sup),
nouveaux intrants (fuseau_horaire/organisation/identite_realm). Prouvés (dérivation
9 chiffres + valider_serveurs).

presence-web : marqué ASPIRATIONNEL (fonctions web-frontal/dorsal sans rôle réel) —
honnêteté plutôt que faux-prêt. README général corrigé (état + intrants).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 01:11:52 -04:00
4037eafb63 Modèle integral rafraîchi : 6 zones, fonctions éprouvées, VMID ip-miroir, nouveaux intrants
Régénéré depuis le cas prouvé (Technolibre/lab), rendu générique (exemple.internal,
index à remplacer). 12 VM en 6 zones de sécurité, vmid_schema: ip-miroir, intrants
fuseau_horaire/organisation/identite_realm. Prouvé (dérivation + valider_serveurs).
README réécrit (tableau des zones, procédure d'instanciation).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 01:04:29 -04:00
867e2f8cdc Découplage instance : realm centralisé + vars génériques
Fin des dernières poches de 'codé en dur' liées à l'instance d'origine :
- realm SSO centralisé sur l'intrant identite_realm (defaut chezlepro,
  retro-compatible) ; les 4 rôles (keycloak/forgejo/grafana/oauth2_proxy)
  en dérivent. Expose dans la GUI (panneau Intrants).
- vars brandees renommees generiques : chezlepro_timezone -> fuseau_horaire,
  chezlepro_organisation -> organisation (chrony, openldap, GUI, docs).

Aucune reference fonctionnelle aux anciens noms. Le moteur ne porte plus le
nom d'un tenant. Technolibre a son propre realm (technolibre).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 00:47:44 -04:00
5108a6c04d Références par FQDN partout : fin des IP codées en dur
Décision d'archi : FQDN pour toute référence inter-services (non ambigu en
fédération — data-sql-01 existe chez plusieurs tenants — + nom canonique TLS).

- resoudre_base : db_host renvoie le FQDN (hote.domaine_interne) → propagé à
  keycloak/forgejo/icinga (ils en dérivent tous). Résolu par le plancher.
- client_journal : loki_url dérivé du groupe serveur_loki en FQDN (fin du
  10.0.14.11 périmé).
- nettoyage des defaults db_host IP morts (10.0.13.11, écrasés par resoudre_base).

Aucune IP littérale ne subsiste dans les defaults des rôles. verify-full OK
(SAN FQDN). S'applique au prochain déploiement.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 00:40:57 -04:00
f7b8438cbd nomenclature : VMID 9 chiffres ip-miroir (opt-in, fédération)
Nouveau schema VMID 'ip-miroir' (vmid_schema dans la nomenclature) : 9 chiffres
I·VVV·HHH·NN = index·VLAN·octet-hote·sequence. Le VMID contient l'IP
(10.(10+index).VLAN.hote) + le tenant → lecture directe. Defaut 'compact'
(retro-compatible) : les instances existantes (lab) gardent leurs VMID.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 22:58:08 -04:00
20329895f7 Zéro-confiance : flux Courriel chiffré (LMTP verify + client_smtp STARTTLS)
Deux sauts est-ouest en clair, corrigés :
- LMTP edge-mta -> infra-mail:24 : lmtp_tls_security_level=verify +
  lmtp_tls_CAfile=root_ca (le CONTENU des courriels). Dovecot LMTP offrait
  déjà STARTTLS (cert step-ca, SAN infra-mail-01) : aucun changement Dovecot.
- client_smtp -> edge-mta:25 : msmtp tls_starttls on + tls_trust_file root_ca.

Prouvé : livraison LMTP status=sent (verify ⇒ TLS obligatoire), msmtp tls=on
smtpstatus=250. Déjà chiffrés : submission :587, Postfix->LDAP ldaps, IMAP :993.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 21:47:29 -04:00
660aee91fa Zéro-confiance : flux Logs chiffré (Loki HTTPS + Alloy push https)
Loki sert son API en HTTPS via le cert step-ca (http_tls_config + cert-sync
owned loki, motif .path). Alloy pousse en https + tls_config (ca=root_ca).
Vars : serveur_loki_tls_actif, client_journal_loki_tls.

Prouvé : Loki HTTPS /ready 200 (vérif root_ca), HTTP rejeté (400), 4 hôtes
expédient des logs en https, 0 erreur loki.write après la transition.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 21:15:00 -04:00
e648009b87 Zéro-confiance : flux Métriques chiffré (node_exporter TLS + scrape https)
node_exporter sert en HTTPS via le cert step-ca (--web.config.file +
cert-sync owned prometheus, motif .path). Prometheus scrape en scheme https
+ tls_config (ca=root_ca), vérifie contre l'IP en SAN. Vars :
client_metrique_tls_actif, serveur_prometheus_metriques_tls.

Prouvé : node_exporter HTTPS 200 (vérif root_ca), HTTP rejeté (400),
4 cibles Prometheus UP en https sans erreur.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 21:04:40 -04:00
204910edbf Zéro-confiance PG : verrou hostssl + détection de version robuste
- pg_hba hostssl (serveur_postgresql_tls_force) : refuse les connexions
  non-TLS du réseau. Posé après validation des 3 clients en verify-full.
- Fix : tls_dir sous /etc/postgresql collisionnait avec la détection de
  version (find|sort|last prenait 'tls') → filtre numérique ^[0-9]+$ +
  tls_dir déplacé sous /var/lib/postgresql/tls.

Prouvé : non-TLS rejeté (« aucun chiffrement »), TLS accepté, 3 apps 200.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 20:46:53 -04:00
d26651a432 Zéro-confiance : IcingaDB→PG en TLS vérifié (cert step-ca)
config.yml database : tls: true + ca: root_ca step-ca. root_ca déjà 0644
(fix client_pki). Prouvé sur sup-01 : icingadb actif, log 'pgsql+tls://',
aucune erreur TLS. 3e et dernier client BD sur verify-full.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 20:32:05 -04:00
a51ddc6296 Zéro-confiance : Forgejo→PG en verify-full
SSL_MODE=verify-full dans app.ini [database] + PGSSLROOTCERT (root_ca step-ca)
dans l'unité systemd (lib/pq lit l'env). root_ca déjà 0644 (fix client_pki).

Prouvé sur forge-01 : accueil 200, SSL_MODE=verify-full, PGSSLROOTCERT ok,
aucune erreur TLS/DB. Déploiement propre du 1er coup (patron éprouvé).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 18:53:31 -04:00
fa6ef8b031 Zéro-confiance : Keycloak→PG en verify-full + root_ca lisible (0644)
- client_pki : root_ca.crt en 0644 (un cert racine est PUBLIC ; requis pour
  que les clients TLS non-root — keycloak, forgejo… — puissent vérifier).
- serveur_keycloak : db-url-properties sslmode=verify-full + sslrootcert.

Incident maîtrisé : 1er essai, keycloak (user keycloak) ne pouvait pas lire
root_ca 0600 → SSO down → restauré en <1 min → corrigé (0644) → verify-full OK.
Prouvé : realm 200, sslmode=verify-full, aucune erreur SSL/DB.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 18:45:16 -04:00
5aa7fcafdb PostgreSQL : servir le cert step-ca (TLS vérifiable), non-bloquant
Zéro-confiance flux PG, côté serveur : cert-sync (owned postgres, motif .path
comme Dovecot/Postfix) + ssl_cert/key/ca_file pointant sur le cert step-ca au
lieu du snakeoil. Garde-fou : ssl non activé si le cert n'est pas en place.
Reload robuste (instance postgresql@NN-main, pas le wrapper).

Prouvé sur data-sql-01 : cert servi = Set-OPS Internal CA (vérif root_ca ok),
keycloak/forgejo toujours 200 (TLS reste optionnel, rien de cassé).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 18:31:30 -04:00
b6952759f5 Doc à jour : unité wiki Autorisation & RBAC + leçon renouvellement + runbooks
Fermeture des dettes de doc :
- nouvelle unité wiki « Autorisation & RBAC » (authZ, exemple Grafana) ;
- section « le renouvellement est un système » dans l'unité PKI ;
- docs/runbooks-exploitation.md (cert expiré, RBAC Grafana, branding).
15 unités wiki.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 17:30:13 -04:00
94c9277c3d client_pki : recharger le vrai consommateur au renouvellement de cert
Bug latent de flotte : cert-renewer rechargeait un service nommé d'après le
cert (%i = FQDN, inexistant) au lieu du consommateur réel → nginx/postfix/
dovecot/slapd servaient l'ancien cert jusqu'à expiration. Symptôme : cert
edge périmé en mémoire → échec TLS OIDC → login SSO cassé.

Correctif : client_pki_reload_services (vrais consommateurs), par groupe.
Fix immédiat de l'incident : reload nginx sur l'edge.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 17:18:13 -04:00
c5df8fac4a RBAC via SSO : rôle de realm Keycloak → niveau Grafana (authZ)
Machinerie additive/idempotente dans serveur_keycloak (rbac-oidc.yml) :
rôles de realm + mapper 'roles' sur les clients choisis + assignations
rôle→utilisateur. kcadm à chaud (zéro coupure SSO). Grafana :
role_attribute_path (grafana-admin→Admin, grafana-editor→Editor, sinon
Viewer). Prouvé sur id-sso-01 (idempotence) : testmail = grafana-editor.

Complète le dashboard logs (Viewer-friendly) : les deux volets de la
question « testmail peut-il voir les logs ? ».

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 16:58:15 -04:00
4887d2aee8 Grafana : dashboard provisionné « Journaux de la flotte » (Loki, Viewer-friendly)
Provisioning de dashboards (provider + JSON) : un dashboard logs avec
sélecteur d'hôte + filtre regex + panneau logs + débit. Référence Loki par
une VARIABLE de datasource (ds_loki), pas un UID codé en dur.

Leçon : ajouter un uid explicite à une datasource déjà provisionnée casse
le démarrage de Grafana (« data source not found ») → variable de datasource.

Permet aux Viewers (dont testmail) de voir les logs sans accès Explore.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 16:10:59 -04:00
e9ca943425 Forgejo : identité visuelle Alliance (custom/ officiel, léger)
Branding via le dossier custom/ de Forgejo (mécanisme officiel, résistant
aux MAJ) : accent aurore par variables CSS, logo/favicon étoile, page
d'accueil brandée (home.tmpl), thème sombre, nom + méta. Codifié dans
serveur_forgejo (branding/app_name/theme). Prouvé sur forge-01.

+ CHANGELOG : entrées wiki pédagogique (14 unités) et GUI (boutons cohérents).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
EOF
2026-07-04 15:47:39 -04:00
716be304c5 wiki : 10 unités restantes (Communication, Données, Observabilité, Socle & méthode)
Complète les 14 unités d'apprentissage au moule à 4 temps : Reverse-proxy,
Courriel, Bases de données, Cache, Métriques & journaux, Supervision & impact,
Virtualisation, Sécurité & durcissement, Infra as Code & idempotence,
Liaisons (bindings, avec l'analogie NetScaler). Navigation complétée.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 15:33:17 -04:00
b342e5796b wiki : unités PKI, DNS, Sauvegardes (Fondations complètes + Données)
3 unités au moule à 4 temps : PKI & confiance (step-ca, chaîne, ACME, mTLS),
DNS & résolution (les 3 couches, le plancher), Sauvegardes (3-2-1,
restaurer-pour-prouver). Fondations = Identité + PKI + DNS complètes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 15:08:36 -04:00
3964a712b1 wiki : socle pédagogique + unité-pilote « Identité & SSO »
Set-OPS comme compagnon pédagogique : chaque service = une lentille sur un
fondamental TIC, méthodes génériques (on apprend OIDC, pas Keycloak).

Socle (source versionnée dans wiki/, à publier dans le wiki Forgejo) :
- Home : cadrage (moteur souverain ET outil d'apprentissage) ;
- _Sidebar : navigation (~15 unités, pilote active, reste à venir) ;
- Identité-et-SSO : unité-pilote, moule à 4 temps (concept → Set-OPS →
  transférable → à toi de jouer) avec exercices casse-répare.

Le wiki pointe vers docs/ (anti-dérive), ne le recopie pas.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 14:59:10 -04:00
a943fa6222 GUI : boutons cohérents (Créer la VM / Déployer), fin de « Pousser » ambigu
Audit des boutons : « Pousser » était surchargé — servait à cloner la VM
(🖥 Pousser = creer-vm) ET à déployer (= make deployer, identique à
« Déployer »). Corrigé :
- 🖥 Pousser -> « 🖥 Créer la VM » (il clone) ;
- tous les Pousser/Déployer -> « Déployer » (une action = un mot) ;
- dry-run obligatoire AUSSI sur le déploiement des pieds (évite un
  déploiement à l'aveugle ; cohérent avec un seul « Déployer ») ;
- titres/messages/console : Poussée -> Déploiement.

Chaque bouton fait désormais ce qu'il dit. GUI déjà entièrement francisée.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 14:40:02 -04:00
e006dee693 Retirer 3 rôles legacy (serveur_sendmail, client_dns, client_ldap) + nettoyage
Supprimés (supersédés / hors-conception) : serveur_sendmail (→ Postfix),
client_dns (→ plancher + client_unbound), client_ldap (login LDAP OS, hors
design). Rôles + playbooks de groupe retirés.

Nettoyage des références :
- dependances-groupes.yml : entrées client_dns/client_ldap retirées + entrées
  mortes des scaffoldings (nextcloud/collabora/client_supervision) ; deps
  périmées corrigées (client_smtp → serveur_postfix ; serveur_keycloak →
  serveur_postgresql, la raison parlait à tort de Nextcloud).
- 6 modèles d'exemple : app mail serveur_sendmail → serveur_postfix.
- README, AGENTS : listes/glossaire nettoyés.
- catalogue-services : listes, tables, roadmap ; note « rôles retirés ».
- nomenclature-vm : infra-mail-01 → serveur_dovecot (était faux).
- courriel-conception, dns-interne (re-ciblé client_unbound), pouvoirs,
  intrants, READMEs (client_smtp/forgejo/openldap/unbound).

ansible-lint : 0 échec (366 fichiers). instancier OK.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 12:14:04 -04:00
bcab586845 Agents observabilité/ops éprouvés — observabilité flotte-complète
client_metrique/journal/smtp déployés sur 4 nœuds et prouvés : Prometheus
scrape les 4 cibles (UP), Loki reçoit leurs logs, un nœud relaie un courriel
système livré. Comble le trou serveur-vs-flotte de l'observabilité.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 11:56:51 -04:00
346a6a5192 docs(bindings) : taxonomie des liaisons (niveau × modalité)
§11 : liaison = concept-chapeau. Axe niveau (liens app / intégrations nœud).
Axe modalité orthogonal : requise (constitutive, doit échouer si absente) vs
optionnelle (élective, opt-in). Le requis est déjà appliqué implicitement ;
raffinement = le rendre explicite (requis: true|false, fail-fast).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 11:39:40 -04:00
ecc7b2767b docs(keycloak) : documenter le thème Alliance + la compatibilité MAJ
README du rôle : section Thème (vars login/account/theme_cache, fonctionnement,
piège cache 'immuable', mise en garde MAJ Keycloak — calque PatternFly/parents,
pas de réapparition de l'ancien thème mais retouche possible après MAJ majeure,
check-list). + README court dans le dossier du thème.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 10:05:58 -04:00
c785e41520 Thème account Keycloak : lisibilité (texte clair, contraste)
Remonte les variables de couleur PatternFly atténuées (v5/v6/générique :
Color--200, text--color--subtle...) + force titres/labels/aides en clair,
pour que le contenu de la console de compte soit lisible sur fond aurore.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 09:50:03 -04:00
0419114755 Thème Keycloak : faire apparaître la constellation (attendre le DOM)
Keycloak injecte le script dans <head> → il tournait avant que <body>
existe (insertBefore plantait) → pas de canvas. Corrigé : init différé à
DOMContentLoaded + repli taille sur window.innerWidth/Height. Dégradé aurore
posé aussi sur body (repli si le canvas échoue). Script copié côté account.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 09:44:42 -04:00
e12c40e00c Keycloak : option cache de thèmes (lab = désactivé, prod = activé)
serveur_keycloak_theme_cache (défaut true=prod). À false, ajoute
spi-theme-static-max-age=-1 + cache-themes/templates=false dans keycloak.conf
→ ressources servies en no-cache : les tweaks de thème sont visibles sans
lutter contre le cache 'immuable' du navigateur. Bac à sable = false.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 09:39:27 -04:00
a917bac386 Thème account Keycloak : couvrir PF4+PF5 + fond aurore + constellation
Le SPA account peut être en PatternFly 4 (.pf-c-*) ou 5 (.pf-v5-*) selon la
version ; on cible les deux. Même correctif que le login : fond par défaut
effacé (transparent), ciel aurore + constellation remontés (z-index), cartes
en verre, champs et bouton en !important.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 01:30:17 -04:00
c5434bb33c Thème login Keycloak : corriger fond, constellation et champs (vrais sélecteurs KC 26)
Le thème "keycloak" de KC 26 est PatternFly (body sans classe, .pf-c-*).
Corrections : fond gris par défaut sur .login-pf-page effacé (transparent),
ciel aurore remonté (z-index 0, sous le contenu z-index 1) → la constellation
s'affiche ; champs ciblés en .pf-c-form-control !important (le mot de passe
n'était plus blanc) ; carte/bouton/liens en !important.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 00:07:49 -04:00
987ba88644 Thème Keycloak : console de compte (account) à l'identité Alliance
Thème account (parent=keycloak.v3) : overlay CSS surchargeant les variables
PatternFly 5 (fond aurore, cartes en verre, accent aurore, bouton dégradé)
+ la même constellation animée. Appliqué via kcadm -s accountTheme.

Prouvé : console charge (200, keycloak.v3 intact), account.css servi (200),
constellation.js référencé.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 23:54:19 -04:00
53acf1e209 Thème Keycloak : constellation animée en fond du login
Le JS (scripts=js/constellation.js) crée son propre ciel (canvas + aurore,
le template Keycloak n'en ayant pas) : champ d'étoiles scintillantes qui
dérivent, liens de constellation cyan, blob d'aurore ondulant. Respecte
prefers-reduced-motion. Reprend l'animation du site de l'Alliance.

Prouvé : constellation.js référencé + servi (200).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 23:47:44 -04:00
dd10ae8010 Thème de connexion Keycloak à l'identité Alliance Boréale
Thème login alliance-boreale (parent=keycloak + overlay CSS) reprenant
l'identité du site : ciel nocturne aurore, carte glassmorphism, logo étoile
(favicon du site), bouton dégradé aurore, police système (souveraineté).
Déployé dans themes/, appliqué au realm via kcadm loginTheme (idempotent).

Prouvé : page de login charge alliance.css (200) + logo.svg (200),
loginTheme=alliance-boreale actif.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 23:42:57 -04:00
1f1b722a00 Binding annuaire complété : icingaweb2 + client_ldap → resoudre_annuaire
Fin des 2 loose ends : icingaweb2 (LDAP dormant en mode SSO) résout via
resoudre_annuaire (redéploiement changed=0, SSO intact) ; client_ldap
(SSSD, dormant) ne pointe plus sur un idm-01 périmé.

Plus aucun rôle ne code en dur l'hôte d'annuaire — un seul point de vérité.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 23:24:38 -04:00