# Nginx: serveert de React-app en stuurt API/admin door naar gunicorn. # Draait er een reverse proxy vóór ons die TLS afhandelt (Caddy/Traefik), dan # komt het verzoek hier als gewoon http binnen en is $scheme dus "http". Zouden # we dat doorgeven, dan denkt Django dat de verbinding onveilig is en stuurt het # met DJANGO_SECURE=1 elk verzoek door naar https — een oneindige redirect-lus. # Daarom: neem de X-Forwarded-Proto van de proxy over, en val alleen terug op # $scheme als die header ontbreekt (nginx zelf aan de buitenkant, of geen TLS). map $http_x_forwarded_proto $rw_forwarded_proto { default $http_x_forwarded_proto; "" $scheme; } server { listen 80; server_name _; # Upload-/postlimiet wat ruimer (bv. importbestanden later). client_max_body_size 20M; # Beveiligingsheaders voor alles wat nginx zelf serveert (de SPA). # Django zet vergelijkbare headers al op /api en /admin. add_header X-Content-Type-Options nosniff always; add_header X-Frame-Options DENY always; add_header Referrer-Policy same-origin always; # Door Django verzamelde statische bestanden (o.a. admin-CSS). # Deze map komt uit het gedeelde volume 'static_volume'. location /static/ { alias /static/; access_log off; expires 30d; } # Geüploade media (pictogrammen), uit het gedeelde volume. location /media/ { alias /media/; access_log off; expires 7d; } # API-verzoeken naar de Django-backend (gunicorn). location /api/ { proxy_pass http://backend:8000; 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 $rw_forwarded_proto; } # Django-admin loopt ook via de backend. location /admin/ { proxy_pass http://backend:8000; 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 $rw_forwarded_proto; } # Alle overige paden: de single-page React-app. # try_files zorgt dat client-side routes terugvallen op index.html. location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } }