From 9c690c46b97bc1eb1e2e92d5d9da2b7303949d62 Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Tue, 11 Aug 2026 14:30:36 +0200 Subject: [PATCH] fix: das externe Netz war fest verdrahtet und existierte nicht MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "network proxy declared as external, but could not be found". Die Hauptdatei verlangte ein externes Netz namens proxy, das es auf diesem Server gar nicht gibt — und die Ergaenzung fuer host.docker.internal half nicht, weil die Basis es trotzdem forderte. Das war die falsche Reihenfolge: der Weg nach aussen ist gerade das, was sich je Aufbau unterscheidet, und gehoert damit nicht in die Basis. Jetzt ist docker-compose.yml neutral — von aussen nicht erreichbar, und das ausdruecklich. Dazu waehlt man eine von zwei Ergaenzungen: docker-compose.proxynet.yml Proxy haengt im selben Netz (http://minio:9000) docker-compose.hostports.yml Proxy geht ueber den Host Die Netzliste dieses Servers zeigt kein "proxy", aber ein "web" — ein Bridge-Netz ohne Stack, also die uebliche Konvention fuer einen Reverse Proxy. PROXY_NETWORK steht deshalb auf "web", mit dem Hinweis, es nachzusehen statt zu glauben. Co-Authored-By: Claude Opus 5 --- .env.example | 9 ++++++++- README.md | 40 +++++++++++++++++++++++++------------ docker-compose.proxynet.yml | 35 ++++++++++++++++++++++++++++++++ docker-compose.yml | 25 ++++++++++++----------- 4 files changed, 83 insertions(+), 26 deletions(-) create mode 100644 docker-compose.proxynet.yml diff --git a/.env.example b/.env.example index cce478c..a365087 100644 --- a/.env.example +++ b/.env.example @@ -21,4 +21,11 @@ ADMIN_PASSWORD= PUBLIC_URL=https://fivecdn.d4rkst3r.de # Das Docker-Netz, in dem der bestehende Reverse Proxy haengt. -PROXY_NETWORK=proxy +# +# Wird NUR gebraucht, wenn du docker-compose.proxynet.yml dazunimmst. Beim Weg +# ueber host.docker.internal (docker-compose.hostports.yml) ist es +# gegenstandslos. +# +# `docker network ls` zeigt die Namen. Auf diesem Server heisst es +# wahrscheinlich `web` — ein Bridge-Netz ohne Stack. +PROXY_NETWORK=web diff --git a/README.md b/README.md index 6114575..c84b95c 100644 --- a/README.md +++ b/README.md @@ -44,25 +44,39 @@ Die Werte gehören **in die Stack-Variablen**, nicht in eine Datei im Repo. ### Wie der Reverse Proxy die Dienste erreicht -Zwei Wege, und welcher gilt, hängt daran, wie dein NPM aufgesetzt ist. +`docker-compose.yml` allein ist von außen **nicht erreichbar** — das ist +Absicht. Wie der Proxy die Dienste findet, hängt am Aufbau, also wählst du eine +Ergänzung dazu. In Portainer beide Pfade unter *Compose path*, mit Komma: -**A · NPM hängt im selben Docker-Netz** — der saubere Weg. Kein Port muss -offen sein. +**A · Der Proxy hängt im selben Docker-Netz** — der sauberere Weg, kein Port +muss offen sein. + +``` +docker-compose.yml,docker-compose.proxynet.yml +``` + +Dazu `PROXY_NETWORK` auf den Namen des Netzes setzen, in dem der Proxy hängt. +Welches das ist, zeigt Portainer unter *Networks* oder: + +```bash +docker network ls +docker network inspect # zeigt die Mitglieder +``` + +Auf diesem Server heißt es aller Wahrscheinlichkeit nach **`web`** — ein +Bridge-Netz ohne Stack. Nachsehen lohnt trotzdem: steht der Proxy nicht drin, +ist es der falsche Weg. ``` fivecdn.d4rkst3r.de -> http://minio:9000 -> http://lite:8080 ``` -Dafür muss NPM im Netz aus `PROXY_NETWORK` hängen. `docker network ls` zeigt -die Namen, `docker network inspect ` die Mitglieder. - -**B · NPM erreicht die Dienste über den Host** — so laufen Bot und Hub hier -schon, mit `http://host.docker.internal:3080`. Dann braucht es offene Ports, -und dafür gibt es die Ergänzung: +**B · Der Proxy erreicht die Dienste über den Host** — so laufen Bot und Hub +hier schon, mit `http://host.docker.internal:3080`. ``` -Compose path: docker-compose.yml,docker-compose.hostports.yml +docker-compose.yml,docker-compose.hostports.yml ``` ``` @@ -71,8 +85,8 @@ fivecdn.d4rkst3r.de -> http://host.docker.internal:9000 ``` Die Ports sind an `127.0.0.1` gebunden, also vom Internet aus zu. Ob -`host.docker.internal` das erreicht, hängt an der Docker-Fassung — steht in -`docker-compose.hostports.yml` erklärt. +`host.docker.internal` das erreicht, hängt an der Docker-Fassung — in +`docker-compose.hostports.yml` steht, was dann zu tun ist. --- @@ -85,7 +99,7 @@ kommt später und woanders her: aus der laufenden Lite-Oberfläche. ```powershell function New-Secret([int]$n){ $b = New-Object byte[] $n; [System.Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($b); ($b | ForEach-Object { $_.ToString('x2') }) -join '' } -@("DB_PASSWORD=$(New-Secret 16)","MINIO_ROOT_PASSWORD=$(New-Secret 16)","API_TOKEN_HMAC_SECRET=$(New-Secret 32)","ADMIN_PASSWORD=$(New-Secret 12)","PUBLIC_URL=https://fivecdn.d4rkst3r.de","PROXY_NETWORK=proxy") | Set-Content -Encoding ascii .env +@("DB_PASSWORD=$(New-Secret 16)","MINIO_ROOT_PASSWORD=$(New-Secret 16)","API_TOKEN_HMAC_SECRET=$(New-Secret 32)","ADMIN_PASSWORD=$(New-Secret 12)","PUBLIC_URL=https://fivecdn.d4rkst3r.de","PROXY_NETWORK=web") | Set-Content -Encoding ascii .env ``` Zwei Fallen stecken darin, beide schon hineingetreten: diff --git a/docker-compose.proxynet.yml b/docker-compose.proxynet.yml new file mode 100644 index 0000000..da801fa --- /dev/null +++ b/docker-compose.proxynet.yml @@ -0,0 +1,35 @@ +# Ergaenzung fuer einen Reverse Proxy, der IM SELBEN Docker-Netz haengt. +# +# Der sauberere der beiden Wege: kein Port muss auf dem Host offen sein, der +# Proxy spricht die Container direkt an. +# +# docker compose -f docker-compose.yml -f docker-compose.proxynet.yml up -d +# +# In Portainer unter "Compose path", durch Komma getrennt: +# docker-compose.yml,docker-compose.proxynet.yml +# +# VORAUSSETZUNG: das Netz muss es schon geben, und der Proxy muss darin +# haengen. Nachsehen: +# +# docker network ls +# docker network inspect zeigt die Mitglieder +# +# Haengt der Proxy nirgends mit drin, ist das hier der falsche Weg — dann +# docker-compose.hostports.yml nehmen. Ein Netz anzulegen, in dem nur diese +# Container sitzen, bringt nichts: der Proxy muesste mit hinein. +# +# Danach in NPM: +# fivecdn.d4rkst3r.de -> http://minio:9000 +# -> http://lite:8080 + +services: + minio: + networks: [internal, proxy] + + lite: + networks: [internal, proxy] + +networks: + proxy: + name: ${PROXY_NETWORK:-proxy} + external: true diff --git a/docker-compose.yml b/docker-compose.yml index 6c07f56..ca15dfe 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,10 +12,17 @@ # das Ablegen von Bildern braucht es sie nicht, und ClickHouse ist eine # schwere Abhaengigkeit. Nachruesten geht spaeter. # -# Offene Ports. Nur der Reverse Proxy spricht mit der App; Datenbank und -# MinIO bleiben im internen Netz. Zum Ausprobieren gibt es -# docker-compose.local.yml — die macht es andersherum, und dort ist es -# richtig. +# Ein Weg nach aussen. Diese Datei allein ist von aussen NICHT erreichbar — +# das ist Absicht, denn wie der Reverse Proxy die Dienste findet, +# unterscheidet sich je Aufbau. Waehle eine Ergaenzung: +# +# docker-compose.hostports.yml Proxy erreicht die Dienste ueber den Host +# (http://host.docker.internal:9000) +# docker-compose.proxynet.yml Proxy haengt im selben Docker-Netz +# (http://minio:9000) — der sauberere Weg +# +# In Portainer beide Pfade angeben, durch Komma getrennt: +# docker-compose.yml,docker-compose.hostports.yml services: db: @@ -47,7 +54,7 @@ services: MINIO_SERVER_URL: ${PUBLIC_URL:?bitte setzen} volumes: - minio:/data - networks: [internal, proxy] + networks: [internal] healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 10s @@ -99,17 +106,11 @@ services: AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:?bitte setzen} AWS_BUCKET: media AWS_REGION: auto - networks: [internal, proxy] - # KEIN ports: — der Reverse Proxy erreicht die App ueber das Netz `proxy`. - # Wer hier 8080 aufmacht, hat die Oberflaeche ohne TLS im Internet. + networks: [internal] networks: internal: driver: bridge - proxy: - # Das Netz, in dem der bestehende Reverse Proxy haengt. - name: ${PROXY_NETWORK:-proxy} - external: true volumes: db: