Maak DEPLOY_PATH configureerbaar via Gitea Actions variable i.p.v. hardcoded #7

Merged
Sluijsens merged 10 commits from feature/production_deploy_automation into master 2026-07-30 23:58:06 +02:00
4 changed files with 195 additions and 0 deletions
Showing only changes of commit d1f544555d - Show all commits
@@ -0,0 +1,26 @@
# Live Configs
Deze map bevat **gecorrigeerde kopieën** van de daadwerkelijk op de Raspberry Pi's
draaiende nginx-configuratiebestanden, zoals doorgenomen en gefixt op 2026-07-27.
In tegenstelling tot de `*.example`-bestanden een map hoger (die generieke, minimale
sjablonen zijn om een nieuwe omgeving vanaf nul op te zetten), zijn dit snapshots van
bestanden die specifiek voor déze Pi's gelden — inclusief zaken die niet bij de
react-frontend-feature horen (bv. de mail/iRedAdmin-proxying in `slpsoftware.conf`).
**Deze bestanden worden niet automatisch gesynchroniseerd met de Pi's.** Als je op de
Pi's iets aanpast, is dit bestand pas weer correct nadat je de wijziging hier ook
handmatig doorvoert (of andersom: kopieer bij twijfel altijd eerst de live versie van
de Pi hierheen voordat je hem hier aanpast).
## Bestanden
| Bestand | Waar het hoort | Wat er is gefixt (2026-07-27) |
|---|---|---|
| `slpsoftware-analytics.conf` | pi-entry (reverse-proxy), `/etc/nginx/sites-available/` | Acme-challenge-location verplaatst van het poort-80-blok naar het 443-blok (renewal zou anders stilzwijgend falen); listen-volgorde 443/[::]:443 rechtgezet. |
| `slpsoftware-test-webserver.conf` | pi-main (webserver), `/etc/nginx/sites-available/` | Ontbrekende `error_log`/`access_log`-regels toegevoegd; misleidende comment over "alleen intern IP" vervangen door een correcte toelichting (luistert bewust op alle interfaces, consistent met de rest). |
| `slpsoftware.conf` | pi-entry (reverse-proxy), `/etc/nginx/sites-available/` | Acme-challenge-location toegevoegd aan beide 443-blokken (ontbrak volledig); `/sentry-tunnel`-proxy toegevoegd aan het slpsoftware.nl/www-blok (ontbrak volledig, dus Sentry-events vanuit productie werden niet getunneld); iredadmin/mail-regex aangescherpt (`^\/(iredadmin\|mail)(\/\|$)`) om valse matches te voorkomen. |
Zie ook: `../deployment-instructions.md` en `../deployment-plan.md` voor de bredere
context, en `../production-nginx.conf.example` / `../production-nginx.conf.post-certbot.example`
voor de generieke, react-frontend-only variant zonder de mail/iRedAdmin-onderdelen.
@@ -0,0 +1,43 @@
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
}
@@ -0,0 +1,31 @@
server {
# Luistert op alle interfaces (net als de andere sites op deze Pi); deze
# Pi is sowieso niet vanaf internet bereikbaar, dus dit is bewust en consistent.
listen 80;
listen [::]:80;
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;
# De React-app gebruikt client-side routing (React Router), dus onbekende
# paden moeten terugvallen op index.html in plaats van een 404 te geven.
location / {
try_files $uri $uri/ /index.html;
}
# Statische assets mogen langer gecachet worden.
location ~* \.(?:css|js|svg|png|jpg|jpeg|gif|ico|woff2?)$ {
try_files $uri =404;
expires 7d;
add_header Cache-Control "public";
}
# Doorgeven van het echte client-IP en protocol, afkomstig van de reverse proxy.
#set_real_ip_from 192.168.1.0/24;
#real_ip_header X-Forwarded-For;
}
@@ -0,0 +1,95 @@
server {
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
server_name slpsoftware.nl www.slpsoftware.nl;
access_log /var/log/nginx/slpsoftware_access.log;
error_log /var/log/nginx/slpsoftware_error.log;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
# Sentry "tunnel" endpoint (zie src/main.tsx's Sentry.init tunnel-optie en
# de toelichting in reverse-proxy-nginx.conf.example) — voorkomt dat
# ad-blockers Sentry-events blokkeren door ze via ons eigen domein te
# tunnelen. VITE_SENTRY_DSN is bewust gedeeld tussen test en productie
# (één Sentry-project, environment-tag onderscheidt ze), dus dezelfde
# org-/project-id als de testomgeving is hier correct.
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 ~ ^\/(iredadmin|mail)(\/|$) {
proxy_pass https://192.168.1.104:443;
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 / {
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;
}
ssl_certificate /etc/letsencrypt/live/slpsoftware.nl/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/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 {
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
server_name mail.slpsoftware.nl;
access_log /var/log/nginx/mail.slpsoftware_access.log;
error_log /var/log/nginx/mail.slpsoftware_error.log;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
proxy_pass https://192.168.1.104:443; # Odroid C4 hosting iRedMail
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;
}
ssl_certificate /etc/letsencrypt/live/mail.slpsoftware.nl/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mail.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 {
listen 80;
listen [::]:80;
server_name slpsoftware.nl www.slpsoftware.nl mail.slpsoftware.nl;
if ($host = mail.slpsoftware.nl) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = www.slpsoftware.nl) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = slpsoftware.nl) {
return 301 https://$host$request_uri;
} # managed by Certbot
return 404; # managed by Certbot
}