Betrieb hinter einem vorhandenen Reverse Proxy

Die Adresse, auf der Docker Port 3000 veroeffentlicht, ist ueber
LERNBAR_ADRESSE in .env einstellbar; Vorgabe bleibt 127.0.0.1. Noetig,
wenn der Reverse Proxy - etwa ein Nginx Proxy Manager - auf einem anderen
Rechner laeuft.

Docker-Ports laufen an ufw vorbei. lernbar-portsperre setzt deshalb in
DOCKER-USER eine Regel, die Port 3000 nur fuer den Proxy oeffnet, und
laesst sich beliebig oft ausfuehren (in einem Debian-13-Container
geprueft). Dazu ein systemd-Dienst, der sie nach Docker setzt.

Abschnitt 6b der Betriebsanleitung beschreibt Einrichtung und Proxy-Host.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Florian Wilde
2026-10-08 17:35:31 +02:00
co-authored by Claude Opus 5.5
parent 3009c53b5c
commit ead4cdf195
6 changed files with 100 additions and 5 deletions
+50 -3
View File
@@ -2,7 +2,8 @@
Diese Anleitung führt von einer leeren Proxmox-Umgebung zur laufenden Lern-Bar im
Betriebsnetz: eine virtuelle Maschine mit Debian, darin Docker mit der Lern-Bar und Caddy
als Reverse Proxy mit HTTPS. Rechne mit etwa zwei Stunden.
als Reverse Proxy mit HTTPS – oder, wenn es schon einen Reverse Proxy wie den Nginx Proxy
Manager gibt, dieser (Abschnitt 6b). Rechne mit etwa zwei Stunden.
> **HTTPS ist Pflicht, nicht Kür.** Die Lern-Bar setzt das Anmeldecookie im Betrieb mit dem
> Merkmal `Secure`. Über `http://` nimmt der Browser es nicht an – die Anmeldung scheitert
@@ -17,7 +18,7 @@ als Reverse Proxy mit HTTPS. Rechne mit etwa zwei Stunden.
3. [Grundeinrichtung](#3-grundeinrichtung)
4. [Docker installieren](#4-docker-installieren)
5. [Die Lern-Bar holen und starten](#5-die-lern-bar-holen-und-starten)
6. [HTTPS mit Caddy](#6-https-mit-caddy)
6. [HTTPS mit Caddy](#6-https-mit-caddy) – oder [6b. hinter einem vorhandenen Nginx Proxy Manager](#6b-hinter-einem-vorhandenen-nginx-proxy-manager)
7. [Das erste Konto](#7-das-erste-konto)
8. [Sicherung](#8-sicherung)
9. [Aktualisieren](#9-aktualisieren)
@@ -97,7 +98,7 @@ sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin d
sudo usermod -aG docker "$USER"
```
Prüfen: `docker compose version` zeigt eine Fassung 2.x.
Prüfen: `docker compose version` zeigt eine Fassung 2.x oder neuer.
## 5. Die Lern-Bar holen und starten
@@ -184,6 +185,52 @@ sudo systemctl reload caddy
> Browser ein Zertifikat, dem das Gerät vertraut. Mit Variante B heißt das: Wurzelzertifikat
> auch auf den Diensthandys installieren.
## 6b. Hinter einem vorhandenen Nginx Proxy Manager
Gibt es im Betrieb schon einen Reverse Proxy, der Zertifikate verwaltet – etwa den
Nginx Proxy Manager –, entfällt Caddy auf der VM. Die Lern-Bar muss dann auf der
Adresse der VM lauschen statt nur auf `127.0.0.1`, damit der Proxy sie erreicht.
**1. Lauschadresse einstellen.** In `/opt/lernbar/.env` (die Datei steht in der
`.gitignore`, `update.sh` lässt sie in Ruhe):
```bash
echo "LERNBAR_ADRESSE=10.10.13.200" > /opt/lernbar/.env # Adresse der VM
cd /opt/lernbar && docker compose up -d
```
**2. Port 3000 nur für den Proxy öffnen.** Ports, die Docker veröffentlicht,
laufen an ufw vorbei – ohne diesen Schritt wäre die Lern-Bar für das ganze Netz
unverschlüsselt erreichbar. Die Regel kommt deshalb in Dockers eigene Kette
`DOCKER-USER`:
```bash
sudo install -m 755 /opt/lernbar/scripts/betrieb/lernbar-portsperre.sh /usr/local/sbin/lernbar-portsperre
sudo install -m 644 /opt/lernbar/scripts/betrieb/lernbar-portsperre.service /etc/systemd/system/
sudo sed -i 's/10.10.13.5/<ADRESSE-DES-NPM>/' /etc/systemd/system/lernbar-portsperre.service
sudo systemctl daemon-reload
sudo systemctl enable --now lernbar-portsperre
sudo iptables -S DOCKER-USER # muss die DROP-Regel mit „! -s <ADRESSE-DES-NPM>" zeigen
```
Prüfen: Vom NPM aus antwortet `curl http://10.10.13.200:3000/api/gesundheit`,
von jedem anderen Rechner läuft derselbe Aufruf ins Leere.
**3. Proxy-Host im Nginx Proxy Manager anlegen:**
| Reiter | Einstellung |
|---|---|
| Details | Domain `lernbar.<eure-domäne>`, Scheme `http`, Forward Hostname `10.10.13.200`, Port `3000`, „Block Common Exploits" an |
| SSL | Zertifikat wählen oder anfordern, „Force SSL" und „HTTP/2 Support" an |
| Advanced | `client_max_body_size 30m;` – sonst scheitern Fotos als Anhang |
Der NPM gibt den Host-Namen der Anfrage unverändert weiter. Das ist wichtig: Next.js
prüft bei jedem Formular, ob Herkunft und Host zusammenpassen, und lehnt das
Absenden sonst ab.
Danach weiter mit Abschnitt 7. Abschnitt 6 (Caddy) entfällt, ebenso die Freigabe
von Port 80 und 443 in ufw auf der VM.
## 7. Das erste Konto
```bash