From 86da97542439e892efd32eecf47fc093aa60e744 Mon Sep 17 00:00:00 2001 From: marc Date: Wed, 2 Sep 2026 17:06:29 +0200 Subject: [PATCH] =?UTF-8?q?config:=200.0.0.0=20als=20Vorgabe=20f=C3=BCr=20?= =?UTF-8?q?APP=5FBIND=20im=20Betrieb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Auf Marcs Wunsch. Die bisherige Vorgabe 127.0.0.1 passt nur, wenn der Reverse Proxy auf demselben Rechner läuft – steht er woanders (bei Marc auf einem VPS), kommt er an loopback gar nicht heran, und die Vorgabe war schlicht der falsche Wert für den häufigeren Fall. Der Preis steht jetzt an allen drei Stellen dabei, statt nur gemeint zu sein: Der Port ist dann auch aus dem eigenen Netz offen, und TLS endet erst am Proxy. Im README dazu eine Tabelle, welcher Wert zu welchem Aufbau gehört – eigener Rechner, anderer Rechner, Tunnel, oder Proxy im selben Docker-Netz (dann braucht es gar kein ports:). build/docker-compose.yml behält 127.0.0.1: Das ist die Entwicklungsumgebung auf diesem Rechner, dort ist loopback richtig. Gegengeprüft: Frische Kopie aus den Beispieldateien veröffentlicht auf 0.0.0.0; APP_BIND=127.0.0.1 in der .env engt wieder auf loopback ein. Co-Authored-By: Claude Opus 5 --- .env.example | 14 +++++++++++--- README.md | 33 ++++++++++++++++++++++++--------- docker-compose.example.yml | 10 ++++++---- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/.env.example b/.env.example index d9874d9..d387d02 100644 --- a/.env.example +++ b/.env.example @@ -52,9 +52,17 @@ ADMIN_PASSWORD= TRUSTED_PROXIES=172.18.0.1 # Port auf dem Wirt. Im Container bleibt es 8080. APP_PORT=8080 -# Wer den Port erreichen darf. 127.0.0.1 = nur dieser Rechner (Vorgabe, davor -# gehört der Proxy). 0.0.0.0 = das ganze Netz – dann unverschlüsselt. -APP_BIND=127.0.0.1 +# Wer den Port erreichen darf. +# 0.0.0.0 alles, was den Server im Netz erreicht (Vorgabe) +# 127.0.0.1 nur dieser Rechner – richtig, wenn der Reverse Proxy hier läuft +# 10.0.0.5 eine bestimmte Adresse, etwa das Ende eines WireGuard-Tunnels +# +# Die Vorgabe ist 0.0.0.0, weil der Proxy typischerweise woanders steht und +# 127.0.0.1 ihn gar nicht erst herankommen ließe. Der Preis: Der Port ist auch +# aus dem eigenen Netz offen, und TLS endet erst am Proxy – bis dahin liegt die +# Anmeldung unverschlüsselt im Netz. Wer den Proxy auf demselben Rechner hat, +# setzt hier 127.0.0.1 und ist besser dran. +APP_BIND=0.0.0.0 APP_LISTEN_ADDR=:8080 # im Container; der Proxy leitet hierher # ══ Sitzung ═══════════════════════════════════════════════════════════════════ diff --git a/README.md b/README.md index e92f9e4..000a6cd 100644 --- a/README.md +++ b/README.md @@ -235,12 +235,27 @@ selbst anlegst (PocketID, Authentik); bei freier Registrierung wäre es die Übernahme fremder Konten. Verbunden wird ohnehin nur, was noch keine Bindung hat. -**`APP_BIND`** entscheidet, wer den Port überhaupt erreicht. Die Vorgabe -`127.0.0.1` heißt: **nur dieser Rechner.** Von einem anderen Gerät kommt dann -kein Zeitüberlauf, sondern sofort `ERR_CONNECTION_REFUSED` – der Kernel lehnt -ab, bevor irgendetwas die Anwendung erreicht. Das ist Absicht: Davor gehört -dein Reverse Proxy mit TLS. Zum Ausprobieren im eigenen Netz `APP_BIND=0.0.0.0` -setzen – dann geht die Anmeldung allerdings unverschlüsselt über das Netz. +**`APP_BIND`** entscheidet, wer den Port überhaupt erreicht. Der richtige Wert +hängt davon ab, **wo dein Reverse Proxy steht:** + +| Proxy läuft … | Wert | +|---|---| +| auf einem anderen Rechner (VPS, Router) | `0.0.0.0` – die Vorgabe | +| hinter einem Tunnel (WireGuard, Tailscale) | die Tunnel-Adresse, z. B. `10.0.0.5` | +| auf demselben Rechner | `127.0.0.1` | +| als Container im selben Docker-Netz | dann braucht es `ports:` gar nicht – der Proxy erreicht `app:8080` intern | + +`127.0.0.1` heißt **nur dieser Rechner**: Von einem anderen Gerät kommt kein +Zeitüberlauf, sondern sofort `ERR_CONNECTION_REFUSED` – der Kernel lehnt ab, +bevor irgendetwas die Anwendung erreicht. Wer den Proxy daneben stehen hat, +sollte genau das nehmen. + +Die Vorgabe ist trotzdem `0.0.0.0`, weil der häufigere Fall ein Proxy auf einem +anderen Rechner ist, den loopback gar nicht erst herankommen ließe. Was das +kostet, damit es niemanden überrascht: Der Port ist dann auch aus dem eigenen +Netz offen, und **TLS endet erst am Proxy** – auf dem Weg dorthin liegt die +Anmeldung unverschlüsselt im Netz. Wer das nicht will, engt den Wert ein oder +lässt nur den Proxy durch die Firewall. **`DATA_PATH`** ist ein gewöhnliches Verzeichnis auf dem Wirt, kein Docker-Volume – deshalb kommst du per SFTP, rsync oder im Dateimanager daran. @@ -558,7 +573,7 @@ entsteht der Container dann nie, ohne jede Fehlermeldung. cap_add: [MKNOD] networks: [internal] ports: - - "${APP_BIND:-127.0.0.1}:9980:9980" + - "${APP_BIND:-0.0.0.0}:9980:9980" ``` ```env @@ -606,7 +621,7 @@ OFFICE_ALLOWED_HOSTS=office JWT_SECRET: ${OFFICE_JWT_SECRET} networks: [internal] ports: - - "${APP_BIND:-127.0.0.1}:9980:80" # OnlyOffice lauscht auf 80, nicht 9980 + - "${APP_BIND:-0.0.0.0}:9980:80" # OnlyOffice lauscht auf 80, nicht 9980 ``` ```env @@ -638,7 +653,7 @@ heißen gleich. Für uns ist es deshalb **derselbe Anbieter** – ALLOW_PRIVATE_IP_ADDRESS: "true" # es muss app:8080 erreichen networks: [internal] ports: - - "${APP_BIND:-127.0.0.1}:9980:80" + - "${APP_BIND:-0.0.0.0}:9980:80" ``` Die `.env` ist dieselbe wie bei OnlyOffice. Rechne mit **5 GB** allein für das diff --git a/docker-compose.example.yml b/docker-compose.example.yml index 984d255..cba1e28 100644 --- a/docker-compose.example.yml +++ b/docker-compose.example.yml @@ -41,10 +41,12 @@ services: - ${DATA_PATH:-./data}:/data networks: [internal] ports: - # Standardmäßig nur loopback – davor gehört dein Reverse Proxy mit TLS. - # Zum Ausprobieren im LAN: APP_BIND=0.0.0.0 in der .env. Dann liegt die - # Anmeldung allerdings unverschlüsselt im Netz. - - "${APP_BIND:-127.0.0.1}:${APP_PORT:-8080}:8080" + # Vorgabe 0.0.0.0: erreichbar für alles, was den Server im Netz sieht – + # denn der Reverse Proxy steht meist auf einem anderen Rechner, und + # loopback ließe ihn nicht heran. Davor gehört er trotzdem, mit TLS. + # Läuft er auf DIESEM Rechner: APP_BIND=127.0.0.1 in der .env, dann ist + # der Port von außen dicht. + - "${APP_BIND:-0.0.0.0}:${APP_PORT:-8080}:8080" postgres: container_name: aether-db