server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; # Résolveur DNS interne de Docker : résolution du backend à l'exécution, # pour que nginx démarre même si le service "api" arrive un peu après. resolver 127.0.0.11 valid=30s ipv6=off; # En-têtes de sécurité (défense en profondeur, en plus du backend/WAF). add_header X-Content-Type-Options nosniff always; add_header X-Frame-Options DENY always; add_header Referrer-Policy no-referrer always; # API proxifiée vers le backend Go (même origine → pas de CORS). # proxy_pass sans URI (variable) => l'URI d'origine est transmise telle quelle. location /api/ { set $api_upstream api:8080; proxy_pass http://$api_upstream; 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 $scheme; } location = /healthz { set $api_upstream api:8080; proxy_pass http://$api_upstream; } # SPA : fallback vers index.html pour le routage côté client. location / { try_files $uri $uri/ /index.html; } }