ADR-0030 — Cible d'exécution : l'axe « serveur » est orthogonal au cercle et au couloir¶
Date : 2026-08-11
Catégorie : B (modèle de déploiement plateforme)
Décideur : Lead architecte DYNORS — à valider CTO
Statut : Proposée
S'appuie sur : [[0016-nomenclature-environnements-int-rmoa]] (cercles), [[0017-couloir-lane-unite-execution-explicite]] (couloirs), [[0019-modele-sirrat-dimension-couloir]] (attributs de couloir)
Sources : applications/sirrat/backend/.../port/DeploymentExecutor.java (champ target du contrat) ; .../service/DeploymentExecutionService.java (valeur "ref" codée en dur) ; .../model/Deployment.java ; dynors-ops/inventories/{staging,production}/hosts.yml
Contexte¶
La production DYNORS ne tiendra pas sur un serveur unique : plusieurs applications d'un même cercle devront tourner sur des machines distinctes. Or l'état du code suppose l'inverse, de manière implicite — donc jamais discutée.
Constats vérifiés :
- Le contrat d'agent prévoit une cible :
DeploymentCommand(applicationId, componentId, environment, **target**, artifactRef, requestedBy, metadata). MaisDeploymentExecutionServicey écrivait"ref"— c'est-à-dire le couloir. Le champ existait, on y mettait autre chose. Deploymentportaitenvironment,laneCode,appCode— aucun hôte. La question « la version 1.2.3 tourne sur quel serveur ? » était sans réponse.SirratProject.hostingetSirratLane.hostingexistent, mais au sens ADR-0019 : qui héberge (dynors/client), pas sur quelle machine.- Les inventaires ops ne déclarent qu'un hôte par cercle (
vps-prod-01,vps-staging-01). sirrat_api_url: http://localhost:8085/sirrat/apidans les deux inventaires — SIRRAT est supposé co-localisé avec l'application déployée.
Confondre couloir et serveur n'était pas gênant tant que le cercle tenait sur une machine. Ça le devient dès qu'il s'étend.
Décision¶
- Trois axes distincts et indépendants :
| Axe | Question | Porté par |
|---|---|---|
| Cercle (ADR-0016) | à quel stade du cycle ? | env_code |
| Couloir (ADR-0017) | quelle unité d'exécution parallèle ? | lane_code |
| Cible (cette ADR) | sur quelle machine ? | deployment_target |
Un couloir n'implique pas un serveur, et un serveur n'implique pas un couloir.
-
Une instance SIRRAT par cercle protégé, pas par serveur. L'instance de production pilote le cercle production, quel que soit le nombre de machines. Une instance par serveur ferait perdre ce qui justifie un plan de contrôle : la vue consolidée « quelle version tourne où », le karma par projet, l'état des gates.
-
La cible est déclarée sur la stack
(projet, cercle, couloir)— champsirrat_environment_stack.deployment_target. Une valeur nulle signifie « cible par défaut du cercle » : le comportement mono-serveur actuel reste valide et par défaut. -
La cible retenue est tracée sur le déploiement —
sirrat_deployments.target_host. Sans cela, l'audit ne peut pas répondre à où un déploiement a eu lieu. -
L'agent résout la cible, SIRRAT la désigne. SIRRAT ne connaît ni SSH, ni Docker, ni inventaire : il transmet une cible logique dans
target. L'agent — enveloppe des playbooks Ansible — la traduit en--limitou en groupe d'inventaire. Un agent central suffit : Ansible sait déjà atteindre N hôtes.
Conséquences¶
Positif : le multi-serveur devient déclaratif, sans changer le contrat d'agent (le champ existait) ; la traçabilité « quelle version, sur quelle machine » devient possible ; le choix d'un agent-enveloppe Ansible rend le multi-serveur presque gratuit — un agent par machine aurait exigé un déploiement, une rotation de secret et une résolution d'URL par cible.
Coût / risques : sirrat_api_url en localhost doit disparaître des inventaires dès
que les applications se répartissent — un playbook exécuté sur un hôte ne trouvera plus SIRRAT
en local. DeployAgentProperties n'a qu'une base-url unique : cela reste suffisant avec un
agent central, mais bloquerait une topologie « un agent par machine ». Le référentiel des
cibles (quel serveur existe, lequel est sain) reste hors SIRRAT : c'est l'inventaire ops.
Composants impactés : SirratEnvironmentStack (+ deployment_target), Deployment
(+ target_host), DeploymentExecutionService (résolution du placement au lieu de "ref"),
changeset 028-sirrat-deployment-target, inventaires dynors-ops, agent de déploiement,
UI SIRRAT (afficher la cible dans le détail d'un déploiement).
Alternatives écartées¶
- Une instance SIRRAT par serveur : perd la vue consolidée du cercle, multiplie les bases et les gates à réconcilier. Écartée.
- La cible portée par le couloir : un couloir peut légitimement s'étendre sur plusieurs
machines, et en production il n'y a qu'un couloir (
ref) pour toutes les applications — insuffisant pour les distinguer. Écartée. - La cible portée par le projet : rend une application incapable d'avoir un placement différent selon le cercle. Écartée.
Reste à trancher¶
- Réplication : une stack sur plusieurs cibles simultanées (aujourd'hui une seule). À traiter quand le besoin apparaîtra — le champ deviendrait une liste.
- Santé des cibles : SIRRAT doit-il refuser un déploiement vers une cible déclarée hors service, ou laisser l'agent échouer ? Suppose une source de vérité sur l'état des machines.