Die Containerliste des Servers beantwortet beides. Der NPM-Container hat 172.17.0.3 und liegt damit im Standard-Bridge-Netz, nicht in "web". Meine Vermutung, "web" sei das Proxy-Netz, war falsch — es gilt Weg B ueber den Host, so wie d4rkbot auf 3080 und cdn-files auf 8090 schon laufen. Im README steht das jetzt als Feststellung und nicht mehr als Wahrscheinlichkeit. Und die Ergaenzung wollte ausgerechnet 9000 und 8080 oeffnen — beide vergeben, an Portainer und an nextcloud-aio. Jetzt 9100 und 9101, und ueber MINIO_HOST_PORT und LITE_HOST_PORT einstellbar: die naechste Kollision ist dann eine Variable und keine Dateiaenderung. Im Container bleibt es bei 9000 und 8080; nur die Seite zum Host wandert. Belegt waren: 80, 81, 443, 2224, 3000, 3080, 3478, 8000, 8080, 8090, 8443, 9000, 9443, 11000. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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
- Oberfläche: http://localhost:8080 —
adminund deinADMIN_PASSWORD - MinIO: http://localhost:9001 —
liteund deinMINIO_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:
docker network ls
docker network inspect <name> # zeigt die Mitglieder
Auf diesem Server ist es nicht so: der NPM-Container hat 172.17.0.3 und
liegt damit im Standard-Bridge-Netz, nicht in web. Hier gilt Weg B.
fivecdn.d4rkst3r.de -> http://minio:9000
<oberfläche> -> http://lite:8080
B · Der Proxy erreicht die Dienste über den Host — das ist hier der Fall.
So laufen d4rkbot auf 3080 und cdn-files auf 8090 schon.
docker-compose.yml,docker-compose.hostports.yml
fivecdn.d4rkst3r.de -> http://host.docker.internal:9100
<oberfläche> -> http://host.docker.internal:9101
Nicht 9000 und 8080 — die sind auf diesem Server vergeben (Portainer und
nextcloud-aio). Im Container bleibt es bei 9000 und 8080; nur die Seite zum
Host wandert. Kollidiert später noch etwas, sind es zwei Variablen:
MINIO_HOST_PORT und LITE_HOST_PORT.
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 asciiund nichtutf8— PowerShell 5.1 schreibt sonst ein BOM voran, und dann heißt die erste VariableDB_PASSWORD.Get-Randomwä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.