fix: das externe Netz war fest verdrahtet und existierte nicht

"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 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 14:31:05 +02:00
co-authored by Claude Opus 5
parent 44822e2831
commit 9c690c46b9
4 changed files with 83 additions and 26 deletions
+27 -13
View File
@@ -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 <name> # 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
<oberfläche> -> http://lite:8080
```
Dafür muss NPM im Netz aus `PROXY_NETWORK` hängen. `docker network ls` zeigt
die Namen, `docker network inspect <name>` 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: