Architecture de déploiement
@startuml
!include <C4/C4_Container>
LAYOUT_LEFT_RIGHT()
System_Boundary(control, "Control-plane Elena") {
Container(cp, "Pilotage des déploiements", "MCU", "Métadonnées techniques minimales ; aucune donnée métier")
}
System_Boundary(a, "Déploiement local société A — projet Docker Compose dédié") {
Container(app_a, "Application Elena A", "Laravel, Vue, Octane", "API, workers et scheduler")
ContainerDb(db_a, "PostgreSQL métier A", "PostgreSQL", "Schémas des modules")
Container(id_a, "Identités A", "Identity provider", "Utilisateurs et rôles du déploiement")
Container(queue_a, "Files et caches A", "Queue, cache", "Traitements asynchrones")
Container(store_a, "Fichiers et sauvegardes A", "Object storage", "Imports, exports, pièces et sauvegardes")
Container(obs_a, "Supervision A", "Logs, métriques, traces", "Télémétrie du déploiement")
Container(audit_a, "Service d'audit A", "Append-only", "Collecte et scellement")
ContainerDb(audit_store_a, "Stockage d'audit A", "PostgreSQL, WORM", "Preuves et archives indépendantes du métier")
}
System_Boundary(b, "Déploiement local société B — projet Docker Compose dédié") {
Container(app_b, "Application Elena B", "Laravel, Vue, Octane", "API, workers et scheduler")
ContainerDb(db_b, "PostgreSQL métier B", "PostgreSQL", "Schémas des modules")
Container(id_b, "Identités B", "Identity provider", "Utilisateurs et rôles du déploiement")
Container(queue_b, "Files et caches B", "Queue, cache", "Traitements asynchrones")
Container(store_b, "Fichiers et sauvegardes B", "Object storage", "Imports, exports, pièces et sauvegardes")
Container(obs_b, "Supervision B", "Logs, métriques, traces", "Télémétrie du déploiement")
Container(audit_b, "Service d'audit B", "Append-only", "Collecte et scellement")
ContainerDb(audit_store_b, "Stockage d'audit B", "PostgreSQL, WORM", "Preuves et archives indépendantes du métier")
}
Rel(cp, app_a, "Provisionne et pilote", "métadonnées techniques")
Rel(cp, app_b, "Provisionne et pilote", "métadonnées techniques")
Rel(app_a, db_a, "Lit et écrit")
Rel(app_a, id_a, "Authentifie et autorise")
Rel(app_a, queue_a, "Produit et consomme")
Rel(app_a, store_a, "Lit et écrit")
Rel(app_a, obs_a, "Émet la télémétrie")
Rel(app_a, audit_a, "Émet les événements d'audit")
Rel(audit_a, audit_store_a, "Écrit et archive")
Rel(app_b, db_b, "Lit et écrit")
Rel(app_b, id_b, "Authentifie et autorise")
Rel(app_b, queue_b, "Produit et consomme")
Rel(app_b, store_b, "Lit et écrit")
Rel(app_b, obs_b, "Émet la télémétrie")
Rel(app_b, audit_b, "Émet les événements d'audit")
Rel(audit_b, audit_store_b, "Écrit et archive")
SHOW_LEGEND()
@enduml
TEC-OPS-002 — Déploiement local dédié et ressources non partagées
- Statut : brouillon
- Sources : DEC-0032
- Prescription : chaque instance Elena doit être exécutée localement pour une seule société dans un projet Docker Compose dédié, sans ressource portant des données de cette société partagée avec un autre projet Docker Compose.
- Raison fonctionnelle : garantir que les données et traitements de deux sociétés restent séparés par l’infrastructure et ne dépendent pas d’un filtrage applicatif.
- Contraintes et invariants :
- le projet Docker Compose possède ses propres application, base PostgreSQL métier, service d’identité et stockage d’identités, volumes persistants, stockage objet, files, caches et secrets ;
- chaque service Docker Compose, volume, réseau, secret et chemin de montage est propre au projet ; aucun nom de service, credential, volume ou route interne d’un autre projet n’est résolvable ou utilisable ;
- les API, workers, schedulers, traitements asynchrones, notifications, imports, exports, recherches et rapports n’accèdent qu’aux services, volumes et données de leur projet Docker Compose ;
- Données : le cloisonnement des tables métier ne repose sur aucun discriminant de société ; la séparation locale est obtenue par des ressources Docker Compose distinctes, pas par un périmètre métier partagé.
- Interfaces et événements : tout échange avec une autre organisation passe par une intégration externe explicitement configurée, autorisée et auditée ; les endpoints, credentials, zones de dépôt et files d’intégration sont propres au déploiement.
- Sécurité et audit : les journaux, configurations et données de test d’un projet Docker Compose ne contiennent ni secret ni charge métier d’un autre projet.
- Exploitation : la composition locale produit un inventaire machine-lisible des services, réseaux, volumes, secrets et montages appartenant au projet ; sa suppression ne cible que ses ressources.
- Vérification : VER-OPS-001
- Questions ouvertes : l’architecture d’infrastructure de qualification et de production (notamment Kubernetes, politiques réseau, RBAC, quotas, sauvegardes et restauration) est différée ; aucun dépôt d’infrastructure n’est encore désigné.
- Réalisation : fichiers Docker Compose et tests d’intégration locaux du dépôt
elenaà référencer. La réalisation de l’infrastructure cible fera l’objet d’une prescription ultérieure ; elle est hors périmètre de cette exigence.
Control-plane
Le control-plane peut conserver l’identifiant du déploiement, sa version, son état de santé, ses capacités activées, ses grants, ses quotas et les références nécessaires au pilotage. Il ne reçoit ni donnée métier, ni référentiel, ni identité utilisateur, ni secret, ni fichier, ni contenu de notification, ni événement ou archive d’audit, ni sauvegarde, ni journal applicatif, ni trace contenant une charge métier. Ses appels vers un déploiement sont authentifiés, autorisés, bornés à ce déploiement et audités.