From d71d0636c02474193348dc4c983bcae92999c343 Mon Sep 17 00:00:00 2001 From: Sluijsens Date: Sat, 25 Jul 2026 23:45:34 +0200 Subject: [PATCH] Split nginx voorbeeldconfigs in pre- en post-certbot varianten, plus access/error logs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit De reverse-proxy en analytics nginx-configs toonden al de door certbot beheerde eindstaat (met SSL-directives), terwijl je die juist nodig hebt vóórdat certbot draait. Nu is het .example-bestand de kale HTTP-versie om te kopiëren, met een apart .post-certbot.example ter referentie voor de staat erna. Alle configs (inclusief webserver-nginx.conf.example) hebben nu ook expliciete error_log/ access_log directives. --- .../deployment/deployment-instructions.md | 4 +- .../nginx/analytics-nginx.conf.example | 36 ++++-------- .../analytics-nginx.conf.post-certbot.example | 50 +++++++++++++++++ .../nginx/reverse-proxy-nginx.conf.example | 43 ++++----------- ...erse-proxy-nginx.conf.post-certbot.example | 55 +++++++++++++++++++ .../nginx/webserver-nginx.conf.example | 3 + .../operations/monitoring/umami-setup.md | 6 +- 7 files changed, 139 insertions(+), 58 deletions(-) create mode 100644 aidlc-docs/features/react-frontend/operations/deployment/nginx/analytics-nginx.conf.post-certbot.example create mode 100644 aidlc-docs/features/react-frontend/operations/deployment/nginx/reverse-proxy-nginx.conf.post-certbot.example diff --git a/aidlc-docs/features/react-frontend/operations/deployment/deployment-instructions.md b/aidlc-docs/features/react-frontend/operations/deployment/deployment-instructions.md index fb207af..bf6c87b 100644 --- a/aidlc-docs/features/react-frontend/operations/deployment/deployment-instructions.md +++ b/aidlc-docs/features/react-frontend/operations/deployment/deployment-instructions.md @@ -39,8 +39,8 @@ Deze secrets heten `PI_MAIN_*` (niet `PI_TEST_*`), omdat dezelfde Pi (Pi Main) e ## Eenmalige Setup — nginx & SSL op de Raspberry Pi's 1. Kopieer `operations/deployment/nginx/webserver-nginx.conf.example` naar `/etc/nginx/sites-available/` op de webserver-Pi, maak een symlink in `sites-enabled/`, en herlaad nginx. Dit bestand is de daadwerkelijk in gebruik zijnde configuratie (`server_name test.slpsoftware.nl`, luistert op poort 80, serveert vanaf `/mnt/storage1/www/html/test/slpsoftware`). -2. Kopieer `operations/deployment/nginx/reverse-proxy-nginx.conf.example` naar `/etc/nginx/sites-available/slpsoftware-test.conf` op de reverse-proxy-Pi, maak een symlink in `sites-enabled/`, en herlaad nginx. Ook dit bestand is de daadwerkelijk in gebruik zijnde (door certbot beheerde) configuratie, met `server_name test.slpsoftware.nl`. -3. Vraag op de reverse-proxy-Pi een SSL-certificaat aan met certbot (Let's Encrypt), nadat het DNS-record klopt: `sudo certbot --nginx -d test.slpsoftware.nl`. Certbot regelt automatisch de HTTPS-configuratie en de HTTP→HTTPS-redirect (net zoals je gewend bent van certbot). +2. Kopieer `operations/deployment/nginx/reverse-proxy-nginx.conf.example` naar `/etc/nginx/sites-available/slpsoftware-test.conf` op de reverse-proxy-Pi, maak een symlink in `sites-enabled/`, en herlaad nginx. Dit is de versie van vóór certbot (alleen poort 80, geen SSL), met `server_name test.slpsoftware.nl`. +3. Vraag op de reverse-proxy-Pi een SSL-certificaat aan met certbot (Let's Encrypt), nadat het DNS-record klopt: `sudo certbot --nginx -d test.slpsoftware.nl`. Certbot herschrijft dit bestand automatisch met de HTTPS-configuratie en de HTTP→HTTPS-redirect — zie `operations/deployment/nginx/reverse-proxy-nginx.conf.post-certbot.example` voor hoe het er dan uitziet (referentie, niet zelf kopiëren). 4. Zorg dat de map `/mnt/storage1/www/html/test/slpsoftware` bestaat op de webserver-Pi en schrijfbaar is voor de gebruiker `webadmin` (bijv. `sudo mkdir -p /mnt/storage1/www/html/test/slpsoftware && sudo chown webadmin:webadmin /mnt/storage1/www/html/test/slpsoftware`). > **Waarom `deploy_path` en de nginx `root` niet hetzelfde pad zijn**: de pipeline uploadt via SCP naar `deploy_path` = `/html/test/slpsoftware` (zie `env.DEPLOY_PATH` in `continuous_integration.yaml`), terwijl de nginx `root` in `webserver-nginx.conf.example` het volledige pad `/mnt/storage1/www/html/test/slpsoftware` is. Dit is geen fout of inconsistentie: de SSH/SCP-gebruiker (`webadmin`) heeft `/mnt/storage1/www` als root (vergelijkbaar met een FTP-chroot), dus vanuit het perspectief van deze gebruiker is `/html/test/slpsoftware` het juiste (relatieve) pad, terwijl dat op het bestandssysteem van de Pi zelf overeenkomt met het volledige pad `/mnt/storage1/www/html/test/slpsoftware` dat nginx als `root` gebruikt. Kortom: `deploy_path` (`/html/test/slpsoftware`) + de root van de `webadmin`-gebruiker (`/mnt/storage1/www`) = de nginx `root` (`/mnt/storage1/www/html/test/slpsoftware`). diff --git a/aidlc-docs/features/react-frontend/operations/deployment/nginx/analytics-nginx.conf.example b/aidlc-docs/features/react-frontend/operations/deployment/nginx/analytics-nginx.conf.example index 9c86891..3cfc57c 100644 --- a/aidlc-docs/features/react-frontend/operations/deployment/nginx/analytics-nginx.conf.example +++ b/aidlc-docs/features/react-frontend/operations/deployment/nginx/analytics-nginx.conf.example @@ -9,45 +9,33 @@ # poort is bewust 3001 (niet het gebruikelijke 3000), omdat Gitea op diezelfde # Pi al poort 3000 systeembreed bezet. # +# Dit is de versie die je gebruikt VOORDAT certbot gedraaid heeft: alleen +# poort 80, geen SSL. Certbot heeft dit HTTP-server-block namelijk nodig om +# de ACME-challenge te kunnen afhandelen en zal, zodra je hem draait, dit +# bestand zelf herschrijven om er de HTTPS-configuratie en de HTTP→HTTPS- +# redirect aan toe te voegen. Zie analytics-nginx.conf.post-certbot.example +# voor hoe het bestand er na die stap uit gaat zien (puur ter referentie — +# dat bestand hoef je niet zelf te kopiëren, certbot genereert het). +# # Kopieer dit bestand handmatig naar bijvoorbeeld # /etc/nginx/sites-available/slpsoftware-analytics.conf op de reverse-proxy-Pi, -# maak een symlink in sites-enabled, en herlaad nginx. -# -# SSL-certificaat: net als voor test.slpsoftware.nl wordt dit aangevraagd met -# certbot (Let's Encrypt), bijvoorbeeld: +# maak een symlink in sites-enabled, herlaad nginx, en draai dan pas certbot: # sudo certbot --nginx -d analytics.slpsoftware.nl # Zorg dat het DNS-record voor analytics.slpsoftware.nl al naar het publieke # IP van deze Pi wijst voordat je certbot draait. - -# HTTP: alleen gebruikt voor de Let's Encrypt ACME-challenge en om door te -# verwijzen naar HTTPS. Na het draaien van certbot ziet dit block er zo uit. server { listen 80; listen [::]:80; server_name analytics.slpsoftware.nl; + error_log /var/log/nginx/slpsoftware-analytics_error.log; + access_log /var/log/nginx/slpsoftware-analytics_access.log; + location /.well-known/acme-challenge/ { root /var/www/certbot; } - location / { - return 301 https://$host$request_uri; - } -} - -# HTTPS: het daadwerkelijke reverse-proxy-verkeer naar Umami op de webserver-Pi. -server { - listen 443 ssl; - listen [::]:443 ssl; - - server_name analytics.slpsoftware.nl; - - ssl_certificate /etc/letsencrypt/live/analytics.slpsoftware.nl/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/analytics.slpsoftware.nl/privkey.pem; - include /etc/letsencrypt/options-ssl-nginx.conf; - ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; - location / { proxy_pass http://192.168.1.103:3001; diff --git a/aidlc-docs/features/react-frontend/operations/deployment/nginx/analytics-nginx.conf.post-certbot.example b/aidlc-docs/features/react-frontend/operations/deployment/nginx/analytics-nginx.conf.post-certbot.example new file mode 100644 index 0000000..0aaee86 --- /dev/null +++ b/aidlc-docs/features/react-frontend/operations/deployment/nginx/analytics-nginx.conf.post-certbot.example @@ -0,0 +1,50 @@ +# REFERENTIE ALLEEN — dit bestand hoef je niet handmatig te kopiëren. +# +# Dit toont hoe /etc/nginx/sites-available/slpsoftware-analytics.conf op de +# reverse-proxy-Pi er automatisch uit komt te zien NADAT je certbot hebt +# gedraaid (`sudo certbot --nginx -d analytics.slpsoftware.nl`) op basis van +# analytics-nginx.conf.example. Certbot voegt zelf de HTTPS-configuratie en +# het HTTP→HTTPS-redirect-blok toe (herkenbaar aan de "managed by Certbot" +# commentaren), en zet de error_log/access_log en het proxy_pass-blok gewoon +# over naar het nieuwe HTTPS-serverblok. +server { + + server_name analytics.slpsoftware.nl; + + error_log /var/log/nginx/slpsoftware-analytics_error.log; + access_log /var/log/nginx/slpsoftware-analytics_access.log; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + proxy_pass http://192.168.1.103:3001; + + 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; + } + + listen 443 ssl; # managed by Certbot + listen [::]:443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/analytics.slpsoftware.nl/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/analytics.slpsoftware.nl/privkey.pem; # managed by Certbot + include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot + +} + +server { + if ($host = analytics.slpsoftware.nl) { + return 301 https://$host$request_uri; + } # managed by Certbot + + + listen 80; + listen [::]:80; + + server_name analytics.slpsoftware.nl; + return 404; # managed by Certbot +} diff --git a/aidlc-docs/features/react-frontend/operations/deployment/nginx/reverse-proxy-nginx.conf.example b/aidlc-docs/features/react-frontend/operations/deployment/nginx/reverse-proxy-nginx.conf.example index 6c53633..8eca6af 100644 --- a/aidlc-docs/features/react-frontend/operations/deployment/nginx/reverse-proxy-nginx.conf.example +++ b/aidlc-docs/features/react-frontend/operations/deployment/nginx/reverse-proxy-nginx.conf.example @@ -3,21 +3,21 @@ # doorstuurt naar de webserver-Pi op 192.168.1.103:80) — voor de TESTOMGEVING, # bereikbaar via het domein test.slpsoftware.nl. # -# Kopieer dit bestand handmatig naar bijvoorbeeld -# /etc/nginx/sites-available/slpsoftware-test.conf op de reverse-proxy-Pi, -# maak een symlink in sites-enabled, en herlaad nginx. +# Dit is de versie die je gebruikt VOORDAT certbot gedraaid heeft: alleen +# poort 80, geen SSL. Certbot heeft dit HTTP-server-block namelijk nodig om +# de ACME-challenge te kunnen afhandelen en zal, zodra je hem draait, dit +# bestand zelf herschrijven om er de HTTPS-configuratie en de HTTP→HTTPS- +# redirect aan toe te voegen. Zie reverse-proxy-nginx.conf.post-certbot.example +# voor hoe het bestand er na die stap uit gaat zien (puur ter referentie — +# dat bestand hoef je niet zelf te kopiëren, certbot genereert het). # -# SSL-certificaat: net als voor de productiesite wordt dit aangevraagd met -# certbot (Let's Encrypt) rechtstreeks op deze reverse-proxy-Pi, bijvoorbeeld: +# Kopieer dit bestand handmatig naar +# /etc/nginx/sites-available/slpsoftware-test.conf op de reverse-proxy-Pi, +# maak een symlink in sites-enabled, herlaad nginx, en draai dan pas certbot: # sudo certbot --nginx -d test.slpsoftware.nl # Zorg dat het DNS-record voor test.slpsoftware.nl al naar het publieke IP van # deze Pi wijst voordat je certbot draait. # -# Dit is de daadwerkelijk in gebruik zijnde configuratie op de reverse-proxy-Pi, -# zoals door certbot gegenereerd/beheerd. Het HTTP-server-block onderaan (dat -# doorverwijst naar HTTPS, behalve voor de ACME-challenge) en de #-commentaren -# "managed by Certbot" zijn automatisch door certbot toegevoegd/aangepast. -# # LET OP - gevonden foutje: de header hieronder heet `X-Real-IP` (met # koppelteken), niet `X-Real_IP` (met underscore). Een header met een # underscore is geen geldige/herkenbare naam voor de standaard `$http_x_real_ip`- @@ -25,6 +25,8 @@ # de ontvangende applicatie/module verwacht het koppelteken-formaat. Corrigeer # dit op de Pi zelf naar `X-Real-IP` zodra je de config daar aanpast. server { + listen 80; + listen [::]:80; server_name test.slpsoftware.nl; @@ -60,25 +62,4 @@ server { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } - - listen 443 ssl; # managed by Certbot - listen [::]:443 ssl; # managed by Certbot - ssl_certificate /etc/letsencrypt/live/test.slpsoftware.nl/fullchain.pem; # managed by Certbot - ssl_certificate_key /etc/letsencrypt/live/test.slpsoftware.nl/privkey.pem; # managed by Certbot - include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot - ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot - } - -server { - if ($host = test.slpsoftware.nl) { - return 301 https://$host$request_uri; - } # managed by Certbot - - - listen 80; - listen [::]:80; - - server_name test.slpsoftware.nl; - return 404; # managed by Certbot -} \ No newline at end of file diff --git a/aidlc-docs/features/react-frontend/operations/deployment/nginx/reverse-proxy-nginx.conf.post-certbot.example b/aidlc-docs/features/react-frontend/operations/deployment/nginx/reverse-proxy-nginx.conf.post-certbot.example new file mode 100644 index 0000000..370c630 --- /dev/null +++ b/aidlc-docs/features/react-frontend/operations/deployment/nginx/reverse-proxy-nginx.conf.post-certbot.example @@ -0,0 +1,55 @@ +# REFERENTIE ALLEEN — dit bestand hoef je niet handmatig te kopiëren. +# +# Dit toont hoe /etc/nginx/sites-available/slpsoftware-test.conf op de +# reverse-proxy-Pi er automatisch uit komt te zien NADAT je certbot hebt +# gedraaid (`sudo certbot --nginx -d test.slpsoftware.nl`) op basis van +# reverse-proxy-nginx.conf.example. Certbot voegt zelf de HTTPS-configuratie +# en het HTTP→HTTPS-redirect-blok toe (herkenbaar aan de "managed by Certbot" +# commentaren), en zet de error_log/access_log en overige location-blocks +# gewoon over naar het nieuwe HTTPS-serverblok. +server { + + server_name test.slpsoftware.nl; + + error_log /var/log/nginx/slpsoftware-test_error.log; + access_log /var/log/nginx/slpsoftware-test_access.log; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location /sentry-tunnel { + proxy_pass https://o4511795618185216.ingest.de.sentry.io/api/4511795622838352/envelope/; + proxy_set_header Host o4511795618185216.ingest.de.sentry.io; + proxy_ssl_server_name on; + } + + location / { + proxy_pass http://192.168.1.103:80; + 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; + } + + listen 443 ssl; # managed by Certbot + listen [::]:443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/test.slpsoftware.nl/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/test.slpsoftware.nl/privkey.pem; # managed by Certbot + include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot + +} + +server { + if ($host = test.slpsoftware.nl) { + return 301 https://$host$request_uri; + } # managed by Certbot + + + listen 80; + listen [::]:80; + + server_name test.slpsoftware.nl; + return 404; # managed by Certbot +} diff --git a/aidlc-docs/features/react-frontend/operations/deployment/nginx/webserver-nginx.conf.example b/aidlc-docs/features/react-frontend/operations/deployment/nginx/webserver-nginx.conf.example index 70b5dbe..5b4831a 100644 --- a/aidlc-docs/features/react-frontend/operations/deployment/nginx/webserver-nginx.conf.example +++ b/aidlc-docs/features/react-frontend/operations/deployment/nginx/webserver-nginx.conf.example @@ -16,6 +16,9 @@ server { server_name test.slpsoftware.nl; + error_log /var/log/nginx/slpsoftware-test-webserver_error.log; + access_log /var/log/nginx/slpsoftware-test-webserver_access.log; + root /mnt/storage1/www/html/test/slpsoftware; index index.html; diff --git a/aidlc-docs/features/react-frontend/operations/monitoring/umami-setup.md b/aidlc-docs/features/react-frontend/operations/monitoring/umami-setup.md index 309eeae..e8df008 100644 --- a/aidlc-docs/features/react-frontend/operations/monitoring/umami-setup.md +++ b/aidlc-docs/features/react-frontend/operations/monitoring/umami-setup.md @@ -168,13 +168,17 @@ uit stap 0.3 is hiervoor al gezet, dus deze service blijft ook draaien zonder da ``` ## 3. Reverse proxy + SSL (op de reverse-proxy-Pi) -1. Kopieer `operations/deployment/nginx/analytics-nginx.conf.example` naar bv. +1. Kopieer `operations/deployment/nginx/analytics-nginx.conf.example` (de versie van vóór + certbot: alleen poort 80, geen SSL) naar bv. `/etc/nginx/sites-available/slpsoftware-analytics.conf` op de reverse-proxy-Pi, en maak een symlink in `sites-enabled`. 2. Zorg dat het DNS-record voor `analytics.slpsoftware.nl` al actief is, en draai dan: ```bash sudo certbot --nginx -d analytics.slpsoftware.nl ``` + Certbot herschrijft het bestand automatisch met de HTTPS-configuratie en de + HTTP→HTTPS-redirect — zie `operations/deployment/nginx/analytics-nginx.conf.post-certbot.example` + voor hoe het er dan uitziet (referentie, niet zelf kopiëren). 3. Herlaad nginx: `sudo nginx -t && sudo systemctl reload nginx`. 4. Test: open `https://analytics.slpsoftware.nl` in de browser — je zou het Umami-inlogscherm moeten zien (standaard inloggegevens: `admin` / `umami`, **direct