Aller au contenu

Monorepo VitaKYC — structure et conventions

Repo : vitakyc-platform/ (Gradle multi-projects). Distinct du repo vitakyc-docs (cette doc) déployé via la pipeline .gitlab-ci.yml que tu lis.

Ce document fixe la structure du monorepo applicatif VitaKYC : où vont les services, les libs, les ressources d’infra, comment activer un module, quelles conventions suivent les nouveaux développements.


vitakyc-platform/
├── settings.gradle.kts // active les modules au fur et à mesure
├── build.gradle.kts // conventions root (Kotlin JVM 21, Detekt, Spotless)
├── gradle/
│ ├── libs.versions.toml // version catalog (Kotlin 2.0, Ktor 2.3, ...)
│ └── wrapper/
├── tools/
│ ├── detekt-config.yml
│ └── ci/ // scripts CI partagés
├── platform/ // services transverses (auth, tenant, audit, webhook)
│ ├── auth-svc/ // ✅ actif — façade OIDC Keycloak + step-up MFA
│ ├── tenant-svc/ // ✅ actif — provisioning multi-tenant
│ ├── audit-svc/ // ✅ activé sprint 2 — audit log append-only signature chaînée HMAC (cf ADR-036)
│ └── webhook-svc/ // ⏳ à activer
├── shared/ // libs réutilisées par plusieurs services
│ ├── auth-client-jvm/ // ✅ actif — JWT verifier (Keycloak JWKS)
│ ├── observability-jvm/ // ✅ activé sprint 1 — OpenTelemetry + Micrometer/Prometheus + MDC (cf ADR-035)
│ ├── audit-client-jvm/ // ✅ activé sprint 2 — client lib audit (1 ligne/service, outbox local + retry, anti-PII guard) (cf ADR-036)
│ ├── api-contracts/ // ⏳ types DTO partagés cross-svc
│ └── kotlinx-utils/ // ⏳
├── modules/ // modules métier KYC (un par domaine)
│ ├── form-engine-jvm/ // ✅ activé sprint 0 — lib pure (DSL form, evaluator, validator, JSON canonique)
│ ├── form-designer-svc/ // ✅ activé sprint 2 — Ktor publish/activate, valide cpsPaths via cps-svc avant publish, FormDefinition (cf ADR-027)
│ ├── mrz-svc/ // ✅ activé sprint 0 — Ktor service exposant le parser MRZ ICAO 9303
│ ├── risk-engine-jvm/ // ✅ activé sprint 2 — lib pure (DSL Risk Matrix RBA, evaluator pur, model cards) (cf ADR-025)
│ ├── risk-matrix-svc/ // ✅ activé sprint 2 — Ktor publish/activate/evaluate, valide cpsPaths via HTTP cps-svc avant publish (cf ADR-025)
│ ├── cps-svc/ // ✅ activé sprint 2 — Client Profile Schema multi-tenant (validate symbols, deprecate, consumers) (cf ADR-026)
│ ├── sanctions-matcher-jvm/ // ⏳
│ ├── sanctions-svc/ // ⏳
│ ├── case-mgmt-svc/ // ✅ activé sprint 2 — workflow agent L1/L2/L3 (assign, review, approve, reject, escalate) (cf ADR-029)
│ ├── tx-monitoring-svc/ // ⏳
│ ├── aml-rules-engine-jvm/ // ⏳
│ ├── bio-svc/ // ✅ activé sprint 2 (MVP synchrone) — orchestrateur biométrique : OCR + MRZ + doc-auth + liveness + face-match + cross-checks (cf ADR-028 ; Temporal V2)
│ └── notification-svc/ // ⏳
├── apps/ // applications front (à venir)
├── frontend/ // (vide pour l'instant)
├── infra/ // resources d'infra
│ ├── docker-compose.dev.yml // ✅ stack dev complet (9 services)
│ ├── observability/ // ✅ overlay docker-compose : Tempo, Prometheus, Loki, Grafana, Alertmanager, OTel Collector (cf ADR-035)
│ ├── postgres/init-multi-db.sh
│ ├── keycloak/realm-template/vitakyc-saas-realm.json
│ ├── back-office-web/nginx.conf
│ ├── helm/ // ⏳ charts Kubernetes (prod)
│ └── k8s/ // ⏳ manifests K8s
└── scripts/ // utilitaires dev (lint, release, ...)

SuffixeTypeExemples
-svcService Ktor déployable (microservice avec endpoints HTTP)auth-svc, tenant-svc, mrz-svc, form-designer-svc
-jvmLib Kotlin pure (sans réseau, sans DB), réutilisable cross-svcform-engine-jvm, risk-engine-jvm, auth-client-jvm
platform/*Services transverses utilisés par tous les modules métierauth-svc, tenant-svc, audit-svc
modules/*Modules métier KYC (un par bounded context)form-designer-svc, bio-svc, case-mgmt-svc
shared/*Libs partagées entre modules ET platformauth-client-jvm, api-contracts

3 étapes.

//include(":modules:form-engine-jvm")
include(":modules:form-engine-jvm")

Lib pure (*-jvm) :

plugins {
alias(libs.plugins.kotlin.serialization)
}
dependencies {
implementation(libs.kotlinx.serialization.json)
implementation(libs.kotlinx.coroutines.core)
implementation(libs.slf4j.api)
testImplementation(libs.bundles.testing)
}

Service Ktor (*-svc) :

plugins {
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.ktor)
application
}
application {
mainClass.set("io.vitakyc.<domain>.ApplicationKt")
}
dependencies {
implementation(libs.bundles.ktor.server)
implementation(libs.kotlinx.serialization.json)
implementation(libs.kotlinx.coroutines.core)
implementation(libs.logback.classic)
testImplementation(libs.bundles.testing)
}
ktor { fatJar { archiveFileName.set("<svc-name>.jar") } }

Layout standard d’un service Ktor :

modules/<svc-name>/
├── build.gradle.kts
├── Dockerfile // multi-stage Gradle 8.10/JDK 21 → temurin alpine
└── src/main/kotlin/io/vitakyc/<domain>/
├── Application.kt // main + module wiring
├── config/AppConfig.kt // env vars
├── plugins/Plugins.kt // serialization, monitoring, status pages, routing
├── routes/<X>Route.kt // un fichier par regroupement d'endpoints
└── domain/ // model + business logic
└── src/main/resources/
└── logback.xml
└── src/test/kotlin/... // Ktor `testApplication { ... }`

Lancement :

Fenêtre de terminal
cd vitakyc-platform/infra
docker compose -f docker-compose.dev.yml up -d
ServiceImagePortUsage
postgrespostgres:16-alpine5432bases multiples : vitakyc_auth, vitakyc_tenant, vitakyc_audit, keycloak, temporal
keycloakkeycloak:25.08180IdP, realm vitakyc-saas importé au boot
kafkaapache/kafka:3.7.09092 / 29092mode KRaft single-node
opensearchopensearchproject/opensearch:2.179200sanctions screening, recherche full-text
vaulthashicorp/vault:1.178200KMS + signatures Ed25519 (mode dev)
temporaltemporalio/auto-setup:1.257233orchestration workflows
temporal-uitemporalio/ui:2.328088console Temporal
miniominio/minio:RELEASE.2024-09-229000 / 9001stockage S3-compat documents
auth-svcregistry.../auth-svc:develop8080OIDC façade
tenant-svcregistry.../tenant-svc:develop8082provisioning
mrz-svcregistry.../mrz-svc:develop8083parser MRZ ICAO 9303
back-office-webnginx:alpine8081SPA front statique

Health checks : tous les services exposent /health (Ktor) ou healthcheck Docker dédié (Postgres pg_isready, MinIO mc ready, etc.).

Reset complet :

Fenêtre de terminal
docker compose -f docker-compose.dev.yml down -v # WARNING: efface tous les volumes

TypeModuleStatutTests
Platformauth-svc✅ actif5 routes tests
Platformtenant-svc✅ actif2 routes tests
Moduleform-engine-jvm✅ activé sprint 018/18 verts (DSL, evaluator, validator, JSON canonique)
Modulemrz-svc✅ activé sprint 023/23 verts (18 parser + 5 route HTTP)
Sharedauth-client-jvm✅ actif(utilisé par auth-svc)

Tous les autres modules sont listés dans settings.gradle.kts mais commentés — activés au fur et à mesure des sprints.


Pipeline GitLab vitakyc-platform/.gitlab-ci.yml (en construction) — pour chaque service <svc>-svc :

  1. gradle :modules:<svc>-svc:test — tests JUnit + Ktor test host
  2. gradle :modules:<svc>-svc:buildFatJar — fat jar
  3. docker build -f modules/<svc>-svc/Dockerfile -t registry.e-vitalis.com/root/vitakyc-platform/<svc>-svc:$CI_COMMIT_SHA .
  4. docker push vers le registry interne
  5. (manuel) Helm release sur cluster K8s prod

Les images consommées par infra/docker-compose.dev.yml sont taguées :develop — alignées sur la branche main du repo.


Fenêtre de terminal
# Build le fat jar localement (gradle download le JDK 21)
./gradlew :modules:mrz-svc:buildFatJar
# Lance le service sur le port 8083
HTTP_PORT=8083 ~/.gradle/jdks/eclipse_adoptium-21-amd64-linux.2/bin/java \
-jar modules/mrz-svc/build/libs/mrz-svc.jar &
# Health check
curl http://localhost:8083/health
# → {"status":"ok","service":"mrz-svc"}
# Parse une MRZ TD3 ICAO standard
curl -X POST -H "Content-Type: application/json" \
-d '{"mrz":"P<UTOERIKSSON<<ANNA<MARIA<<<<<<<<<<<<<<<<<<<\nL898902C36UTO7408122F1204159ZE184226B<<<<<10","strict":false}' \
http://localhost:8083/v1/mrz/parse
# → {"format":"TD3","document_number":"L898902C3","surname":"ERIKSSON",...,"checksum_score":1.0}

SprintModules à activerPriorité
S0form-engine-jvm, mrz-svcbootstrap
S1cps-svc (registry CPS), form-designer-svc (consomme form-engine + cps), risk-engine-jvmflux Form Designer end-to-end
S2risk-matrix-svc, sanctions-matcher-jvm, sanctions-svcrisk + screening
S3case-mgmt-svc, notification-svc, audit-svcback-office compliance
S4tx-monitoring-svc, aml-rules-engine-jvmAML transactionnel
S5bio-svc (orchestrateur biométrique), webhook-svcbiométrie + livraison events

Chaque activation de module suit le pattern §3 et clôture sur :

  • Tests verts
  • Build Dockerfile fonctionnel
  • Service ajouté à infra/docker-compose.dev.yml
  • Update de cette page (statut + count tests)


Document tenu à jour à chaque activation de module. Sprint 0 livré le 2026-04-26.