@@ -0,0 +1,136 @@
|
||||
# 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/source
|
||||
python scripts/configure_public_url.py \
|
||||
https://vacatureradar.itworx.tech \
|
||||
--env-file /mnt/user/appdata/vacatureradar/source/.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/source/.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.
|
||||
@@ -7,9 +7,10 @@ Deze handleiding gebruikt `docker-compose.unraid.yml` als declaratieve bron van
|
||||
Maak deze directories:
|
||||
|
||||
```text
|
||||
/mnt/user/appdata/vacatureradar/config
|
||||
/mnt/user/appdata/vacatureradar/media
|
||||
/mnt/user/appdata/vacatureradar/logs
|
||||
/mnt/user/appdata/vacatureradar/source
|
||||
/mnt/user/appdata/vacatureradar/source/local
|
||||
/mnt/user/appdata/vacatureradar/source/local/media
|
||||
/mnt/user/appdata/vacatureradar/source/local/logs
|
||||
/mnt/user/appdata/vacatureradar/source/local/postgres-aio17
|
||||
/mnt/user/appdata/vacatureradar/source/local/redis-aio
|
||||
/mnt/user/appdata/vacatureradar/ollama # alleen bij lokale AI
|
||||
@@ -46,48 +47,46 @@ Gebruik in productie geen zwevende `latest` zonder gecontroleerd rollbackpad.
|
||||
|
||||
## Configuratiebestand
|
||||
|
||||
Kopieer of genereer `.env` naar:
|
||||
|
||||
De deploy-helper `scripts/deploy_docker.sh` vult ontbrekende sleutels op basis van veilige defaults.
|
||||
Zet voor publieke productie vooraf de gewenste variabelen:
|
||||
De standaardlocatie die `docker-compose.unraid.yml` leest is:
|
||||
|
||||
```text
|
||||
/mnt/user/appdata/vacatureradar/config/.env
|
||||
APP_HOST=jobs.example.be
|
||||
APP_SCHEME=https
|
||||
DJANGO_DEBUG=0
|
||||
SESSION_COOKIE_SECURE=1
|
||||
CSRF_COOKIE_SECURE=1
|
||||
SECURE_SSL_REDIRECT=1
|
||||
/mnt/user/appdata/vacatureradar/source/.env
|
||||
```
|
||||
|
||||
Gebruik daarna de helper (zie hieronder).
|
||||
Een afwijkende locatie kan vóór Compose via `VACATURERADAR_ENV_FILE` worden ingesteld. Gebruik [`deployment/production.env.example`](../../deployment/production.env.example) alleen als checklist en kopieer nooit ongewijzigde `CHANGE_ME`-waarden.
|
||||
|
||||
Configureer een bestaand bestand voor de publieke URL zonder secrets te overschrijven:
|
||||
|
||||
```bash
|
||||
cd /mnt/user/appdata/vacatureradar/source
|
||||
python scripts/configure_public_url.py \
|
||||
https://vacatureradar.example.be \
|
||||
--env-file /mnt/user/appdata/vacatureradar/source/.env \
|
||||
--cache-url redis://127.0.0.1:6379/1
|
||||
```
|
||||
|
||||
Beperk de bestandsrechten van `.env` tot de beheerder. Voeg geen secrets toe aan de ZIP, Git, screenshots of supportlogs.
|
||||
|
||||
## Eerste uitrol
|
||||
|
||||
1. Controleer alle `CHANGE_ME`-waarden.
|
||||
2. Gebruik de deploy-helper voor een snelle eerste start:
|
||||
1. Controleer alle `CHANGE_ME`-waarden en maak een back-up van een bestaande `.env`.
|
||||
2. Start of hermaak de Unraid-container vanuit de bronmap:
|
||||
|
||||
```bash
|
||||
cd /app/VacatureRadar
|
||||
APP_HOST=jobs.example.be APP_SCHEME=https DJANGO_DEBUG=0 \
|
||||
SESSION_COOKIE_SECURE=1 CSRF_COOKIE_SECURE=1 SECURE_SSL_REDIRECT=1 \
|
||||
bash scripts/deploy_docker.sh
|
||||
cd /mnt/user/appdata/vacatureradar/source
|
||||
docker compose -f docker-compose.unraid.yml up -d --build --force-recreate
|
||||
```
|
||||
|
||||
3. Start de ene appcontainer; de entrypoint initialiseert PostgreSQL, voert migraties uit en start daarna alle processen onder Supervisor.
|
||||
6. Controleer `GET /health/live/` en `GET /health/ready/`.
|
||||
6. Voer eenmalig in de webcontainer uit:
|
||||
3. De entrypoint valideert de productieconfiguratie, initialiseert PostgreSQL, voert migraties uit en start alle processen onder Supervisor.
|
||||
4. Controleer intern `GET /health/live/` en `GET /health/ready/`.
|
||||
5. Voer alleen wanneer bootstrap niet automatisch is ingeschakeld eenmalig uit:
|
||||
|
||||
```bash
|
||||
python manage.py bootstrap_instance
|
||||
python manage.py collectstatic --noinput
|
||||
docker exec -it VacatureRadar python manage.py bootstrap_instance
|
||||
```
|
||||
|
||||
7. Meld lokaal aan en wijzig het bootstrapwachtwoord.
|
||||
8. Activeer nog geen live bron of mailbox voordat bronbeleid, retentie en back-up zijn gecontroleerd.
|
||||
6. Meld lokaal aan en wijzig het bootstrapwachtwoord.
|
||||
7. Activeer nog geen live bron of mailbox voordat bronbeleid, retentie en back-up zijn gecontroleerd.
|
||||
|
||||
## Beheerverbinding en heruitrol
|
||||
|
||||
@@ -135,7 +134,7 @@ Expose de applicatie niet rechtstreeks op internet. Plaats Nginx Proxy Manager,
|
||||
- optioneel extra access control/VPN voor persoonlijke installatie;
|
||||
- geen publieke toegang tot PostgreSQL, Redis of Ollama.
|
||||
|
||||
Wanneer een proxy op hetzelfde Docker-netwerk draait, publiceer poort 1226 alleen intern. Wanneer Unraid routing een hostpoort vereist, beperk die via firewall/VLAN tot de proxy of het beheernetwerk.
|
||||
Wanneer een proxy op hetzelfde Docker-netwerk draait, publiceer poort 1226 alleen intern. Wanneer Unraid routing een hostpoort vereist, beperk die via firewall/VLAN tot de proxy of het beheernetwerk. Volg voor host-, CSRF-, proxyheader- en TLS-instellingen de [Nginx Proxy Manager-handleiding](NGINX_PROXY_MANAGER.md).
|
||||
|
||||
## Mailbox
|
||||
|
||||
|
||||
Reference in New Issue
Block a user