diff --git a/.env.example b/.env.example index ea7ff07..e0b6277 100644 --- a/.env.example +++ b/.env.example @@ -26,8 +26,11 @@ APP_GID=1000 # ── Reverse Proxy ───────────────────────────────────────────────────────────── # Nur diesen Adressen wird X-Forwarded-For/-Proto geglaubt. TRUSTED_PROXIES=172.18.0.1 -# Port auf dem Wirt, auf loopback gebunden. Im Container bleibt es 8080. +# 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 # ── Erster Start ────────────────────────────────────────────────────────────── # Legt den Admin an. Danach ADMIN_PASSWORD leeren. diff --git a/README.md b/README.md index 5caec96..d5a0107 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,13 @@ 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. + **`DATA_PATH`** ist ein gewöhnliches Verzeichnis auf dem Wirt, kein Docker-Volume – deshalb kommst du per SFTP, rsync oder im Dateimanager daran. Nur lesend anfassen: Wer von Hand hineinschreibt, hat eine Datei, die die @@ -433,7 +440,7 @@ docker compose --profile office up -d cap_add: [MKNOD] networks: [internal] ports: - - "127.0.0.1:9980:9980" + - "${APP_BIND:-127.0.0.1}:9980:9980" ``` ```env @@ -458,7 +465,7 @@ OFFICE_ALLOWED_HOSTS=office JWT_SECRET: ${OFFICE_JWT_SECRET} networks: [internal] ports: - - "127.0.0.1:9980:80" # OnlyOffice lauscht auf 80, nicht auf 9980 + - "${APP_BIND:-127.0.0.1}:9980:80" # OnlyOffice lauscht auf 80, nicht 9980 ``` ```env @@ -491,7 +498,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: - - "127.0.0.1:9980:80" + - "${APP_BIND:-127.0.0.1}:9980:80" ``` Die `.env` ist dieselbe wie bei OnlyOffice. Rechne mit **5 GB** allein für das diff --git a/TESTING.md b/TESTING.md index be8dbb5..b17cc43 100644 --- a/TESTING.md +++ b/TESTING.md @@ -646,6 +646,29 @@ breiteste. --- +## Erreichbarkeit von außen (24.08.2026) + +`ERR_CONNECTION_REFUSED` beim Zugriff über die IP ist meist kein Fehler, +sondern die Vorgabe: Der Port ist auf `127.0.0.1` gebunden, davor gehört der +Reverse Proxy. Der Kernel lehnt ab, bevor irgendetwas die Anwendung erreicht – +daher „refused" und kein Zeitüberlauf. + +Prüfen: + +```bash +docker ps --format '{{.Names}}\t{{.Ports}}' +# 127.0.0.1:8090->8080/tcp = nur dieser Rechner +# 0.0.0.0:8090->8080/tcp = das ganze Netz +``` + +- [ ] Ohne `APP_BIND` bindet der Port auf `127.0.0.1` 🔎 +- [ ] `APP_BIND=0.0.0.0` bindet auf alle Adressen 🔎 +- [ ] Mit `0.0.0.0` von einem zweiten Gerät im Netz erreichbar +- [ ] Hinter dem Reverse Proxy wieder auf `127.0.0.1` zurückstellen – sonst + steht die Anmeldung unverschlüsselt im Netz + +--- + ## Frische Umgebung nur aus den Beispieldateien (24.08.2026) Der einzige Test, der zählt: `docker-compose.example.yml` + `.env.example` diff --git a/deploy/.env.example b/deploy/.env.example index 5dd2797..9d6a6db 100644 --- a/deploy/.env.example +++ b/deploy/.env.example @@ -32,8 +32,11 @@ DATA_PATH=/pfad/zu/aether-data # `id -u` / `id -g` – sonst gehören die Dateien einem Container-Nutzer. APP_UID=1000 APP_GID=1000 -# Port auf dem Wirt, auf loopback gebunden. +# 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). +# 0.0.0.0 = das ganze Netz – dann unverschlüsselt. +APP_BIND=127.0.0.1 # ── Erster Start ────────────────────────────────────────────────────────────── # Legt den Admin an. Danach ADMIN_PASSWORD leeren. diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index 7e102f9..1ba6f4e 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -34,8 +34,10 @@ services: - ${DATA_PATH:-./data}:/data networks: [internal] ports: - # Nur loopback. TLS und Domain gehören auf den Reverse Proxy des Wirts. - - "127.0.0.1:${APP_PORT:-8080}:8080" + # 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" postgres: container_name: aether-db @@ -75,7 +77,7 @@ services: - "host.docker.internal:host-gateway" networks: [internal] ports: - - "127.0.0.1:${OFFICE_PORT:-9980}:9980" + - "${APP_BIND:-127.0.0.1}:${OFFICE_PORT:-9980}:9980" volumes: postgres_data: diff --git a/docker-compose.example.yml b/docker-compose.example.yml index 07f9320..4ef7055 100644 --- a/docker-compose.example.yml +++ b/docker-compose.example.yml @@ -38,8 +38,10 @@ services: - ${DATA_PATH:-./data}:/data networks: [internal] ports: - # Nur loopback. TLS und Domain gehören auf deinen Reverse Proxy. - - "127.0.0.1:${APP_PORT:-8080}:8080" + # 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" postgres: container_name: aether-db