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>
43 lines
2.1 KiB
Plaintext
43 lines
2.1 KiB
Plaintext
# GerbilManager — publicsite nginx (WEB-2)
|
|
# Serviert die statische oeffentliche Seite aus dem live/-Verzeichnis des Shared Volumes.
|
|
# SICHERHEIT: Kein Proxy auf die API, kein Zugriff auf den Manager.
|
|
#
|
|
# Security-Header (Art. 32 DSGVO — technische Massnahmen): MUESSEN pro location wiederholt
|
|
# werden, da nginx server-weite add_header verwirft, sobald eine location eigene add_header hat.
|
|
# HSTS wird NICHT hier gesetzt (HTTP-only-Container) — sondern am TLS-terminierenden
|
|
# Reverse-Proxy (siehe deploy/truenas/vhost-snippet.conf).
|
|
server {
|
|
listen 80;
|
|
root /usr/share/nginx/html/live;
|
|
index index.html;
|
|
charset utf-8;
|
|
|
|
# Alle Seiten: no-cache (Aenderungen sofort sichtbar nach Veroeffentlichen)
|
|
location / {
|
|
try_files $uri $uri/index.html =404;
|
|
add_header Cache-Control "no-cache, must-revalidate";
|
|
add_header X-Content-Type-Options "nosniff" always;
|
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
add_header Referrer-Policy "no-referrer" always;
|
|
add_header Permissions-Policy "geolocation=(), camera=(), microphone=()" always;
|
|
add_header Content-Security-Policy "default-src 'self'; script-src 'none'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; form-action 'self'" always;
|
|
}
|
|
|
|
# CSS/Bilder: kurze TTL (1 Tag) — Security-Header wiederholen (s. o.)
|
|
location ~* \.(css|png|jpg|jpeg|gif|ico|webp|svg)$ {
|
|
try_files $uri =404;
|
|
expires 1d;
|
|
add_header Cache-Control "public, max-age=86400";
|
|
add_header X-Content-Type-Options "nosniff" always;
|
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
add_header Referrer-Policy "no-referrer" always;
|
|
add_header Permissions-Policy "geolocation=(), camera=(), microphone=()" always;
|
|
add_header Content-Security-Policy "default-src 'self'; script-src 'none'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; form-action 'self'" always;
|
|
}
|
|
|
|
# Kein Zugriff auf Staging-Verzeichnisse
|
|
location ~ ^/_(staging_new|old)/ {
|
|
return 403;
|
|
}
|
|
}
|