feat(saas): infraestructura de producción para la VM
Bloque C de la fase SaaS (ficheros; el despliegue se hace con el runbook): - docker-compose.prod.yml: superficie mínima (solo el frontend en 127.0.0.1:8089 para el nginx nativo), límites de memoria, sin seeder. - deploy/nginx-recordalexia.conf: server block con cabeceras de seguridad, X-Forwarded-For para el rate-limiter y preparado para certbot. - deploy/backup.sh: pg_dump diario comprimido, retención 14, copia externa vía rclone y detección de backups vacíos. - .env.prod.example (y .env.prod en .gitignore). - docs/operacion-saas.md: runbook con primer despliegue, checklist, restore ENSAYADO paso a paso, actualización y problemas conocidos.
This commit is contained in:
40
deploy/nginx-recordalexia.conf
Normal file
40
deploy/nginx-recordalexia.conf
Normal file
@@ -0,0 +1,40 @@
|
||||
# Server block de recordaLexia para el nginx NATIVO de la VM.
|
||||
# Instalación: copiar a /etc/nginx/sites-available/recordalexia, enlazar en
|
||||
# sites-enabled, y emitir el certificado con:
|
||||
# sudo certbot --nginx -d recordalexia.jaumegar.work
|
||||
# (certbot reescribe este fichero añadiendo el bloque TLS y la redirección 80→443)
|
||||
#
|
||||
# El upstream es el contenedor frontend del compose de producción, que solo
|
||||
# escucha en loopback: este nginx es la única puerta de entrada.
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name recordalexia.jaumegar.work;
|
||||
|
||||
# Subidas holgadas (la app apenas sube nada, pero evitamos el 413 histórico).
|
||||
client_max_body_size 16m;
|
||||
|
||||
# --- Cabeceras de seguridad (spec production-hardening) ---
|
||||
add_header X-Content-Type-Options nosniff always;
|
||||
add_header Content-Security-Policy "frame-ancestors 'none'" always;
|
||||
add_header Referrer-Policy strict-origin-when-cross-origin always;
|
||||
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:8089;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
# La IP real del cliente: el rate-limiter del backend la usa como clave.
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
# El service worker y el manifest no deben quedar cacheados por intermediarios
|
||||
# de forma agresiva: la PWA se actualiza comprobándolos.
|
||||
location = /ngsw-worker.js {
|
||||
proxy_pass http://127.0.0.1:8089;
|
||||
proxy_set_header Host $host;
|
||||
add_header Cache-Control "no-cache" always;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user