Static Hosting con nginx
nginx sirve el árbol estático construido y reenvía dos familias de URL al daemon del CMS. El repositorio trae dos vhosts de ejemplo; esta página cubre ambos y la sincronización de root en el deploy.
Los dos archivos de ejemplo
deploy/chinaski.nginx.example: el vhost estático mínimo: document root, bloques de proxy /forms/ y /documents/, políticas de caché y cabeceras de seguridad.deploy/chinaski.nginx.conf.example: el ejemplo por instancia más completo (puerto 80 por defecto; añade TLS víacertbot --nginx -d YOUR_DOMAINdespués de habilitar el vhost).- Crea un symlink dentro de
sites-enabled/, correnginx -t, luego recarga (systemctl reload nginx) tras la configuración.
La document root
Apunta root a la salida construida:
/var/www/chinaski<N>/output/<lang>: para multilingüe por ruta (vhosts individuales por idioma; p. ej. uno por site de idioma)./var/www/chinaski<N>/output: para sites monolingües (el modo de URLnone).
El script de deploy te autocorrige el root de nginx: en cada deploy, deploy.sh reescribe la directiva root en cualquier configuración de nginx que referencie ese directorio de instalación para que coincida con el modo de idioma actual (solo output para none; si no, output/<default language>), corre nginx -t, y recarga. Con una advertencia si la prueba de configuración falla para que sepas que debes revisar manualmente.
Bloques de proxy que necesitas
location ^~ /forms/hace proxy ahttp://127.0.0.1:CMS_PORT: requerido cuando cualquier formulario del site publica submissions (o renderiza cualquier formulario). Sin él: "cada envío de formulario devuelve 404".location ^~ /documents/: requerido cuando el site usa la característica documents; el seguimiento de descargas y el estado de publicación de los documents no pueden incrustarse en un build estático.
Las demás rutas estáticas no necesitan nada más allá de try_files $uri $uri/index.html =404 (más directivas de caché por asset y cabeceras de seguridad).
Cabeceras de caché que establecen los ejemplos
- HTML: máximo corto (revalidar a los 5 minutos), para que el contenido publicado sea oportuno.
- Service worker: no-cache (
sw.js). - Fuentes: inmutables 1 año.
- Otros assets: 1 día.
- Cabeceras de seguridad: como cinturón y tirantes: la app también las establece; el proxy añade una capa para respuestas antes de que la app tenga la oportunidad.
Proxy por loopback (y por qué no requiere configuración extra)
Los ejemplos hacen proxy desde 127.0.0.1: loopback, confiado por defecto en la app. Si tu entorno real hace proxy al CMS desde una dirección que no es loopback (un bridge de contenedores, por ejemplo), añade esa red a CHINASKI_TRUSTED_PROXIES para que las IPs reales de los clientes se registren y el rate limiting funcione por visitante.