# Nginx Proxy Manager en publiek HTTPS-domein Deze handleiding publiceert VacatureRadar achter Nginx Proxy Manager zonder de Django-container rechtstreeks op internet bloot te stellen. ## Waarom `DisallowedHost` verschijnt Django weigert onbekende `Host`-headers bewust. Een publieke hostnaam moet daarom expliciet overeenkomen met: - `PUBLIC_BASE_URL`; - `DJANGO_ALLOWED_HOSTS`; - `DJANGO_CSRF_TRUSTED_ORIGINS`. De applicatie leidt de host en CSRF-origin automatisch af uit `PUBLIC_BASE_URL`, maar de expliciete lijsten blijven ondersteund voor LAN- en beheerhosts. Een publieke Django-debugpagina is een afzonderlijk beveiligingsprobleem. Gebruik achter Nginx altijd `DJANGO_DEBUG=0`; debugpagina's tonen interne paden en implementatiedetails. ## VacatureRadar configureren Voer dit uit in de huidige bronmap op Unraid: ```bash cd /mnt/user/appdata/VacatureRadar python scripts/configure_public_url.py \ https://vacatureradar.itworx.tech \ --env-file /mnt/user/appdata/VacatureRadar/.env \ --cache-url redis://127.0.0.1:6379/1 ``` De helper: - bewaart bestaande secrets en databasewachtwoorden; - zet `DJANGO_DEBUG=0`; - voegt de host en CSRF-origin toe; - activeert secure cookies en HTTPS-redirect; - zet een conservatieve HSTS-periode; - activeert reverse-proxyherkenning; - maakt de gastdemo alleen-lezen; - gebruikt Redis voor gedeelde rate limiting en readiness; - schrijft het bestand atomair met modus `0600`. Hermaak daarna de container. Een gewone restart laadt gewijzigde environmentvariabelen niet altijd opnieuw: ```bash docker compose -f docker-compose.unraid.yml up -d --build --force-recreate ``` Voor een andere omgeving kan `deployment/production.env.example` als checklist worden gebruikt. ## Proxy Host in Nginx Proxy Manager Gebruik voor de Proxy Host: | Instelling | Waarde | |---|---| | Domain Names | `vacatureradar.itworx.tech` | | Scheme | `http` | | Forward Hostname / IP | het LAN-IP of de Docker-hostnaam van VacatureRadar | | Forward Port | `1226` | | Cache Assets | uit, tenzij expliciet getest | | Block Common Exploits | aan | | Websockets Support | niet vereist | Op het tabblad **SSL**: - vraag een geldig certificaat aan; - activeer Force SSL; - activeer HTTP/2; - activeer HSTS pas nadat HTTPS correct werkt; - activeer HSTS subdomains alleen wanneer alle subdomeinen HTTPS ondersteunen. Nginx Proxy Manager stuurt de noodzakelijke proxyheaders normaal al door. Gebruik bij een aangepaste configuratie minstens: ```nginx proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ``` Overschrijf deze headers aan de proxyzijde; laat een internetclient ze niet vrij bepalen. ## Correcte client-IP-rate-limiting VacatureRadar vertrouwt `X-Forwarded-For` alleen wanneer de directe afzender in `TRUSTED_PROXY_CIDRS` staat. Zonder deze instelling blijft rate limiting veilig op het proxy-IP werken, maar worden bezoekers niet individueel onderscheiden. Bepaal het proxy-IP of Docker-netwerk en voeg alleen dat bereik toe, bijvoorbeeld: ```bash python scripts/configure_public_url.py \ https://vacatureradar.itworx.tech \ --env-file /mnt/user/appdata/VacatureRadar/.env \ --cache-url redis://127.0.0.1:6379/1 \ --trusted-proxy-cidr 172.18.0.0/16 ``` Gebruik geen brede private range zoals `10.0.0.0/8` of `172.16.0.0/12` zonder aantoonbare noodzaak. ## Validatie Controleer eerst intern: ```bash curl -fsS http://127.0.0.1:1226/health/live/ curl -fsS http://127.0.0.1:1226/health/ready/ ``` Controleer daarna publiek: ```bash curl -I https://vacatureradar.itworx.tech/ curl -fsS https://vacatureradar.itworx.tech/robots.txt ``` Verwacht: - geen `DisallowedHost`; - geen Django-debugpagina; - een redirect naar login of HTTP 200 na authenticatie; - `Strict-Transport-Security` zodra HSTS actief is; - `X-Content-Type-Options: nosniff`; - `X-Frame-Options: DENY`; - `Content-Security-Policy`; - standaard `X-Robots-Tag: noindex, nofollow, noarchive` voor een persoonlijke installatie. Controleer ook een echte login, logout en één CSRF-beschermde actie. Alleen een succesvolle GET bewijst niet dat proxy-HTTPS en CSRF correct zijn. ## Terugdraaien Bij een probleem: 1. zet de Proxy Host tijdelijk op access-list/VPN-only of offline; 2. herstel de vorige `.env` uit de beheerde back-up; 3. hermaak de container; 4. controleer intern `/health/ready/`; 5. publiceer pas opnieuw nadat login en CSRF via HTTPS slagen.