Projet Elena

Cahier des charges · DEPLOY

TEC-OPS-002 — Déploiement dédié par société

Dernière modification du document source :

Date déclarée dans le document :

Document de référence présenté dans son intégralité. Le cahier des charges décrit le périmètre prévu ; il ne constitue pas une preuve de recette.

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

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.