# nginx.conf — reverse proxy + SPA static pour rubis-web # # Sert : # - / → assets SPA + index.html avec fallback try_files (TanStack Router) # - /api/* → reverse proxy vers le service ClusterIP rubis-api:3333 # # Le service rubis-api est interne au cluster K3s (pas de NodePort). # Seul nginx (NodePort 30110 → Traefik) est exposé. upstream rubis_api { server rubis-api.rubis.svc.cluster.local:3333 max_fails=3 fail_timeout=10s; keepalive 32; } # Compression gzip — Vite produit déjà du JS minifié, mais HTML/CSS/SVG # bénéficient toujours du gzip on-the-fly. gzip on; gzip_vary on; gzip_min_length 1024; gzip_types application/javascript application/json application/xml text/css text/html text/plain image/svg+xml; server { listen 80 default_server; server_name _; root /var/www; index index.html; # Limite raisonnable pour les uploads de factures (PDF, photos). client_max_body_size 25m; # Désactive les logs sur les ressources qui spamment (favicon, robots). location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; } # Assets fingerprintés Vite : cache long, immutable. location /assets/ { expires 1y; add_header Cache-Control "public, immutable"; try_files $uri =404; } # API → reverse proxy vers AdonisJS (rubis-api ClusterIP). # Inclut /api/v1/checkin/* qui sert les liens reçus par email. location /api/ { proxy_pass http://rubis_api; 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 https; proxy_set_header Connection ""; # Timeouts adaptés au plus long endpoint (upload OCR Mistral). proxy_connect_timeout 5s; proxy_send_timeout 60s; proxy_read_timeout 60s; } # SPA fallback : toute route non-asset, non-API → index.html # (TanStack Router gère côté client). location / { try_files $uri $uri/ /index.html; # index.html lui-même : pas de cache (pour récupérer les nouveaux # builds sans purger côté client). add_header Cache-Control "no-cache, no-store, must-revalidate"; } }