Archivos, carpetas y direcciones

Índice
  1. La estructura de la carpeta eclair
  2. ¿Cómo se sirve una página?
  3. ¿Qué contiene la carpeta data?
  4. Las carpetas cache y media
  5. cache/
  6. media/
  7. ¿Qué poner en eclair-config.php?
  8. Las reglas del .htaccess explicadas
  9. La configuración de Nginx
  10. ¿Qué permisos dar a los archivos y carpetas?
  11. ¿Qué archivos y carpetas incluir en la copia de seguridad?
  12. Las direcciones que genera Éclair
  13. Las direcciones de los contenidos
  14. Preguntas frecuentes sobre los archivos

En Éclair, todo lo que forma tu sitio vive en archivos y carpetas que puedes ver por FTP: no hay base de datos. Esta referencia describe la estructura de carpetas, la función de cada archivo de data/, los ajustes de eclair-config.php, las reglas del .htaccess y de Nginx, los permisos necesarios, qué incluir en las copias de seguridad y todas las direcciones que el sitio genera solo.

La estructura de la carpeta eclair

Es el contenido de esta carpeta lo que subes a la carpeta pública de tu hosting (public_html, www…).

eclair/
├── index.php                  controlador frontal: sirve la caché sin cargar la aplicación
├── .htaccess                  reescritura, protecciones, compresión, caché del navegador
├── eclair-config.exemple.php  plantilla de los ajustes avanzados opcionales
├── app/                       el código de Éclair (nunca accesible desde la web)
│   ├── bootstrap.php          arranque: versión de PHP, eclair-config.php, carga
│   ├── manifest.php           huellas originales para el control de integridad
│   ├── lib/                   clases: Content, Blocks, Seo, Analyzer, Media, Auth, Mcp…
│   ├── admin/views/           pantallas de la administración (.php.gz en el archivo ZIP)
│   ├── install/               asistente de instalación y pantalla «Instalación bloqueada»
│   ├── lang/                  traducciones de la administración (6 idiomas, JSON comprimido)
│   └── theme/                 plantillas del sitio público, theme.css, themes/, directions.css
├── assets/
│   ├── admin/                 CSS y JavaScript de la administración
│   └── site/site.js           el único script del sitio público (1,2 KB comprimido)
├── data/                      contenidos, ajustes, cuentas: nunca público
├── cache/                     páginas generadas: nunca público
└── media/                     imágenes subidas, iconos del sitio, fuente de los títulos

app/ y assets/ contienen el código: una actualización los sustituye. Tus datos están en data/ y media/, que las actualizaciones no tocan nunca. El archivo ZIP oficial contiene también, junto a la carpeta eclair, los archivos LISEZ-MOI.txt, LICENSE.txt y THIRD-PARTY-NOTICES.txt: no hace falta subirlos a tu hosting.

¿Cómo se sirve una página?

Ciclo de una petición: página servida desde la caché estática o generada por la aplicación
El camino rápido de la caché estática
  1. Toda petición de página llega a index.php; las imágenes, los CSS y los scripts los sirve directamente el servidor. Para una lectura (GET o HEAD), index.php lee cache/runtime.php: caché activa, fecha de caducidad, dominio y HTTPS exigidos.
  2. Si la página existe en cache/pages/, se envía tal cual, con su ETag; un navegador que ya la tiene recibe una respuesta 304 Not Modified.
  3. Si no, app/bootstrap.php arranca la aplicación: comprueba la versión de PHP, lee eclair-config.php si existe y después dirige la petición a la instalación, la administración, el formulario, el conector MCP o el sitio. La página generada se guarda en caché para las visitas siguientes.

El detalle del código está en La arquitectura de Éclair.

¿Qué contiene la carpeta data?

Cada archivo de data/ es un archivo .php que empieza por la línea <?php exit; ?>, seguida de datos JSON. Aunque un servidor ignorara los .htaccess, abrirlo en un navegador no mostraría nada. Las escrituras son atómicas (archivo temporal y luego cambio de nombre) y los archivos son privados.

Archivo o carpetaContenidoEn la copia de seguridad ZIP
site.phpTodos los ajustes de las pestañas de AjustesSí
users.phpCuentas, huellas de las contraseñas, verificación en dos pasosSí
keys.phpClaves secretas creadas durante la instalación (secreto del sitio, clave de IndexNow)Sí
vault.phpClaves de API del asistente IA, cifradasNo
index.phpResumen de todos los contenidos, para listarlos y encontrar rápido una direcciónSí
content/Un archivo por página, artículo o productoSí
revisions/Las 20 últimas versiones de cada contenidoSí
search.phpTexto de los contenidos para la búsqueda del sitioSí
media.phpRegistro de la biblioteca de medios: archivos, dimensiones, textos alternativosSí
categories.php, menus.php, redirects.phpCategorías, menús y redireccionesSí
custom-css.phpTu CSS personalizadoSí
inbox.php y messages/Bandeja de entrada del formulario, 500 mensajes como máximoSí
indexnow.phpFecha y resultado del último envío a IndexNowSí
logs/Registro de seguridad y errores técnicos, 1 MB como máximo cada unoSí
sessions/Sesiones abiertas, con un nombre en forma de hashNo
limits/Contadores contra la fuerza bruta y el spamNo
ai/Gastos, conversaciones (30 por persona), propuestas, anulaciones, conexiones MCPNo
install-window.phpInicio de la ventana de instalación de 2 horas; se borra al terminar la instalaciónNo aplica
reset.phpRescate de «contraseña olvidada», lo creas tú y se borra automáticamenteNo

Las carpetas cache y media

cache/

ElementoFunción
runtime.phpAjustes del camino rápido: caché activa, caducidad en el próximo artículo programado, dominio y HTTPS exigidos
pages/Una página generada por dirección, con el nombre de la huella md5 de su ruta: una línea de cabeceras y de ETag, y después el HTML
backup-….zipCopia de seguridad en plena descarga, que se borra después; si la descarga se interrumpió, se elimina al vaciar la caché, al menos una hora más tarde

La caché se vacía sola con cada cambio, y a la hora prevista para un artículo programado. Para vaciarla a mano: Ajustes › Avanzado › Vaciar la caché.

media/

ElementoFunción
2026/11/…Imágenes subidas, ordenadas por año y por mes
photo.jpg, .png, .webp o .gifLa imagen recodificada, de 2000 px de ancho como máximo, sin datos EXIF ni GPS (con la extensión GD)
photo-480.webp a photo-1600.webpVariantes WebP de 480, 800, 1200 y 1600 px (solo las más pequeñas que el original), más una versión WebP del tamaño de la imagen
photo-og.jpgImagen para compartir de 1200 × 630, creada la primera vez que se usa
site/icon-32.png, icon-180.png, icon-192.png, icon-512.pngIconos del sitio: favicon y pantalla de inicio de los móviles
fonts/Fuente de los títulos de tu dirección de arte (.woff2), descargada una sola vez

El archivo media/.htaccess solo autoriza imágenes: ni scripts, ni páginas HTML, ni SVG, ni listados de archivos, con una política de seguridad que prohíbe cualquier contenido activo. Las subidas se explican en Imágenes y biblioteca de medios de Éclair.

¿Qué poner en eclair-config.php?

Este archivo opcional se coloca junto a index.php. Copia eclair-config.exemple.php con el nombre eclair-config.php y quita el comentario de lo que necesites. Se lee al arrancar la aplicación, antes que todo lo demás, y el control de integridad no lo señala como archivo desconocido.

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

// Detalle de los errores, mientras resuelves un problema:
// define('ECLAIR_DEBUG', true);

// Datos fuera de la carpeta pública (mueve antes la carpeta data):
// define('ECLAIR_DATA', '/home/micuenta/eclair-data');

// Protección reforzada de las claves de API, que se define antes de guardarlas:
// define('ECLAIR_SECRET', 'una-frase-secreta-larga');
ConstanteEfectoPrecaución
ECLAIR_DEBUGMuestra el detalle de los erroresTambién desactiva la caché estática: borra la línea cuando el problema esté resuelto
ECLAIR_DATAGuarda los datos en otra ubicación (ruta absoluta)Mueve antes data/, y acuérdate de incluir la nueva ubicación en tus copias de seguridad
ECLAIR_SECRETAñade una frase secreta al cifrado de las claves de APIDefínela antes de guardar tus claves; si la añades o la cambias después, tendrás que volver a pegarlas

El código reconoce también dos constantes técnicas que no aparecen en la guía oficial: ECLAIR_AI_ENDPOINTS (dirección alternativa de un servicio de IA, para una pasarela o para pruebas) y ECLAIR_FONTS_URL (origen de las fuentes, por defecto Fontsource a través de cdn.jsdelivr.net). Úsalas solo si sabes por qué. ECLAIR_VERSION y ECLAIR_ROOT las fija index.php.

Las reglas del .htaccess explicadas

El .htaccess de Éclair funciona tanto en la raíz de un dominio como en una subcarpeta. Solo usa directivas permitidas en los hostings compartidos: nada de Options ni de php_flag. Esta es su parte de reescritura:

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 / sigue comentada: quítale el comentario solo si tu proveedor lo exige, algo poco habitual.
  2. Las dos líneas Authorization transmiten a PHP la cabecera de autorización que algunos hostings eliminan. El conector MCP la necesita.
  3. app/, data/ y cache/ responden 404 desde la web.
  4. Los archivos ocultos (.git, .env…) responden 404, salvo la carpeta .well-known.
  5. Ningún script PHP se ejecuta fuera de index.php.
  6. Todo lo que no sea un archivo existente pasa por index.php, incluso una carpeta: nunca se muestra un listado de archivos.

El resto del archivo activa la compresión Brotli o Gzip de las páginas HTML, las hojas CSS, el JavaScript, los datos JSON y XML, los feeds RSS, las imágenes SVG y el Markdown, una caché del navegador de un año para las imágenes, los CSS, los scripts y las fuentes (Cache-Control: public, max-age=31536000, immutable), y declara los tipos WebP, AVIF y WOFF2. Las carpetas app/, data/ y cache/ tienen además su propio .htaccess, que deniega cualquier acceso: la protección es doble.

La configuración de Nginx

Nginx ignora los .htaccess: reproduce estas reglas en el bloque server de tu sitio. Es la configuración que da la guía oficial.

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; }

HTTPS, proxy y CDN se tratan en Nginx, VPS, proxy y CDN.

¿Qué permisos dar a los archivos y carpetas?

¿Qué archivos y carpetas incluir en la copia de seguridad?

Qué guardarPor quéCómo
data/Contenidos, ajustes, cuentas, CSS personalizadoSeguridad › Descargar una copia de seguridad, o FTP
media/Imágenes, iconos, fuente de los títulosLa misma copia ZIP, o FTP
eclair-config.phpSi has creado unoFTP
Plantillas modificadas en app/theme/Una actualización las sustituyeFTP, antes de cada actualización
Carpeta indicada en ECLAIR_DATASi has movido tus datosFTP

La copia de seguridad ZIP no contiene ni las claves de API, ni las conversaciones y conexiones MCP, ni las sesiones. Después de restaurarla en otro servidor, vuelve a pegar tus claves de API y conecta de nuevo Claude o ChatGPT. Para restaurar, sustituye data/ y media/ por los de la copia (por FTP) y vacía la caché desde la administración.

Actualización: se sustituyen app y assets, se conservan data y media
Lo que una actualización sustituye y lo que conserva

El procedimiento de actualización completo está en Seguridad avanzada y mantenimiento.

Las direcciones que genera Éclair

DirecciónContenidoCuándo existe
/sitemap.xmlMapa del sitio con imágenes y versiones de idiomaSiempre; vacío si el sitio está oculto a los buscadores
/robots.txtReglas para los robots, incluidos 30 robots de IA, y enlace al sitemapSiempre
/llms.txtMapa del sitio para las IAOpción Publicar /llms.txt
/llms-full.txtTodo el contenido en MarkdownOpciones /llms.txt y /llms-full.txt
/feed.xmlFeed RSS de los 20 últimos artículos, con el texto completoBlog activado
/products.xmlFeed de productos para Google Merchant CenterTienda abierta
/mi-pagina.md, /index.mdVersión Markdown de una página, en noindex con su URL canónicaOpción Versión Markdown de cada página, salvo en las páginas en noindex
/favicon.icoIcono de 32 pxEn cuanto existe el icono del sitio
/buscar?q=…Resultados de la búsqueda, en noindexOpción Búsqueda en el sitio
/<clave>.txtPrueba de propiedad de IndexNowIndexNow activado
/_eclair/mcpConector MCPPermitir conexiones MCP
/_eclair/oauth/authorize, /token, /registerAutorización OAuth del conectorMisma condición
/.well-known/oauth-protected-resource, /.well-known/oauth-authorization-server, /.well-known/openid-configurationDescubrimiento OAuthMisma condición
/_eclair/contactRecepción del formulario de contactoSiempre
/_eclair/edit/<id>Botón ✏️ Editar del sitio, que lleva al editorPersonas con la sesión iniciada
/__eclair/pingPrueba de la reescritura y verificación de la dirección del sitioSiempre

Las direcciones de los contenidos

ContenidoDirección en un sitio en español
Página/mi-pagina, o /padre/hija para una subpágina (4 niveles como máximo)
Inicio/; la dirección propia de la página de inicio redirige a /
Artículo/blog/mi-articulo
Páginas siguientes del blog/blog/pagina/2
Categoría de artículos/blog/mi-categoria
Página de autor/blog/autor/nombre-apellido
Catálogo/tienda, y después /tienda/pagina/2
Categoría de productos, producto/tienda/mi-categoria, /tienda/mi-producto
AdministraciónLa dirección elegida durante la instalación

Las palabras de las direcciones siguen el idioma del sitio: page en francés y en inglés, pagina en español, italiano y portugués, seite en alemán; auteur, autor, author o autore; recherche, buscar, search, suche, cerca o pesquisa; boutique, tienda, shop, negozio o loja.

Una sola dirección por contenido: Éclair redirige con una 301 las variantes en mayúsculas, con barra final, con barras dobles o con index.php, así como http a https cuando HTTPS está forzado, y www o sin www una vez verificada la dirección oficial.

Algunas palabras están reservadas y no pueden usarse como dirección de página: app, data, cache, assets, media, index, admin, _eclair, __eclair, sitemap, robots, feed, llms, llms-full, favicon, wp-admin, wp-login, además de la dirección de tu administración, la del blog, la palabra de la búsqueda y la dirección de la tienda una vez configurada. El SEO de estas direcciones se explica en El SEO con Éclair.

Preguntas frecuentes sobre los archivos

¿Puedo borrar la carpeta cache?

No borres la carpeta en sí: contiene su propia protección .htaccess. Usa Ajustes › Avanzado › Vaciar la caché, que solo borra las páginas generadas; se vuelven a crear en la siguiente visita.

¿Dónde se guardan mis artículos?

En data/content/, un archivo por contenido, con sus 20 últimas versiones en data/revisions/. Las imágenes están en media/, ordenadas por año y por mes.

¿Se puede colocar la carpeta data fuera de la carpeta pública?

Sí, si tu proveedor lo permite: mueve la carpeta data e indica su ruta absoluta con ECLAIR_DATA en eclair-config.php. Añade esta nueva ubicación a tus copias de seguridad.