docs: Nginx Proxy Manager als erste Proxy-Variante

Die Werte, die in der Oberflaeche einzutragen sind, Feld fuer Feld -
Details, SSL und Advanced. Steht vorn, weil es der Fall ist, der hier
tatsaechlich laeuft.

Drei Punkte, die man in der Oberflaeche nicht sieht und die sonst Zeit
kosten:

- Scheme ist http, nicht https. Die Anwendung beendet kein TLS.
- HSTS bleibt in NPM aus - die Anwendung setzt den Kopf bereits selbst,
  sonst geht er zweimal raus.
- Die vier proxy_set_header gehoeren NICHT ins Advanced-Feld. NPM setzt
  sie schon, und zwar im location-Block; ein zweiter Satz laege auf
  server-Ebene und wuerde ueberschrieben. Wer sie trotzdem eintraegt,
  sucht spaeter an der falschen Stelle.

Ins Advanced-Feld gehoeren nur die Werte, die die Oberflaeche nicht
abbildet: Uploadgroesse, Zeitgrenzen und das Abschalten der Pufferung
fuer den Vollexport.

Etappe: 8
Phase: Haertung
This commit is contained in:
Florian Wilde
2026-08-22 11:27:43 +02:00
parent c35fc16133
commit 7633603a2a
+72
View File
@@ -420,6 +420,78 @@ docker compose ps # unter PORTS muss die neue Adresse stehen
Das ist der Teil, den du auf dem **anderen** Server einträgst. Ersetz Das ist der Teil, den du auf dem **anderen** Server einträgst. Ersetz
`10.0.0.5` durch die Adresse aus 7a. `10.0.0.5` durch die Adresse aus 7a.
Vier Varianten, je nachdem was bei dir läuft: [Nginx Proxy Manager](#nginx-proxy-manager), [Caddy](#caddy), [nginx von Hand](#nginx) oder [Traefik](#traefik).
#### Nginx Proxy Manager
In der Oberfläche: **Hosts → Proxy Hosts → Add Proxy Host**.
**Reiter „Details"**
| Feld | Wert |
|---|---|
| Domain Names | `cockpit.deine-domain.de` |
| Scheme | `http` — nicht https. Die Anwendung beendet kein TLS |
| Forward Hostname / IP | die Adresse aus 7a, z. B. `10.0.0.5` |
| Forward Port | `3000` (oder dein `APP_PORT`) |
| Cache Assets | **aus** |
| Block Common Exploits | an |
| Websockets Support | an |
| Access List | leer lassen — die Anwendung hat eine eigene Anmeldung mit Pflicht-Zweitfaktor |
Zu **Cache Assets**: Next.js hängt an jede Skript- und Stildatei einen
Prüfsummen-Namen, ein Zwischenspeicher bringt hier also nichts. Aus bleibt
er, damit nach einem Update niemand rätselt, ob er noch eine alte Fassung
sieht.
**Reiter „SSL"**
| Feld | Wert |
|---|---|
| SSL Certificate | *Request a new SSL Certificate* (Let's Encrypt) |
| Force SSL | **an** |
| HTTP/2 Support | an |
| HSTS Enabled | **aus** |
| HSTS Subdomains | aus |
`HSTS Enabled` bleibt aus, weil die Anwendung den Kopf
`Strict-Transport-Security` bereits selbst setzt — sonst schickt der Server
ihn zweimal.
**Reiter „Advanced"**
Hier kommt der Teil hinein, den die Oberfläche nicht abbildet. Genau
dieser Block:
```nginx
# Fotos mehrseitiger Bescheide sind schnell 10 MB.
client_max_body_size 30M;
# Belegmappe, Rechnungslegung und Vollexport brauchen länger als die
# üblichen 60 Sekunden. Ohne diese Werte bricht der Download mittendrin ab.
proxy_connect_timeout 30s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
# Der Vollexport kommt als Strom. Puffert der Proxy, wartet der Browser,
# bis alles im Speicher des Proxys liegt - und läuft dabei in die Zeitgrenze.
proxy_buffering off;
proxy_request_buffering off;
```
Dann **Save**.
**Was du NICHT eintragen musst:** `proxy_set_header` für `Host`,
`X-Real-IP`, `X-Forwarded-For` und `X-Forwarded-Proto`. Nginx Proxy Manager
setzt diese vier bereits selbst, und zwar im `location`-Block — ein
zweiter Satz im Advanced-Feld läge auf `server`-Ebene und würde ohnehin
überschrieben. Trag sie nicht ein, sonst suchst du später an der falschen
Stelle.
**Wenn du eine `Access List` benutzt:** Sie sperrt auch `/api/wartung` aus.
Entweder du lässt sie weg, oder du trägst die IP des Servers ein, von dem
der cron-Eintrag aus Schritt 10 kommt.
#### Caddy #### Caddy
```caddyfile ```caddyfile