---
title: Runbook Opérationnel & Recettes d'Hébergement
description: Procédures d'exploitation, recettes de routage edge, contrôles de santé et gestion des incidents pour VertiWiki.
tags: [vertiwiki, operations, runbook, hebergement, cloudflare, vercel, nginx, francais]
---

# Runbook Opérationnel & Recettes d'Hébergement

> For the complete documentation index and agent navigation, see [llms.txt](/llms.txt).

VertiWiki est une SPA 100% statique sans backend. Son exploitation repose sur le paramétrage de serveurs web statiques, de réseaux CDN et de règles de négociation de contenu.

---

## ☁️ Recettes Multi-Cloud

### 1. Vercel (`vercel.json`)
```json
{
  "trailingSlash": true,
  "cleanUrls": false,
  "rewrites": [
    {
      "source": "/docs/:path*/",
      "has": [{ "type": "header", "key": "Accept", "value": ".*text/markdown.*" }],
      "destination": "/docs/:path*/index.md"
    },
    {
      "source": "/docs",
      "destination": "/docs/index.html"
    }
  ]
}
```

### 2. Cloudflare Pages & Workers
```javascript
export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    const accept = request.headers.get("Accept") || "";

    if (accept.includes("text/markdown") && !url.pathname.endsWith(".md")) {
      const targetMd = url.pathname.endsWith("/") ? `${url.pathname}index.md` : `${url.pathname}/index.md`;
      return env.ASSETS.fetch(new Request(new URL(targetMd, url.origin)));
    }

    return env.ASSETS.fetch(request);
  }
};
```

### 3. Nginx (`vertiwiki.conf`)
```nginx
server {
    listen 80;
    server_name docs.example.com;
    root /var/www/vertiwiki;
    index index.html;

    gzip on;
    gzip_types text/plain text/css text/markdown application/javascript application/json image/svg+xml;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location = /index.html {
        add_header Cache-Control "no-cache, must-revalidate";
    }

    location ~* \.(?:svg|png|jpg|woff2|json)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }
}
```

---

## 🩺 Contrôles de Santé (Health Checks)

| Contrôle | Cible | Résultat Attendu | Action en Cas d'Erreur |
| :--- | :--- | :--- | :--- |
| **Moteur HTML** | `GET /index.html` | HTTP 200, Content-Type: `text/html` | Vérifier le déploiement des fichiers et droits. |
| **Configuration** | `GET /config.json` | HTTP 200, JSON valide | Valider la syntaxe JSON avec `jq . config.json`. |
| **Navigation** | `GET /navigation.md` | HTTP 200, Markdown valide | Vérifier la présence du fichier de navigation. |
| **Accueil** | `GET /index.md` | HTTP 200, Markdown valide | Vérifier le paramètre `homePage` dans `config.json`. |
| **Index IA** | `GET /llms.txt` | HTTP 200, Texte brut | Contrôler `llmsTxtUrl` et `robots.txt`. |

---

## 🚨 Dépannage d'Urgence

### Cas A : Écran Blanc au Chargement
1. Ouvrez les Outils de Développement (<kbd>F12</kbd>) et consultez la Console.
2. Si `SyntaxError: Unexpected token in JSON` apparaît :
   - Corrigez la virgule ou les guillemets superflus dans `config.json`.
3. Si `NetworkError: Failed to fetch config.json` :
   - Vérifiez que le site est servi via HTTP et non via le protocole `file:///`.

### Cas B : Erreur 404 sur les Liens de Navigation
1. Vérifiez la casse exacte du nom de fichier demandé (la majorité des serveurs Linux respectent strictement la casse).
