---
title: "Fichiers, dossiers et adresses"
description: "Les fichiers et dossiers d'Éclair expliqués : data/, cache/, media/, eclair-config.php, .htaccess, Nginx, droits, sauvegarde et adresses générées."
url: "https://eclair.academy/documentation/fichiers"
lang: "fr"
author: "Thierry Gustin"
published: "2026-11-02"
updated: "2026-11-02"
---

# Fichiers, dossiers et adresses

> **L’essentiel** — Éclair tient dans un dossier. index.php sert les pages, app/ et assets/ contiennent le code, data/ garde contenus, réglages et comptes, cache/ les pages générées et media/ les images. Seuls data/ et media/ sont à sauvegarder. Le .htaccess protège les dossiers internes, et Éclair génère seul sitemap.xml, robots.txt, llms.txt, les flux et les versions Markdown.

Éclair n'a pas de base de données : tout ce qui fait ton site vit dans des fichiers et dossiers que tu peux voir par FTP. Cette référence décrit l'arborescence, le rôle de chaque fichier de `data/`, les réglages d'`eclair-config.php`, les règles du `.htaccess` et de Nginx, les droits à donner, ce qu'il faut sauvegarder et toutes les adresses que le site génère seul.

## L'arborescence du dossier eclair

C'est le contenu de ce dossier que tu envoies dans le dossier public de ton hébergement (`public_html`, `www`…).

```text
eclair/
├── index.php                  contrôleur frontal : sert le cache sans charger l'application
├── .htaccess                  réécriture, protections, compression, cache navigateur
├── eclair-config.exemple.php  modèle des réglages avancés facultatifs
├── app/                       le code d'Éclair (jamais accessible depuis le web)
│   ├── bootstrap.php          démarrage : version de PHP, eclair-config.php, chargement
│   ├── manifest.php           empreintes d'origine pour le contrôle d'intégrité
│   ├── lib/                   classes : Content, Blocks, Seo, Analyzer, Media, Auth, Mcp…
│   ├── admin/views/           écrans de l'administration (.php.gz dans l'archive)
│   ├── install/               assistant d'installation et écran « Installation verrouillée »
│   ├── lang/                  traductions de l'administration (6 langues, JSON compressé)
│   └── theme/                 gabarits du site public, theme.css, themes/, directions.css
├── assets/
│   ├── admin/                 CSS et JavaScript de l'administration
│   └── site/site.js           le seul script du site public (1,2 Ko compressé)
├── data/                      contenus, réglages, comptes : jamais public
├── cache/                     pages générées : jamais public
└── media/                     images envoyées, icônes du site, police de titre
```

`app/` et `assets/` contiennent le code : une mise à jour les remplace. Tes données sont dans `data/` et `media/`, que les mises à jour ne touchent jamais. L'archive officielle contient aussi, à côté du dossier `eclair`, les fichiers `LISEZ-MOI.txt`, `LICENSE.txt` et `THIRD-PARTY-NOTICES.txt` : inutile de les envoyer sur ton hébergement.

## Comment une page est-elle servie ?

![Cycle d'une requête : page servie depuis le cache statique ou générée par l'application](https://eclair.academy/media/2026/11/eclair-academy-architecture-fr.png)
*Le chemin rapide du cache statique*

1. Toute demande de page arrive sur `index.php` ; les images, CSS et scripts sont servis directement par le serveur. Pour une lecture (`GET` ou `HEAD`), `index.php` lit `cache/runtime.php` : cache actif, date d'expiration, domaine et HTTPS exigés.
2. Si la page existe dans `cache/pages/`, elle est envoyée telle quelle, avec son ETag ; un navigateur qui l'a déjà reçoit une réponse `304 Not Modified`.
3. Sinon, `app/bootstrap.php` démarre l'application : il vérifie la version de PHP, lit `eclair-config.php` s'il existe, puis aiguille vers l'installation, l'administration, le formulaire, le connecteur MCP ou le site. La page générée est mise en cache pour les visites suivantes.

Le détail du code est dans [L'architecture d'Éclair](https://eclair.academy/parcours/expert/architecture).

## Que contient le dossier data ?

Chaque fichier de `data/` est un fichier `.php` qui commence par la ligne `<?php exit; ?>`, suivie de données JSON. Même si un serveur ignorait les `.htaccess`, l'ouvrir dans un navigateur n'afficherait rien. Les écritures sont atomiques (fichier temporaire, puis renommage) et les fichiers sont privés.

| Fichier ou dossier | Contenu | Dans la sauvegarde ZIP |
| --- | --- | --- |
| `site.php` | Tous les réglages des onglets de Réglages | Oui |
| `users.php` | Comptes, empreintes des mots de passe, double authentification | Oui |
| `keys.php` | Clés secrètes créées à l'installation (secret du site, clé IndexNow) | Oui |
| `vault.php` | Clés d'API de l'assistant IA, chiffrées | Non |
| `index.php` | Résumé de tous les contenus, pour lister et trouver une adresse vite | Oui |
| `content/` | Un fichier par page, article ou produit | Oui |
| `revisions/` | Les 20 dernières versions de chaque contenu | Oui |
| `search.php` | Texte des contenus pour la recherche du site | Oui |
| `media.php` | Registre de la médiathèque : fichiers, dimensions, textes alternatifs | Oui |
| `categories.php`, `menus.php`, `redirects.php` | Catégories, menus et redirections | Oui |
| `custom-css.php` | Ton CSS personnalisé | Oui |
| `inbox.php` et `messages/` | Boîte de réception du formulaire, 500 messages au plus | Oui |
| `indexnow.php` | Date et résultat du dernier envoi IndexNow | Oui |
| `logs/` | Journal de sécurité et erreurs techniques, 1 Mo au plus chacun | Oui |
| `sessions/` | Sessions ouvertes, sous un nom haché | Non |
| `limits/` | Compteurs anti-bruteforce et anti-spam | Non |
| `ai/` | Dépenses, conversations (30 par personne), propositions, annulations, connexions MCP | Non |
| `install-window.php` | Début de la fenêtre d'installation de 2 heures, supprimé à la fin de l'installation | Sans objet |
| `reset.php` | Secours « mot de passe oublié », créé par toi, supprimé automatiquement | Non |

> **Ne modifie pas ces fichiers à la main** — Un JSON abîmé rend la donnée illisible. Dans `data/`, le seul fichier prévu pour être créé par FTP est `reset.php` : sa marche à suivre est dans [Dépannage](https://eclair.academy/documentation/depannage).

## Les dossiers cache et media

### cache/

| Élément | Rôle |
| --- | --- |
| `runtime.php` | Réglages du chemin rapide : cache actif, expiration au prochain article programmé, domaine et HTTPS exigés |
| `pages/` | Une page générée par adresse, nommée d'après l'empreinte md5 de son chemin : une ligne d'en-têtes et d'ETag, puis le HTML |
| `backup-….zip` | Sauvegarde en cours de téléchargement, supprimée ensuite ; si le téléchargement a été interrompu, elle est effacée lors d'un vidage du cache, une heure plus tard au moins |

Le cache se vide tout seul à chaque modification, et à l'heure prévue pour un article programmé. Pour le vider à la main : **Réglages › Avancé › Vider le cache**.

### media/

| Élément | Rôle |
| --- | --- |
| `2026/11/…` | Images envoyées, rangées par année et par mois |
| `photo.jpg`, `.png`, `.webp` ou `.gif` | L'image ré-encodée, 2 000 px de large au plus, sans données EXIF ni GPS (avec l'extension GD) |
| `photo-480.webp` à `photo-1600.webp` | Déclinaisons WebP en 480, 800, 1200 et 1600 px (seulement celles plus petites que l'original), plus une version WebP à la taille de l'image |
| `photo-og.jpg` | Image de partage en 1200 × 630, créée à la première utilisation |
| `site/icon-32.png`, `icon-180.png`, `icon-192.png`, `icon-512.png` | Icônes du site : favicon et écran d'accueil des mobiles |
| `fonts/` | Police de titre de ta direction artistique (`.woff2`), téléchargée une fois |

Le fichier `media/.htaccess` n'autorise que des images : pas de script, de page HTML, de SVG ni de liste de fichiers, avec une politique de sécurité qui interdit tout contenu actif. Les envois sont détaillés dans [Images et médiathèque](https://eclair.academy/parcours/debutant/images-mediatheque).

## Que mettre dans eclair-config.php ?

Ce fichier facultatif se place à côté d'`index.php`. Copie `eclair-config.exemple.php` sous le nom `eclair-config.php`, puis décommente ce dont tu as besoin. Il est lu au démarrage de l'application, avant tout le reste, et le contrôle d'intégrité ne le signale pas comme fichier inconnu.

```php
<?php
defined('ECLAIR') || exit;

// Détail des erreurs, le temps de résoudre un problème :
// define('ECLAIR_DEBUG', true);

// Données hors du dossier public (déplace d'abord le dossier data) :
// define('ECLAIR_DATA', '/home/moncompte/eclair-data');

// Protection renforcée des clés d'API, à définir avant de les enregistrer :
// define('ECLAIR_SECRET', 'une-longue-phrase-secrète');
```

| Constante | Effet | Précaution |
| --- | --- | --- |
| `ECLAIR_DEBUG` | Affiche le détail des erreurs | Coupe aussi le cache statique : supprime la ligne une fois le problème réglé |
| `ECLAIR_DATA` | Range les données à un autre emplacement (chemin absolu) | Déplace d'abord `data/`, et pense à sauvegarder ce nouvel emplacement |
| `ECLAIR_SECRET` | Ajoute une phrase secrète au chiffrement des clés d'API | À définir avant d'enregistrer tes clés ; ajoutée ou changée ensuite, elle oblige à les coller de nouveau |

Le code reconnaît aussi deux constantes techniques absentes du guide officiel : `ECLAIR_AI_ENDPOINTS` (adresse de remplacement d'un service d'IA, pour une passerelle ou des tests) et `ECLAIR_FONTS_URL` (source des polices, Fontsource via `cdn.jsdelivr.net` par défaut). Ne les utilise que si tu sais pourquoi. `ECLAIR_VERSION` et `ECLAIR_ROOT` sont fixées par `index.php`.

## Les règles du .htaccess expliquées

Le `.htaccess` d'Éclair fonctionne à la racine d'un domaine comme dans un sous-dossier. Il n'utilise que des directives autorisées sur les hébergements mutualisés : pas d'`Options`, pas de `php_flag`. Voici sa partie réécriture :

```apache
RewriteEngine On
# RewriteBase /
RewriteCond %{HTTP:Authorization} .
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteRule ^(app|data|cache)(/|$) - [R=404,L]
RewriteRule (^|/)\.(?!well-known/) - [R=404,L]
RewriteRule ^(?!index\.php$).*\.(php\d?|phtml|phar|inc)$ - [R=404,NC,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L,QSA]
```

1. `RewriteBase /` reste en commentaire : décommente-la seulement si ton hébergeur l'exige, ce qui est rare.
2. Les deux lignes `Authorization` transmettent à PHP l'en-tête d'autorisation que certains hébergements retirent. Le connecteur MCP en a besoin.
3. `app/`, `data/` et `cache/` répondent 404 depuis le web.
4. Les fichiers cachés (`.git`, `.env`…) répondent 404, sauf le dossier `.well-known`.
5. Aucun script PHP ne s'exécute en dehors d'`index.php`.
6. Tout ce qui n'est pas un fichier existant passe par `index.php`, même un dossier : aucune liste de fichiers n'est jamais affichée.

Le reste du fichier active la compression Brotli ou Gzip des pages HTML, des feuilles CSS, du JavaScript, des données JSON et XML, des flux RSS, des images SVG et du Markdown, un cache navigateur d'un an pour les images, les CSS, les scripts et les polices (`Cache-Control: public, max-age=31536000, immutable`), et déclare les types WebP, AVIF et WOFF2. Les dossiers `app/`, `data/` et `cache/` ont en plus leur propre `.htaccess` qui refuse tout accès : la protection est double.

> **Les fichiers cachés ne s'envoient pas tout seuls** — Les noms qui commencent par un point sont masqués par défaut dans beaucoup de logiciels FTP et de gestionnaires de fichiers. Active l'affichage des fichiers cachés avant l'envoi, sinon toutes les pages sauf l'accueil répondent 404. La syntaxe complète est décrite dans la [documentation Apache sur les fichiers .htaccess](https://httpd.apache.org/docs/current/howto/htaccess.html).

## La configuration Nginx

Nginx ignore les `.htaccess` : reproduis ces règles dans le bloc `server` de ton site. C'est la configuration donnée par le guide officiel.

```nginx
location ~ ^/(app|data|cache)(/|$) { return 404; }
location ~ /\.(?!well-known/) { return 404; }
location ^~ /media/ {
    location ~* \.(php\d?|phtml|phar|s?html?|svgz?|xml|js)$ { return 404; }
    add_header X-Content-Type-Options nosniff;
    expires 1y;
}
location ~* \.(webp|avif|jpe?g|png|gif|ico|css|js|woff2)$ { expires 1y; add_header Cache-Control "public, immutable"; }
location / { try_files $uri /index.php$is_args$args; }
location = /index.php {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    fastcgi_pass unix:/run/php/php-fpm.sock;
}
location ~ \.php$ { return 404; }
```

- Les deux premières règles ferment les dossiers internes et les fichiers cachés, sauf `.well-known`.
- Le bloc `/media/` refuse scripts, pages HTML, SVG et XML, et met les fichiers en cache un an.
- `try_files` envoie vers `index.php` tout ce qui n'est pas un fichier existant.
- Seul `index.php` est confié à PHP-FPM : adapte `fastcgi_pass` au socket de ton serveur.
- Pour que l'assistant IA affiche ses réponses au fil de l'eau, ajoute `fastcgi_buffering off;` dans le bloc PHP.

HTTPS, proxy et CDN sont traités dans [Nginx, VPS, proxy et CDN](https://eclair.academy/parcours/expert/nginx-vps).

## Quels droits donner aux fichiers et dossiers ?

- PHP doit pouvoir écrire dans `data/`, `cache/` et `media/`. L'assistant d'installation vérifie chacun (« Dossier « data » accessible en écriture ») et, en cas d'échec, conseille de donner les droits d'écriture (755) par FTP.
- Éclair crée ensuite ses fichiers de données en 0600 (lisibles par le seul compte qui exécute PHP), ses sous-dossiers de `data/` et de `cache/` en 0700, et ceux de `media/` en 0755.
- Évite les droits 777, qui laissent n'importe quel compte du serveur écrire. Si 755 ne suffit pas, demande à ton hébergeur sous quel compte s'exécute PHP.

## Quels fichiers et dossiers sauvegarder ?

| À sauvegarder | Pourquoi | Comment |
| --- | --- | --- |
| `data/` | Contenus, réglages, comptes, CSS personnalisé | Sécurité › **Télécharger une sauvegarde**, ou FTP |
| `media/` | Images, icônes, police de titre | Même sauvegarde ZIP, ou FTP |
| `eclair-config.php` | Si tu en as créé un | FTP |
| Gabarits modifiés dans `app/theme/` | Une mise à jour les remplace | FTP, avant chaque mise à jour |
| Dossier désigné par `ECLAIR_DATA` | Si tu as déplacé tes données | FTP |

La sauvegarde ZIP ne contient ni les clés d'API, ni les conversations et connexions MCP, ni les sessions. Après une restauration sur un autre serveur, colle de nouveau tes clés d'API et reconnecte Claude ou ChatGPT. Pour restaurer, remplace `data/` et `media/` par ceux de la sauvegarde (par FTP), puis vide le cache depuis l'administration.

![Mise à jour : on remplace app et assets, on garde data et media](https://eclair.academy/media/2026/11/eclair-academy-update-fr.png)
*Ce qu'une mise à jour remplace et ce qu'elle garde*

La procédure de mise à jour complète est dans [Sécurité avancée et maintenance](https://eclair.academy/parcours/expert/securite-avancee).

## Les adresses générées par Éclair

| Adresse | Contenu | Quand elle existe |
| --- | --- | --- |
| `/sitemap.xml` | Plan du site avec images et versions linguistiques | Toujours ; vide si le site est masqué aux moteurs |
| `/robots.txt` | Règles des robots, dont 30 robots d'IA, et lien du sitemap | Toujours |
| `/llms.txt` | Carte du site pour les IA | Option **Publier /llms.txt** |
| `/llms-full.txt` | Tout le contenu en Markdown | Options `/llms.txt` et `/llms-full.txt` |
| `/feed.xml` | Flux RSS des 20 derniers articles, texte complet | Blog activé |
| `/products.xml` | Flux produits pour Google Merchant Center | Boutique ouverte |
| `/ma-page.md`, `/index.md` | Version Markdown d'une page, en `noindex` avec son URL canonique | Option **Version Markdown de chaque page**, sauf pages en `noindex` |
| `/favicon.ico` | Icône de 32 px | Dès que l'icône du site existe |
| `/recherche?q=…` | Résultats de la recherche, en `noindex` | Option **Recherche sur le site** |
| `/<clé>.txt` | Preuve de propriété IndexNow | IndexNow activé |
| `/_eclair/mcp` | Connecteur MCP | **Autoriser les connexions MCP** |
| `/_eclair/oauth/authorize`, `/token`, `/register` | Autorisation OAuth du connecteur | Même condition |
| `/.well-known/oauth-protected-resource`, `/.well-known/oauth-authorization-server`, `/.well-known/openid-configuration` | Découverte OAuth | Même condition |
| `/_eclair/contact` | Réception du formulaire de contact | Toujours |
| `/_eclair/edit/<id>` | Bouton **✏️ Modifier** du site, vers l'éditeur | Personnes connectées |
| `/__eclair/ping` | Test de la réécriture et vérification de l'adresse du site | Toujours |

### Les adresses des contenus

| Contenu | Adresse sur un site en français |
| --- | --- |
| Page | `/ma-page`, ou `/parent/enfant` pour une sous-page (4 niveaux au plus) |
| Accueil | `/` ; l'adresse propre de la page d'accueil redirige vers `/` |
| Article | `/blog/mon-article` |
| Pages suivantes du blog | `/blog/page/2` |
| Catégorie d'articles | `/blog/ma-categorie` |
| Page auteur | `/blog/auteur/prenom-nom` |
| Catalogue | `/boutique`, puis `/boutique/page/2` |
| Catégorie de produits, produit | `/boutique/ma-categorie`, `/boutique/mon-produit` |
| Administration | L'adresse choisie à l'installation |

Les mots des adresses suivent la langue du site : `page` en français et en anglais, `pagina` en espagnol, en italien et en portugais, `seite` en allemand ; `auteur`, `autor`, `author` ou `autore` ; `recherche`, `buscar`, `search`, `suche`, `cerca` ou `pesquisa` ; `boutique`, `tienda`, `shop`, `negozio` ou `loja`.

Une seule adresse par contenu : Éclair redirige en 301 les variantes en majuscules, avec barre oblique finale, doubles barres ou `index.php`, ainsi que `http` vers `https` quand HTTPS est forcé, et `www` ou sans `www` une fois l'adresse officielle vérifiée.

Certains mots sont réservés et ne peuvent pas servir d'adresse de page : `app`, `data`, `cache`, `assets`, `media`, `index`, `admin`, `_eclair`, `__eclair`, `sitemap`, `robots`, `feed`, `llms`, `llms-full`, `favicon`, `wp-admin`, `wp-login`, plus l'adresse de ton administration, celle du blog, le mot de la recherche et l'adresse de la boutique une fois configurée. Le SEO de ces adresses est détaillé dans [Le SEO avec Éclair](https://eclair.academy/parcours/intermediaire/seo).

## Questions fréquentes sur les fichiers

### Puis-je supprimer le dossier cache ?

Ne supprime pas le dossier lui-même : il contient sa propre protection `.htaccess`. Utilise **Réglages › Avancé › Vider le cache**, qui efface seulement les pages générées ; elles se recréent à la visite suivante.

### Où sont enregistrés mes articles ?

Dans `data/content/`, un fichier par contenu, avec leurs 20 dernières versions dans `data/revisions/`. Les images sont dans `media/`, rangées par année et par mois.

### Peut-on placer le dossier data hors du dossier public ?

Oui, si ton hébergeur le permet : déplace le dossier `data`, puis indique son chemin absolu avec `ECLAIR_DATA` dans `eclair-config.php`. Ajoute ce nouvel emplacement à tes sauvegardes.
