Files
d4rk_media/README.md
T
D4rkst3randClaude Opus 5 90df5c8bb1 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 , 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>
2026-08-11 14:30:36 +02:00

5.1 KiB

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:

cp .env.example .env      # und ausfüllen, siehe unten
docker compose -f docker-compose.local.yml up -d

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:

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:

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:

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: 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.