'network proxy declared as external, but could not be found'. Die Hauptdatei verlangte ein externes Netz , 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 , aber ein — ein Bridge-Netz ohne Stack, also die uebliche Konvention fuer einen Reverse Proxy. PROXY_NETWORK steht deshalb auf , mit dem Hinweis, es nachzusehen statt zu glauben. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
150 lines
5.1 KiB
Markdown
150 lines
5.1 KiB
Markdown
# d4rk_media
|
||
|
||
Der Medien-Stack: **Fivemanage Lite** mit MySQL und MinIO. Ein Ablageort für
|
||
alle Resourcen — Fahrzeugbilder aus `d4rk_photostudio`, Item-Icons, Marken,
|
||
was sonst noch anfällt.
|
||
|
||
Bisher liegt das auf dem Nextcloud und wird per rclone von Hand hochgeladen.
|
||
Das trägt, solange ein Mensch hochlädt. Sobald ein Script es tun soll, fehlt
|
||
ein Schreibweg über HTTP — und genau den bringt Lite mit, samt Token je
|
||
Resource und einer Oberfläche zum Nachsehen.
|
||
|
||
---
|
||
|
||
## Ausprobieren, bevor es auf den Server geht
|
||
|
||
`0.1.0-beta.23` ist früh. Erst auf Docker Desktop:
|
||
|
||
```bash
|
||
cp .env.example .env # und ausfüllen, siehe unten
|
||
docker compose -f docker-compose.local.yml up -d
|
||
```
|
||
|
||
- Oberfläche: <http://localhost:8080> — `admin` und dein `ADMIN_PASSWORD`
|
||
- MinIO: <http://localhost:9001> — `lite` und dein `MINIO_ROOT_PASSWORD`
|
||
|
||
Wenn das trägt, dasselbe auf dem Server.
|
||
|
||
---
|
||
|
||
## Auf dem Server, über Portainer
|
||
|
||
Portainer kann einen Stack direkt aus diesem Repo ziehen:
|
||
|
||
**Stacks → Add stack → Repository**
|
||
|
||
| Feld | Wert |
|
||
|---|---|
|
||
| Repository URL | `https://git.d4rkst3r.de/D4rkst3r/d4rk_media` |
|
||
| Compose path | `docker-compose.yml` |
|
||
| Environment variables | die vier Geheimnisse plus `PUBLIC_URL` |
|
||
|
||
Die Werte gehören **in die Stack-Variablen**, nicht in eine Datei im Repo.
|
||
`.env` steht deshalb in `.gitignore`.
|
||
|
||
### Wie der Reverse Proxy die Dienste erreicht
|
||
|
||
`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 · 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
|
||
```
|
||
|
||
**B · Der Proxy erreicht die Dienste über den Host** — so laufen Bot und Hub
|
||
hier schon, mit `http://host.docker.internal:3080`.
|
||
|
||
```
|
||
docker-compose.yml,docker-compose.hostports.yml
|
||
```
|
||
|
||
```
|
||
fivecdn.d4rkst3r.de -> http://host.docker.internal:9000
|
||
<oberfläche> -> http://host.docker.internal:8080
|
||
```
|
||
|
||
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 — in
|
||
`docker-compose.hostports.yml` steht, was dann zu tun ist.
|
||
|
||
---
|
||
|
||
## Die vier Geheimnisse
|
||
|
||
Sie werden **erzeugt**, nicht irgendwo abgeholt. Das Token für die Resourcen
|
||
kommt später und woanders her: aus der laufenden Lite-Oberfläche.
|
||
|
||
**PowerShell** — schreibt die fertige `.env`:
|
||
|
||
```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=web") | Set-Content -Encoding ascii .env
|
||
```
|
||
|
||
Zwei Fallen stecken darin, beide schon hineingetreten:
|
||
|
||
- `RandomNumberGenerator::Create()` und **nicht** `::Fill` — letzteres gibt es
|
||
erst ab .NET 6, Windows PowerShell 5.1 kennt es nicht.
|
||
- `-Encoding ascii` und **nicht** `utf8` — PowerShell 5.1 schreibt sonst ein
|
||
BOM voran, und dann heißt die erste Variable `DB_PASSWORD`.
|
||
- `Get-Random` wäre die naheliegende Wahl und die falsche: es ist nicht
|
||
kryptografisch sicher, und hier wird ein Token-Signaturgeheimnis erzeugt.
|
||
|
||
**Bash / Linux:**
|
||
|
||
```bash
|
||
printf 'DB_PASSWORD=%s
|
||
MINIO_ROOT_PASSWORD=%s
|
||
API_TOKEN_HMAC_SECRET=%s
|
||
ADMIN_PASSWORD=%s
|
||
PUBLIC_URL=https://fivecdn.d4rkst3r.de
|
||
PROXY_NETWORK=proxy
|
||
' "$(openssl rand -hex 16)" "$(openssl rand -hex 16)" "$(openssl rand -hex 32)" "$(openssl rand -hex 12)" > .env
|
||
```
|
||
|
||
---
|
||
|
||
## Was hier bewusst fehlt
|
||
|
||
**ClickHouse und Jaeger.** Beide stehen in der Entwicklungs-Compose des
|
||
Projekts und sind für strukturiertes Logging und Tracing da. Zum Ablegen von
|
||
Bildern braucht es sie nicht, und ClickHouse ist eine schwere Abhängigkeit.
|
||
Nachrüsten geht jederzeit — die App findet sie über `CLICKHOUSE_*`.
|
||
|
||
**Offene Ports in der Betriebsfassung.** Nur der Reverse Proxy spricht mit der
|
||
App; Datenbank und MinIO bleiben im internen Netz. Die Entwicklungs-Compose des
|
||
Projekts macht 5432, 9000, 16686 und mehr auf — dort in Ordnung, hier nicht.
|
||
|
||
---
|
||
|
||
## Herkunft
|
||
|
||
Zusammengestellt aus [fivemanage/lite](https://github.com/fivemanage/lite):
|
||
dessen `README.md`, `deployments/docker-compose.yml` (Entwicklung, ohne die
|
||
App) und `deployments/docker-compose.test.yml` (zeigt die App-Verdrahtung und
|
||
dass MySQL genügt).
|
||
|
||
**Nicht laufen gelassen.** Rechne mit ein, zwei Anläufen — vor allem beim
|
||
ersten Login und beim Bucket.
|