§5 — Vue des blocs de construction¶
Décomposition structurelle niveau C4-C2 (containers) avec renvois vers C4-C3 (composants) sur les 3 sous-pages frontend / backend / persistence.
5.1 Niveau container (C4-C2)¶
Vue C4 niveau 2 (exportée depuis Structurizr) :
La même topologie en Mermaid inline, orientée flux :
graph TB
subgraph browser [Browser]
SPA[SPA Vue 3
Vite + TS + Tailwind
Pinia + Leaflet + D3]
end
subgraph vps [VPS Hetzner — Coolify]
Traefik[Traefik
reverse proxy + TLS]
Nginx[nginx
static SPA + 6 headers]
API[Fastify API
+ cron ingestion embarqué]
DB[(PostgreSQL 16)]
end
subgraph external [External]
LINDAS[LINDAS SPARQL
OFEV/BAFU]
OSM[OpenStreetMap
tiles]
end
SPA -->|HTTPS REST JSON| Traefik
Traefik --> Nginx
Traefik --> API
Nginx -->|serve index.html + assets| SPA
API <-->|Prisma| DB
API -->|SPARQL HTTP| LINDAS
SPA -->|HTTPS tiles| OSM
Cinq containers effectifs côté VPS (Traefik + nginx + api + postgres + un 4e nginx pour storybook.alpimonitor.fr non représenté). Deux sources externes sans relation entre elles.
| Container | Rôle | Stack | Communication |
|---|---|---|---|
| SPA (web) | UI publique lecture seule | Vue 3 + Vite + TS + Tailwind + Pinia + Leaflet + D3 | REST JSON → API, tiles HTTPS → OSM |
| API | Endpoints REST + cron ingestion | Node 20 + Fastify 5 + Prisma 5 + Zod + Pino + node-cron | SQL → DB, SPARQL HTTP → LINDAS |
| PostgreSQL | Persistance stations, mesures, ingestion runs | PostgreSQL 16 (container Docker Coolify) | SQL via Prisma |
| Traefik | TLS, routing, Let's Encrypt auto | Traefik géré par Coolify | — |
| nginx (SPA static) | Serveur statique + 6 headers sécurité | nginx:1.27-alpine | — |
Le 5e container storybook-nginx suit le même pattern que nginx SPA, servi sur storybook.alpimonitor.fr (cf. ADR-009).
5.2 Découpage des responsabilités¶
Les trois sous-pages détaillent chaque container au niveau C4-C3 (composants internes) :
- Frontend (Vue 3 + Pinia) — couches
atoms/molecules/organisms/templates/pages, façadescomposables/stations/,lib/domain-scoped, règle enforced « aucun consumer prod hors façades ». - Backend (Fastify + Prisma) — routes, services, plugin ingestion LINDAS avec cron interne, plugin observabilité.
- Persistence (PostgreSQL) — schéma Prisma commenté, migrations additives,
IngestionRuncomme table de trace.
Les types et schémas Zod partagés entre frontend et backend vivent dans packages/shared/src/ :
types/—StationDTO,MeasurementSeries,IngestionLastRun, etc.schemas/— schémas Zod consommés par l'API (validation input/output) et ré-exportés côté web pour un typage runtime cohérent.
Cette couche garantit qu'une modification de contrat propage une erreur TypeScript dans les deux apps. Pas de duplication de types, pas de drift silencieux.