Proxy-Netzwerk in die compose.yaml aufnehmen

Der app-Service haengt jetzt zusaetzlich im Netzwerk des Reverse Proxy, damit
dieser ihn erreicht. Das stand bisher nur in der lokalen Fassung auf dem
Server und musste nach jedem Pull von Hand nachgezogen werden.

Der Name ist ueber PROXY_NETWORK einstellbar und faellt auf nginx_default
zurueck, wie es Nginx Proxy Manager anlegt. Wer ohne Proxy in Docker
arbeitet, entfernt den Block - der Kommentar sagt, was dann noetig ist.

Dazu ein Hinweis auf eine unauffaellige Falle: Docker Compose deutet ein $ im
Wert als Variable und ersetzt es durch nichts. Ein Passwort mit $ kommt
dadurch gekuerzt an, ohne dass etwas fehlschlaegt.
This commit is contained in:
2026-09-18 16:17:25 +02:00
parent 7876e29b90
commit f19e596ee4
3 changed files with 39 additions and 0 deletions
+6
View File
@@ -1,6 +1,8 @@
# Kopie als .env neben die compose.yaml legen und Werte ersetzen. # Kopie als .env neben die compose.yaml legen und Werte ersetzen.
# Passwort des Datenbank-Nutzers. Lang und zufaellig waehlen. # Passwort des Datenbank-Nutzers. Lang und zufaellig waehlen.
# Achtung: Ein $ im Wert wird von Docker Compose als Variable gedeutet und
# verschluckt. Entweder $ vermeiden oder als $$ schreiben.
DB_PASSWORD=hier-ein-langes-zufaelliges-passwort DB_PASSWORD=hier-ein-langes-zufaelliges-passwort
# Schluessel fuer Sitzungen und CSRF-Token, mindestens 32 Zeichen. # Schluessel fuer Sitzungen und CSRF-Token, mindestens 32 Zeichen.
@@ -15,6 +17,10 @@ BOOTSTRAP_ADMIN_PASSWORD=
# --- Optional --- # --- Optional ---
# Name des Docker-Netzwerks, in dem der Reverse Proxy laeuft. Der Proxy legt es
# an; bei Nginx Proxy Manager heisst es meist nginx_default.
# PROXY_NETWORK=nginx_default
# Adresse der GExtension-Instanz fuer den Paket-Abgleich. Der Parser ist auf # Adresse der GExtension-Instanz fuer den Paket-Abgleich. Der Parser ist auf
# deren Seitenaufbau gebaut; ein anderes Shop-System laesst sich damit nicht # deren Seitenaufbau gebaut; ein anderes Shop-System laesst sich damit nicht
# auslesen. Leer lassen, wenn der Abgleich nicht genutzt wird. # auslesen. Leer lassen, wenn der Abgleich nicht genutzt wird.
+18
View File
@@ -72,6 +72,24 @@ Der App-Port wird bewusst **nicht** nach außen gemappt. Davor gehört ein Rever
(Nginx Proxy Manager, Traefik oder Caddy), der HTTPS terminiert und intern auf `app:3000` (Nginx Proxy Manager, Traefik oder Caddy), der HTTPS terminiert und intern auf `app:3000`
weiterleitet. So ist nur Port 443 offen und die Zertifikate laufen über Let's Encrypt. weiterleitet. So ist nur Port 443 offen und die Zertifikate laufen über Let's Encrypt.
Damit der Proxy die App erreicht, hängt der `app`-Service zusätzlich im Netzwerk des Proxys.
Die `compose.yaml` erwartet es unter dem Namen `nginx_default` — so heißt es bei Nginx Proxy
Manager. Heißt es bei dir anders, setz `PROXY_NETWORK` in der `.env`:
```
PROXY_NETWORK=mein-proxy-netz
```
Das Netzwerk muss existieren, bevor der Stack startet; angelegt wird es vom Proxy. Betreibst du
gar keinen Proxy in Docker, entferne den `networks`-Block am Ende der `compose.yaml` samt der
`networks`-Liste beim `app`-Service und mappe stattdessen einen Port — dann aber bitte HTTPS
anderweitig davorsetzen.
> **Zu `$` in der `.env`:** Docker Compose deutet `$name` als Variable und ersetzt es durch
> nichts, wenn es die Variable nicht gibt. Ein Passwort mit `$` kommt dadurch gekürzt in der App
> an — ohne Fehler, nur mit einer leicht zu übersehenden Warnung. Entweder `$` vermeiden oder
> als `$$` schreiben.
Läuft die App hinter einem Proxy, muss `TRUST_PROXY=true` gesetzt bleiben — sonst landen im Läuft die App hinter einem Proxy, muss `TRUST_PROXY=true` gesetzt bleiben — sonst landen im
Audit-Log die Proxy-IPs statt der echten. In Produktion werden Cookies automatisch auf `Secure` Audit-Log die Proxy-IPs statt der echten. In Produktion werden Cookies automatisch auf `Secure`
gesetzt; nur zum Testen ohne TLS lässt sich das über `COOKIE_SECURE=false` abschalten. gesetzt; nur zum Testen ohne TLS lässt sich das über `COOKIE_SECURE=false` abschalten.
+15
View File
@@ -21,6 +21,9 @@ services:
depends_on: depends_on:
db: db:
condition: service_healthy condition: service_healthy
networks:
- default # App zur Datenbank
- proxy # Reverse Proxy zur App
db: db:
image: postgres:16-alpine image: postgres:16-alpine
@@ -56,5 +59,17 @@ services:
sleep 86400; sleep 86400;
done' done'
networks:
# Das Netzwerk des Reverse Proxy. Es muss bereits existieren - der Proxy
# legt es an, bei Nginx Proxy Manager heisst es meist nginx_default.
# Anderer Name? Dann PROXY_NETWORK in der .env setzen.
#
# Ohne Reverse Proxy in Docker: diesen Block und die networks-Liste beim
# app-Service entfernen und stattdessen einen Port mappen (ports: "3000:3000").
# Dann aber selbst fuer HTTPS sorgen - die App gehoert nicht ungeschuetzt ins Netz.
proxy:
external: true
name: ${PROXY_NETWORK:-nginx_default}
volumes: volumes:
cc_db: cc_db: