# Portal de reportes de INCIDE
#
#   /etc/nginx/sites-available/incide.conf
#
# El parametro que no se puede omitir es fastcgi_read_timeout. Un reporte que
# aun no esta en cache tarda unos 70 s en armarse porque baja las imagenes de
# Sihos. Con el valor por defecto (60 s) nginx corta la conexion aunque PHP
# siga trabajando: el paciente ve un error de carga y el PDF se genera igual,
# guardado en disco para la proxima vez.

server {
    listen 80;
    listen [::]:80;
    server_name reportes.incide.com.co;

    # Sin esto, el certificado no se puede emitir y queda en un bucle de
    # redireccion. Once emitido, se puede volver a poner en escucha 443.
    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name reportes.incide.com.co;

    # Rutas del certificado: las genera certbot --nginx.
    ssl_certificate     /etc/letsencrypt/live/reportes.incide.com.co/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/reportes.incide.com.co/privkey.pem;

    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 1d;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "same-origin" always;

    root /var/www/incide/public;
    index index.php;

    charset utf-8;
    client_max_body_size 16M;

    access_log /var/log/nginx/incide-access.log;
    error_log  /var/log/nginx/incide-error.log;

    # Los reportes son PDF de hasta unos 5 MB. En cache del servidor saves
    # trabajo para el PHP, que es el recurso escaso en un VPS de 1 GB.
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css text/html application/javascript
               application/json image/svg+xml;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # El PDF se entrega comoinline para que abra en el navegador. Nunca debe
    # guardarse en disco del visitante ni quedar accesible sin pasar por PHP:
    # los .htaccess de storage y database ya lo bloquean, pero nginx no los
    # lee. Esta regla lo garantiza.
    location ~* \.(pdf)$ {
        return 404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;

        # Laravel no tiene configurado ningun proxy de confianza, asi que no
        # lee el X-Forwarded-Proto que nginx podria enviar. Sin esto, PHP ve
        # la peticion como http y las URLs que genera el portal salen sin
        # cifrar, aunque el visitante este en https.
        fastcgi_param HTTPS on;

        # ---- lo importante -------------------------------------------------
        # Sin esto, nginx corta la conexion a los 60 s aunque el PDF se siga
        # generando. El sintoma es un error en el navegador del paciente y un
        # reporte que si se guardo en el servidor.
        fastcgi_read_timeout 300s;
        fastcgi_send_timeout 300s;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;

        # En una instalacion normal de Laravel los .php no se piden nunca por
        # URL. Esta excepcion deja pasar solo index.php, que es el front
        # controller.
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}