Architecture¶
Le dépôt est un monorepo : une SPA React 19 + Vite + TypeScript et une API Express qui agrège les flux publics de vulnérabilités. Le SPA ne parle jamais directement à NVD ou OSV ; tout le trafic sortant passe par le serveur pour centraliser clés, cache et limites.
Ce chapitre mappe dossiers et responsabilités, décrit le flux scan/veille via les handlers et pointe vers OpenAPI servi à l'exécution.
Topologie haut niveau¶
flowchart LR
classDef ui fill:#e9edf5,stroke:#00baba,color:#253343
classDef api fill:#f3fcfc,stroke:#008c8c,color:#253343
classDef ext fill:#fff7ed,stroke:#eda232,color:#253343
Browser[Browser SPA]:::ui --> API[Express /api]:::api
API --> NVD[NVD]:::ext
API --> OSV[OSV]:::ext
API --> GH[GitHub]:::ext
API --> CISA[CISA KEV]:::ext
API --> RSS[RSS]:::ext
Parcours du diagramme¶
Le navigateur persiste pile, locale et bascules de sources dans localStorage, puis appelle POST /api/scan ou POST /api/watch. La couche API valide les corps JSON, invoque scanStack dans server/services/scan.ts et renvoie les vulnérabilités fusionnées. La logique par fournisseur est sous server/services/ ; la déduplication partagée dans server/lib/merge.ts ; l'enrichissement traduction dans server/services/enrich.ts.
Chemin de requête (scan complet)¶
server/routes/scan.tsreçoitPOST /scan.server/handlers/scanHandlers.tsparse le corps viastackValidation.ts.scanStackrésout sources intégrées et flux RSS personnalisés activés.- Fetch parallèles par outil terminés ; fusion et tri.
enrichVulnsWithTranslationsoptionnel sitranslate: true.- JSON
ScanResponseau client ;persistLastScandanssrc/lib/scanCache.tsécritcve-radar:last-scanavec une clé pile.
Couche base de données (PostgreSQL optionnel)¶
Quand DATABASE_URL est défini, les métadonnées de scan persistent dans PostgreSQL via server/db/scanHistory.ts et les piles tenant via server/db/tenants.ts. Les migrations SQL dans server/db/migrations/*.sql s'exécutent automatiquement au démarrage du pool.
Les définitions de schéma type-safe pour la migration ORM progressive vivent dans server/db/schema.ts (Drizzle ORM). server/db/drizzle.ts expose getDb() via le pool pg partagé. La persistance tenant et scan-history (server/db/tenants.ts, server/db/scanHistory.ts) utilise les query builders Drizzle ; les migrations SQL dans server/db/migrations/*.sql s'exécutent toujours au démarrage du pool.
Services de notification¶
Les alertes serveur en mode veille utilisent server/services/notifications/NotificationService.ts. Les adaptateurs de canal (Slack, Discord, Telegram, SMTP, webhook générique) lisent les env documentés dans Configuration. server/services/alerts.ts délègue au service pour compatibilité avec ALERT_WEBHOOK_URL.
Couche de contrat partagée¶
Types et ordre de sévérité dans shared/ (shared/api/vulnerability.ts, shared/constants/severityOrder.ts). src/ et server/ importent via @shared/* ; server/types.ts re-export pour compatibilité. npm run build:server compile shared/ dans dist-server/.
Couche API¶
| Module | Rôle |
|---|---|
server/index.ts |
App Express, montage routeurs |
server/routes/health.ts |
GET /health |
server/routes/meta.ts |
capabilities, sources, openapi.json |
server/routes/scan.ts |
scan, watch, scan/validate |
server/routes/v1.ts |
Montage versionné des mêmes handlers |
server/routes/translateLocale.ts |
POST /translate |
server/handlers/scanHandlers.ts |
Logique scan/watch/validate partagée |
server/openapi/spec.json |
Contrat OpenAPI 3.1 |
Les chemins legacy restent sous /api/* ; les intégrations devraient préférer /api/v1/* (voir Référence API).
Carte frontend¶
| Zone | Chemin |
|---|---|
| Shell | src/components/layout/AppShell.tsx, SubNav.tsx, SetupWizard.tsx |
| Onglets | src/components/tabs/* |
| Cache scan | src/lib/scanCache.ts |
| Client API | src/api/scan.ts, watch.ts, scanPayload.ts |
| i18n | src/i18n/messages/*.ts |
| Hooks | useVulnScan, useWatch, useVulnTranslations, useFontScale |
| Middleware | server/middleware/rateLimit.ts, scanTimeout.ts |
Services backend (flux)¶
| Fournisseur | Module |
|---|---|
| NVD | server/services/nvd.ts |
| OSV | server/services/osv.ts |
| GitHub | server/services/github.ts |
| CISA KEV | server/services/cisa.ts |
| RSS | server/services/rss.ts |
| Traduction | server/services/translate.ts |
Cache et limites¶
Cache mémoire (server/lib/cache.ts) pour XML RSS et chaînes de traduction. Délai NVD depuis server/lib/rateLimit.ts (cadence upstream). Limites de débit des requêtes scan/veille appliquées dans server/middleware/rateLimit.ts (buckets séparés ; validate exempt). Résultats de scan côté client persistés dans localStorage via scanCache.ts. Capacités via GET /api/capabilities reflètent les limites dures des validateurs (50 outils, 20 flux personnalisés).
Suite : Alertes