# nginx-Konfiguration des Frontend-Containers. # # Liefert das gebaute Vite-Bundle aus und reicht /api an das Backend weiter. # Das Image läuft unprivilegiert, deshalb Port 8080 statt 80. server { listen 8080; listen [::]:8080; server_name _; root /usr/share/nginx/html; index index.html; # Hinter dem Reverse Proxy kommen die echten Adressen aus den Kopfzeilen. real_ip_header X-Forwarded-For; real_ip_recursive on; client_max_body_size 4m; gzip on; gzip_vary on; gzip_min_length 1024; gzip_proxied any; gzip_types text/plain text/css application/javascript application/json image/svg+xml application/xml; # Die Anwendung wird ausschließlich hinter einem Reverse Proxy betrieben; # TLS und HSTS übernimmt dieser. add_header X-Content-Type-Options nosniff always; add_header X-Frame-Options SAMEORIGIN always; add_header Referrer-Policy strict-origin-when-cross-origin always; # --- API ----------------------------------------------------------------- location /api/ { proxy_pass http://moneyfy-backend:8000; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; proxy_set_header X-Forwarded-Host $host; proxy_set_header Connection ""; # Exporte können bei vielen Buchungen etwas dauern. proxy_connect_timeout 5s; proxy_read_timeout 120s; proxy_send_timeout 120s; # API-Antworten enthalten Kontostände – nichts davon zwischenspeichern. proxy_buffering off; add_header Cache-Control "no-store" always; } # --- Statische Dateien --------------------------------------------------- # Vite hängt einen Inhaltshash an die Dateinamen; sie sind unveränderlich. location /assets/ { expires 1y; add_header Cache-Control "public, max-age=31536000, immutable" always; access_log off; try_files $uri =404; } location = /favicon.svg { expires 7d; access_log off; } location = /healthz { access_log off; default_type text/plain; return 200 "ok\n"; } # Alles Übrige beantwortet die Single-Page-Anwendung. location / { # index.html darf nie im Cache hängen bleiben, sonst zeigt ein Browser # nach dem Update weiter auf die alten Bundle-Namen. add_header Cache-Control "no-cache" always; try_files $uri $uri/ /index.html; } }