Files
GerbilManager/deploy/truenas/vhost-snippet.conf
Gulum 45b8533f18
Some checks failed
CI / Backend Tests (.NET) (push) Successful in 1m11s
CI / Frontend Tests (Node/Vite) (push) Failing after 4m59s
CI / Docker Build & Push (push) Has been skipped
CI / Deploy auf TrueNAS (Custom App) (push) Has been skipped
feat(deploy): TrueNAS Custom-App + Auto-Deploy, plus aufgelaufene Arbeit
Deployment:
- custom-app.compose.yaml: self-contained Compose fuer TrueNAS "Custom App"
  (absolute Host-Bind-Pfade, postgres:18, pull_policy always, Port 8090)
- scripts/truenas-deploy.sh: Host-Skript create/redeploy via midclt (App
  bleibt unter Apps sichtbar) inkl. Image-Pull + Health-Check
- ci.yml Deploy-Job: laeuft auf ubuntu-latest-Runner, kopiert Deploy-Dateien
  per SSH auf den NAS-Host und triggert truenas-deploy.sh (statt runs-on goldeye)
- compose.yaml/.env.example: postgres:18 (Locale-Match zur Quell-DB), Port 8090
- .gitignore: .agents/, tools/rag/, deploy/truenas/.env (Secrets/Scratch)

Aufgelaufene Feature-Arbeit (verified/Freeze, Migrationen, Import-Triage):
- GerbilOverride/VerifiedGerbil-Endpoints + GerbilSnapshotService + Tests
- EF-Migrationen (ShowInChronicle, Stillborn, BirthOrder, ManualFlag, DSGVO)
- Frontend VerifizierteTierePage + verified-API + e2e-Spec
- diverse Import-/Triage-Skripte und -Tests

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 09:19:11 +02:00

64 lines
2.8 KiB
Plaintext

# GerbilManager — Vhost fuer die oeffentliche Webseite (WEB-2)
# ===========================================================
# Einzufuegen in den bestehenden nginx-Reverse-Proxy (TrueNAS-App "ix-webserver"):
# Datei ablegen unter: /mnt/JailStorage/DockerVolumes/nginx/config/gerbil-public.conf
# (das ist der conf.d-Mount des Proxys; dort liegen auch git/cloud/rismer.de)
# Danach: docker exec ix-webserver-webserver-1 nginx -s reload
#
# WICHTIG (containerisierter Proxy): das Backend MUSS ueber die Host-LAN-IP
# angesprochen werden (192.168.2.115), NICHT 127.0.0.1 — 127.0.0.1 waere im
# Proxy-Container er selbst. Der publicsite-Container veroeffentlicht Port 8081
# auf dem Host (PUBLICSITE_PORT in deploy/truenas/.env).
#
# SICHERHEIT: Dieser Vhost zeigt NUR auf den publicsite-Container (statische
# oeffentliche Seite). Der Manager (API + Frontend) bleibt LAN-only und ist von
# aussen NICHT erreichbar (keine Authentifizierung).
#
# <DOMAIN> ersetzen (z. B. rennmaus.rismer.de). DNS-Eintrag auf die oeffentliche
# IP + Router-Weiterleitung 80/443 -> 11080/11443 muss wie bei den anderen
# rismer.de-Subdomains vorhanden sein.
# HTTP: ACME-Challenge zulassen + auf HTTPS umleiten (Muster der anderen Vhosts)
server {
listen 80;
listen [::]:80;
server_name <DOMAIN>;
location /.well-known/acme-challenge/ {
root /usr/share/nginx/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}
# HTTPS: Reverse-Proxy auf den publicsite-Container (Host-Port 8081)
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name <DOMAIN>;
# Let's Encrypt (gleicher Cert-Store wie die uebrigen rismer.de-Vhosts).
# Zertifikat anfordern, z. B.:
# docker exec ix-webserver-webserver-1 certbot --nginx -d <DOMAIN>
# oder webroot: certbot certonly --webroot -w /usr/share/nginx/letsencrypt -d <DOMAIN>
ssl_certificate /etc/letsencrypt/live/<DOMAIN>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<DOMAIN>/privkey.pem;
# HSTS gehoert auf die TLS-terminierende Ebene (hier), nicht in den HTTP-only
# publicsite-Container. Erst aktivieren, wenn HTTPS sicher steht (max-age dann ggf. erhoehen).
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Die uebrigen Security-Header (CSP, X-Content-Type-Options, X-Frame-Options,
# Referrer-Policy, Permissions-Policy) liefert der publicsite-nginx bereits mit und
# werden vom Proxy durchgereicht (siehe nginx/publicsite.conf).
location / {
proxy_pass http://192.168.2.115:8081;
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;
proxy_buffering off; # kleine statische HTML-Seiten
}
}