Architecture Overview - ProbatioVault Backend¶
Architecture modulaire hexagonale avec NestJS
Vue d'ensemble¶
Le backend ProbatioVault est construit avec NestJS et suit une architecture modulaire hexagonale. Chaque module est indépendant et communique via des interfaces bien définies.
Architecture globale¶
┌─────────────────────────────────────────────────────────────┐
│ API Gateway (NestJS) │
│ REST API + Swagger + JWT │
└────────────────────────┬────────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌────────▼────────┐ ┌───▼────────┐ ┌───▼────────┐
│ Auth Module │ │ Documents │ │ Crypto │
│ (SRP-6a+JWT) │ │ Module │ │ Module │
└─────────────────┘ └────┬───────┘ └────┬───────┘
│ │
┌───────────────┼───────────────┼───────────┐
│ │ │ │
┌────────▼────────┐ ┌───▼────────┐ ┌───▼────────┐ ┌▼────────┐
│ Audit Module │ │ Storage │ │ Blockchain │ │ Jobs │
│ (Append-only) │ │ (S3/Glac) │ │ (Merkle) │ │ (BullMQ)│
└─────────────────┘ └────────────┘ └────────────┘ └─────────┘
│ │ │ │
└───────────────┼───────────────┼───────────┘
│ │
┌────────▼────────┐ ┌───▼────────┐
│ PostgreSQL │ │ Redis │
│ (Metadata) │ │ (Cache) │
└─────────────────┘ └────────────┘
│
┌────────▼────────┐
│ OVH S3 / AWS │
│ Object Storage │
└─────────────────┘
Modules principaux¶
1. Auth Module¶
- Responsabilité : Authentification Zero-Knowledge (SRP-6a) + JWT
- Technologies : Passport.js, JWT
- Dépendances : Crypto Module
- Endpoints :
/auth/register,/auth/login
2. Crypto Module¶
- Responsabilité : Services cryptographiques (hash, encryption, HKDF, keys)
- Technologies : js-sha3, Node.js crypto
- Conformité : NIST FIPS 202 (SHA3-256)
- Services :
HashService: Hash probatoire SHA3-256EncryptionService: AES-256-GCMHkdfService: Dérivation de clésKeysService: Gestion clés
3. Documents Module¶
- Responsabilité : CRUD documents probatoires
- Technologies : TypeORM, PostgreSQL
- Dépendances : Crypto, Storage, Audit
- Endpoints :
/documents/*
4. Audit Module¶
- Responsabilité : Journalisation immuable (append-only)
- Technologies : TypeORM, PostgreSQL
- Conformité : NF Z42-013
5. Storage Module¶
- Responsabilité : Interface S3/Glacier
- Technologies : AWS SDK
- Providers : OVH Object Storage, AWS Glacier
6. Blockchain Module¶
- Responsabilité : Arbres de Merkle + ancrage blockchain
- Technologies : SHA3-256, Web3 (futur)
- Services :
MerkleService: Construction arbres + preuvesAnchorService: Ancrage blockchain
7. Jobs Module¶
- Responsabilité : Tâches asynchrones
- Technologies : BullMQ, Redis
- Use cases : Archivage, ancrage, nettoyage
Flux de données typique¶
Upload d'un document¶
Client → Upload doc.enc
↓
Controller (validation JWT)
↓
DocumentsService
├→ HashService.hashDocument(doc.enc) → hash_doc
├→ StorageService.upload(doc.enc) → s3_key
├→ AuditService.logEvent("UPLOAD")
└→ PostgreSQL.save(metadata + hash_doc)
↓
Response: { doc_id, hash_doc }
Vérification d'intégrité¶
Client → GET /documents/:id/verify
↓
DocumentsService.verifyIntegrity()
├→ PostgreSQL.getDocument(id) → hash_doc_stored
├→ StorageService.download(s3_key) → doc.enc
├→ HashService.hashDocument(doc.enc) → hash_doc_computed
└→ Compare hash_doc_stored === hash_doc_computed
↓
Response: { isValid: true/false }
Principes d'architecture¶
1. Separation of Concerns¶
- Chaque module a une responsabilité unique
- Pas de couplage fort entre modules
- Communication via interfaces
2. Dependency Injection¶
- Injection native de NestJS
- Testabilité maximale
- Découplage des dépendances
3. Security by Design¶
- Validation stricte des inputs (class-validator)
- Guards pour protection des routes
- Audit trail pour traçabilité
- Pas de données sensibles en logs
4. Scalability¶
- Architecture modulaire permettant microservices
- Jobs asynchrones (BullMQ)
- Cache Redis pour performances
- Streaming pour gros fichiers
5. Testability¶
- 100% des services mockables
- Tests unitaires + intégration + E2E
- Couverture > 85%
Technologies utilisées¶
| Composant | Technologie | Version |
|---|---|---|
| Framework | NestJS | 10.x |
| Langage | TypeScript | 5.x |
| Base de données | PostgreSQL | 18+ |
| Cache/Queue | Redis | 7+ |
| ORM | TypeORM | 0.3.x |
| Tests | Jest | 29.x |
| API Docs | Swagger | 7.x |
| Conteneurisation | Docker | 24+ |
Stockage : Redis vs DynamoDB¶
Le projet utilise deux systèmes de stockage clé-valeur pour des usages distincts :
| Composant | Technologie | Localisation | Raison du choix |
|---|---|---|---|
| Jobs Backend (BullMQ) | Redis 7 | VPS OVH | Accès local rapide, queue persistante |
| Sessions SRP (futur) | Redis 7 | VPS OVH | TTL natif, performances |
| HSM Keep-alive (Lambda) | DynamoDB | AWS | Lambda isolé du VPS, serverless |
| Terraform Locks | DynamoDB | AWS | Backend S3 natif |
Pourquoi DynamoDB pour le HSM Monitor ?¶
La Lambda AWS HSM Monitor (PD-36) ne peut pas accéder au Redis du VPS OVH car :
- Lambda s'exécute dans le VPC AWS, isolé du réseau OVH
- Exposer Redis sur Internet serait un risque de sécurité
- DynamoDB est accessible depuis Lambda ET depuis CI/CD via AWS CLI
- Coût négligeable (~$0.25/mois) pour un usage faible
Références :
Conformité & Standards¶
- NIST FIPS 202 : SHA3-256 pour hash probatoires
- NF Z42-013 : Archivage électronique
- ISO 14641 : Conservation de l'information
- RGPD : Protection données personnelles
- OWASP Top 10 : Sécurité applicative
Prochaines évolutions¶
- Migration vers microservices (si nécessaire)
- Support GraphQL (optionnel)
- WebSockets pour notifications temps réel
- Clustering pour haute disponibilité
- Kubernetes deployment