Plateforme multi‑tenant de gestion, circulation et signature de documents PDF avec 3 rôles : SuperAdmin, TenantAdmin, Employee.
Back‑end en .NET 9 (microservices, Clean Architecture + CQRS + Kafka), front en Angular 19, IA en FastAPI (résumé PDF).
✅ Objectifs : traçabilité complète du cycle de vie, sécurité JWT RSA/JWKS, montée en charge via microservices/kafka, UX moderne.
- Architecture
- Microservices & Ports
- Technologies
- Démarrage rapide (tout Docker)
- Démarrage local (hybride)
- Configuration (env)
- Endpoints utiles
- Seed de démo (optionnel)
- Docker: commandes utiles
- Dépannage
- Contribuer
- Licence
[Angular 19 SPA] --> [ApiGatewayService (4010)]
| JWT validation (JWKS)
v
+------------------ Microservices .NET 9 ------------------+
| Auth (1010) Tenant (1020) Users (1030) Dept (1040) |
| DocMgmt (2010) DocStorage (2020) Signature (2030) |
| Notification (3010) |
+-----------------------------------------------------------+
^
| HTTP (via Gateway) + Kafka events
|
[AIService FastAPI (3021)]
|
[Kafka / SQL Server]
- Synchrone via API Gateway (YARP).
- Asynchrone via Kafka (events:
document.signed,tenant.approved, ...). - JWT RSA signés par Auth, JWKS exposé et validé par Gateway + services.
- Clean Architecture & CQRS par service (Domain / Application / Infrastructure / Api).
| Service | Rôle | Port Host | Santé |
|---|---|---|---|
| AuthenticationService | Login, JWKS, rôles & claims | 1010 | /health |
| TenantService | Cycle de vie tenant (Pending → Approved/Rejected) | 1020 | /health |
| UserManagementService | Utilisateurs (SuperAdmin, TenantAdmin, Employee) | 1030 | /health |
| DepartmentService | Départements & affectations | 1040 | /health |
| DocumentManagementService | Workflow document: création → signature → validation | 2010 | /health |
| DocumentStorageService | Stockage/versioning PDF | 2020 | /health |
| SignatureService | Signature image + coordonnées (x, y) | 2030 | /health |
| NotificationService | Notifications internes | 3010 | /health |
| ApiGatewayService | Reverse proxy/YARP + validation JWT | 4010 | /health (si activé) |
| AIService (FastAPI) | Résumé PDF (BART) | 3021 | /health (FastAPI docs: /docs) |
| Frontend (Angular 19) | SPA par rôles | 4200 | - |
Tous les ports sont configurables via compose/ENV.
- Back‑end .NET 9 : ASP.NET Core, Clean Architecture, CQRS (MediatR), AutoMapper, FluentValidation, EF Core (SQL Server), Serilog, Swagger, HealthChecks, Kafka (Confluent).
- Sécurité : JWT RSA, JWKS, RBAC (claims
tenantId,role,plan). - Front : Angular 19 (standalone components, Material, SCSS, lazy‑loading), RxJS.
- IA : FastAPI, PyMuPDF, Transformers (facebook/bart-large-cnn), python‑jose.
- Conteneurs : Docker/Docker Compose.
- Observabilité : logs Serilog,
/health. (OpenTelemetry possible)
Nécessite Docker Desktop. L’infra (Kafka/SQL) est isolée dans
infra/.
# 1) Démarrer l'infra (Kafka, ZooKeeper, SQL Server, Kafdrop)
cd infra
docker compose up -d
docker compose ps
# 2) Démarrer l’application (gateway + microservices + front + ai)
cd ..
docker compose up -d --build
docker compose ps- Frontend : http://localhost:4200
- Gateway : http://localhost:4010/api
- Swagger de chaque service :
http://localhost:<port>/swagger - Kafdrop (si présent dans infra) : http://localhost:9000
Arrêt (tout en conservant les données) :
cd .
docker compose down # app
cd infra
docker compose down # infra
# (ne PAS ajouter -v si vous voulez garder les volumes/données)- Infra en Docker, services en local (pratique pour debug).
# 1) Infra
cd infra
docker compose up -d
# 2) Microservices en local (exemples)
cd ..\document_signing_solution_backend\AuthenticationService\AuthenticationService.Api
dotnet run --urls "http://localhost:1010"
# ... répétez pour Tenant (1020), Users (1030), Dept (1040), DocMgmt (2010), DocStorage (2020), Signature (2030), Notification (3010)
# 3) ApiGateway
cd ..\ApiGatewayService
dotnet run --urls "http://localhost:4010"
# 4) AIService
cd ..\AIService
uvicorn app.main:app --host 0.0.0.0 --port 3021 --reload
# 5) Frontend
cd ..\..\document_signing_solution_frontend
npm ci
ng serve --port 4200Configs à vérifier en mode local :
- Connexions SQL :
Server=localhost,1433;... - Kafka :
localhost:29092 - Authority (Auth) :
http://localhost:1010 - Base URL front :
http://localhost:4010/api/
Variables communes (exemple) :
# Exemple .env (ne PAS commiter .env — commitez .env.example)
SA_PASSWORD=Your_password123
ASPNETCORE_ENVIRONMENT=Docker
Kafka__BootstrapServers=kafka:29092
Jwt__Authority=http://authenticationservice:1010
Jwt__Audience=dss-api
Serilog__MinimumLevel__Default=InformationChaque service .NET a aussi sa ConnectionStrings__Default (BDD dédiée).
GET /healthsur chaque service (.NET)- Auth :
/.well-known/openid-configuration,/jwks,/api/auth/login - Docs :
/swagger(services .NET),/docs(FastAPI) - Gateway : routes
/api/*vers les upstreams internes
- Tenants : 1 Pending → 1 Approved (admin@entreprise.com auto).
- Users :
SuperAdmin,TenantAdmin, 2–3Employee. - Departments : 1–2 + affectations.
- Templates PDF : uploader 1 modèle.
- Documents : 1 doc créé depuis modèle → prêt à signer.
Vous pouvez ajouter un endpoint
/dev/seedpar service ou un script de seed REST centralisé.
# Build (tout ou un service)
docker compose build
docker compose build signatureservice
# Run / Stop
docker compose up -d
docker compose up -d --no-deps signatureservice
docker compose down # garde les volumes/données
# Inspect
docker compose ps
docker compose logs -f apigateway
# Nettoyage (prudence)
docker image prune -f
# reset total (perd données!)
# docker compose down -vgroup 'app' already existspendant le build :
→ En runtime image (aspnet:9.0), utilisezUSER appet supprimezgroupadd/useradd.COPY ...csprojnot found :
→ Lebuild.contextdoit pointer sur le dossier parent du microservice, etdockerfiledans*.Api/.- Kafka non joignable au démarrage :
→ Démarrer l’infra (infra/docker-compose.yml) avant les services. - SQL Server non prêt :
→ Attendre 20–40 s au premier lancement; vérifier la chaîne de connexion.
- Créez une branche
feature/<nom> - Committez avec messages explicites (conventionnel style recommandé)
- Ouvrez une Pull Request avec description/écran si possible
MIT (ou à préciser).
Projet pédagogique / soutenance – architecture et implémentation multi‑services, 2025.