# Exploitation : déployer, superviser, réagir

Le site est statique : exploiter Lucarne, c'est construire au bon moment, servir des fichiers, et mesurer sans données personnelles. Deux chemins de déploiement coexistent, **Vercel** (un projet par instance) et l'**auto-hébergement** (artefact `standalone`, Kubernetes), avec le même kit d'exploitation.

---

## 📑 Sommaire de la section

<FeatureGrid cols={3}>
  <FeatureCard
    icon="☁️"
    title="Déploiement Vercel"
    description="Un projet Vercel par instance, les variables obligatoires, pourquoi les données sont dans le dépôt, et les deux pièges de l'index de recherche."
    href="/exploitation/deploiement-vercel"
  />
  <FeatureCard
    icon="📡"
    title="Observabilité"
    description="Qui mesure quoi : Matomo sans cookie, Prometheus et Grafana, Blackbox, logs JSON. Variables, métriques exposées, alertes, rapport trimestriel."
    href="/exploitation/observabilite"
  />
  <FeatureCard
    icon="🛟"
    title="Runbook"
    description="Déploiement et retour arrière, invalidation de cache, panne amont, astreinte, supervision."
    href="/exploitation/runbook"
  />
</FeatureGrid>

---

## ☁️ Le build Vercel, pas à pas

<Mermaid
  title="scripts/vercel-build.mjs : ce qui se passe à chaque déploiement"
  caption="Sans NEXT_PUBLIC_RESEARCH_INSTANCE, le build s'arrête volontairement : chaque projet Vercel sert une instance."
  chart={`flowchart TB
  START(["git push → webhook Vercel"])
  INSTALL["pnpm install --frozen-lockfile"]
  VAR{"NEXT_PUBLIC_RESEARCH_INSTANCE<br/>définie ?"}
  DATA{"data/public/&lt;instance&gt;/structures.json<br/>dans le dépôt ?"}
  NEXT["next build<br/>23 696 pages pré-rendues"]
  GATHER["pagefind-adapter.mjs, onBuildComplete<br/>pages rassemblées, index construit"]
  PF["Index déclaré parmi les fichiers déployés<br/>/pagefind/&lt;instance&gt;/"]
  NEXT2["Adaptateur Vercel<br/>déploie la liste complète"]
  OK(["Déploiement servi, index sous /pagefind/&lt;instance&gt;"])
  KO1(["Échec : « poser la variable dans ses réglages »"])
  KO2(["Échec : « régénérer en local et commiter »"])
  START --> INSTALL --> VAR
  VAR -->|non| KO1
  VAR -->|oui| DATA
  DATA -->|non| KO2
  DATA -->|oui| NEXT --> GATHER --> PF --> NEXT2 --> OK`}
/>

Pourquoi un adaptateur intercalé : sur Vercel, Next remet la liste des fichiers à déployer à la fin de `next build`, et l'index Pagefind ne peut se construire qu'à partir du HTML pré-rendu. Le seul moment où les deux conditions sont réunies est `onBuildComplete`. Le détail des trois pièges rencontrés est dans [Déploiement Vercel](/exploitation/deploiement-vercel).

---

## 📡 Qui mesure quoi

| Besoin                                                          | Outil                                                     | Données personnelles   |
| --------------------------------------------------------------- | --------------------------------------------------------- | ---------------------- |
| Visites, pages vues, provenance, termes de recherche            | Matomo auto-hébergé, sans cookie                          | Aucune, exemption CNIL |
| Recherches sans résultat, sorties vers HAL, ORCID, DOI          | Prometheus, compteurs agrégés                             | Aucune                 |
| Fiches publiées, fraîcheur, rejets de contrat, santé de l'amont | Prometheus                                                | Aucune                 |
| Disponibilité vue de l'extérieur                                | Blackbox Exporter                                         | Aucune                 |
| Tableaux et alertes                                             | Grafana, Alertmanager : 3 tableaux, 10 alertes versionnés | Aucune                 |

`/api/metrics` est fermé par jeton, contrairement au `/v1/metrics` public relevé par l'audit de l'existant. Le détail est dans [Observabilité](/exploitation/observabilite) ; le POC comparatif d'une pile OpenObserve est dans la section [Analytics](/analytics).
