# Architecture, performance et résilience
import { Mermaid } from "../../../../src/components/Mermaid";

> **En bref :**
> - Les données CRISalid sont recopiées dans Django/PostgreSQL : une page publique n’interroge pas forcément Neo4j, ce qui est un actif.
> - Mais le frontend mêle public, collaboratif, analytique et authentifié, et désactive tout cache HTTP.
> - Nuxt 3 est hors support standard depuis le 31 juillet 2026 (date à confirmer) : migration Nuxt 4, ou support de sécurité contractuel, avant lancement.

## Architecture observée

<Mermaid title="Architecture observée dans le snapshot">
{`
flowchart LR
  S[Sources ESR] --> N[CRISalid / Neo4j]
  N --> A[Apollo GraphQL]
  A -->|Imports et événements| D[Django / PostgreSQL]
  D --> O[OpenSearch]
  D --> API[API applicative]
  O --> API
  API --> F[Nuxt / Nitro SSR]
  F --> P[Visiteur public]
  R[Redis] <--> D
  K[Keycloak et collaboration] <--> F
`}
</Mermaid>

| Couche | Technologies | Responsabilité |
| --- | --- | --- |
| Frontend | Nuxt 3.21.8, Vue, TypeScript, Nitro | Pages, SSR, collaboration, instrumentation client |
| Backend | Django, DRF, Celery | API, administration, permissions, synchronisations |
| Données | PostgreSQL (pgvector), OpenSearch, Redis | Modèles Projects, recherche, cache et broker |
| Graphe ESR | Neo4j + Apollo (CRISalid) | Personnes, structures, productions |
| Identité et mesure | Keycloak ; Sentry, Prometheus, Mixpanel | Authentification ; erreurs, métriques, analytics |

L’import CRISalid passe par `services/crisalid/interface.py` et `services/crisalid/tasks.py` (back). Ce read model est réutilisable par un portail découplé. En revanche, rien ne démontre encore que les services optionnels (Keycloak, collaboration, chatbot) peuvent être retirés du chemin critique d’une consultation anonyme.

## Performance et chemin critique

| Élément | Constat | Niveau de preuve | Risque |
| --- | --- | --- | --- |
| Cache HTTP | `cache: false` et `Cache-Control: no-store` sur `/**` (front `nuxt.config.ts:71-79`) | Confirmé | Le CDN ne mutualise aucune réponse publique |
| Nitro | Chaque requête atteint le serveur de rendu | Déduit du précédent | TTFB variable, coût d’origine |
| Redis | Présent, couverture ponctuelle | Confirmé | Taux de hit non démontré |
| Recherche | Permissions, OpenSearch et réordonnancement applicatif | Confirmé | Coût à forte cardinalité à mesurer |
| Charge | Scénario Locust authentifié et de faible volume (back `load-testing/locustfile.py`) | Confirmé | Ne représente ni le public ni les robots |
| Images | Dimensions et `srcset` incomplets sur plusieurs vues | Confirmé | LCP, CLS, transfert inutile |
| Résilience | Service de la dernière version publiée pendant une panne amont | À confirmer | Indisponibilité évitable |

Des latences ont été observées en démonstration, sans origine établie : le read model PostgreSQL et OpenSearch interdisent de les attribuer d’office au graphe. Il faut une trace corrélée (CDN, Nuxt, API, PostgreSQL, OpenSearch, Redis, Apollo, hydratation). Protocole et seuils : [plan de tests de performance](/04-prochaines-etapes/tests/01-plan-tests-performance-web).

## Cycle de vie

Le snapshot déclare `"nuxt": "3.21.8"` (front `package.json:154`). Nuxt 3 est sorti du support standard le 31 juillet 2026 selon le calendrier retenu par l’audit (date à confirmer sur la politique de support Nuxt). Une migration vers Nuxt 4, ou un support de sécurité contractuel, est un prérequis non chiffré de l’option LPI adaptée.

## Architecture recommandée (Projection Saclay)

Statut : **Projection Saclay**. Cette section est une recommandation de l’audit, pas un constat sur Projects.

<Mermaid title="Frontend public découplé">
{`
flowchart LR
  S[Sources ESR et CRISalid] --> X[Service d’export dédié]
  B[Back-office] -->|Validation| X
  X --> R[Projection publique en liste blanche]
  R --> F[Frontend public statique ou ISR]
  F --> C[CDN + WAF]
  C --> U[Public et moteurs]
  K[Keycloak / Apollo / Neo4j / Admin] -. réseau privé .-> X
`}
</Mermaid>

Le public ne dépend que de la projection et du CDN ; Keycloak, Apollo, Neo4j et l’administration restent en réseau privé, et la dernière version publiée reste servie si la source tombe. La [vitrine en marque blanche](/01-cadrage-saclay/02-scenarios/01-partie-1-vitrine-marque-blanche) réalise cette cible : pages générées depuis l’export, servies par un CDN ; les exigences d’exploitation sont dans [exploitation et pilotage](/01-cadrage-saclay/exploitation-pilotage).
