# Backup Proxy Manager — nginx-Site
#
# HTTPS-only. Selbstsigniertes Cert wird beim ersten install vom postinst
# erzeugt; Admin tauscht es durch ein PKI-Cert aus, indem cert.pem +
# key.pem überschrieben werden (siehe `bpm-setup install-cert`).
#
# Das System ist NICHT für den Internet-Einsatz gedacht — kein Let's
# Encrypt, kein automatisches Renewal. Cert-Lifetime: 10 Jahre.

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;

    # Aller HTTP-Traffic wird auf HTTPS umgeleitet.
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    http2 on;
    server_name _;

    # TLS-Material — vom postinst generiert, vom Admin austauschbar.
    ssl_certificate     /etc/backup-manager/tls/cert.pem;
    ssl_certificate_key /etc/backup-manager/tls/key.pem;

    # Mozilla-Modern-Profil (Stand 2026): TLS 1.2+1.3, AEAD-Suites,
    # Forward-Secrecy, Server-Cipher-Order off (Client wählt).
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # KEIN HSTS — bei selbstsigniertem Cert würde HSTS Browser dazu
    # zwingen, ein Cert-Akzeptieren-Dialog zu unterdrücken; ein späterer
    # PKI-Cert-Wechsel würde Tickets bekommen. Sobald ein vertrauens-
    # würdiges Cert läuft, kann der Admin HSTS hier ergänzen.

    client_max_body_size 32M;
    access_log /var/log/nginx/bpm-access.log;
    error_log  /var/log/nginx/bpm-error.log;

    root /usr/share/backup-manager/frontend-dist;
    index index.html;

    location = /up {
        try_files $uri @laravel;
    }

    location /api/ {
        try_files $uri @laravel;
    }
    location = /api {
        try_files $uri @laravel;
    }

    location @laravel {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
        fastcgi_read_timeout 60s;
        fastcgi_param SCRIPT_FILENAME /usr/share/backup-manager/backend/public/index.php;
        fastcgi_param SCRIPT_NAME /index.php;
        fastcgi_param DOCUMENT_ROOT /usr/share/backup-manager/backend/public;
        fastcgi_param PATH_INFO "";
        fastcgi_param HTTPS on;
    }

    location / {
        try_files $uri $uri/ /index.html;
    }

    location = /index.html {
        add_header Cache-Control "no-cache, no-store, must-revalidate";
        add_header Pragma "no-cache";
        expires 0;
        try_files $uri =404;
    }
    location = / {
        add_header Cache-Control "no-cache, no-store, must-revalidate";
        add_header Pragma "no-cache";
        expires 0;
        try_files /index.html =404;
    }

    location ~ \.php$ {
        return 404;
    }

    location ~* \.(?:js|css|woff2?|ttf|eot|svg|ico|png|jpg|jpeg|gif|webp)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
        try_files $uri =404;
    }
}
