Files
d4rk_media/README.md
T
D4rkst3randClaude Opus 5 c5b66b466a fix: an alle Adressen binden, sonst erreicht NPM die Dienste nicht
Ich hatte die Ports an 127.0.0.1 gebunden — enger und auf den ersten Blick
richtiger. Nur erreicht host.docker.internal das auf diesem Server nicht: die
Anfrage kommt aus dem NPM-Container ueber die Docker-Bruecke herein, nicht
ueber Loopback, und ein an 127.0.0.1 gebundener Port nimmt sie nicht an.

Der Beleg stand die ganze Zeit in der Containerliste: d4rkbot (3080),
cdn-files (8090) und portainer sind alle ohne 127.0.0.1-Praefix
veroeffentlicht, und NPM erreicht sie. So laeuft es hier, also laeuft es so.

Damit macht die FIREWALL den Port zu und nicht die Bindung — das steht jetzt
ausdruecklich in beiden Dateien, mitsamt den Befehlen zum Nachsehen. Wer weiss,
dass Loopback bei ihm erreicht wird, setzt BIND_ADDR=127.0.0.1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 14:37:14 +02:00

160 lines
5.6 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 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 **alle Adressen** gebunden, weil `host.docker.internal` auf
diesem Server über die Docker-Brücke kommt und ein `127.0.0.1`-Port die
Anfrage nicht annähme — dieselbe Bindung, mit der `d4rkbot` und `cdn-files`
schon laufen.
**Damit macht die Firewall den Port zu, nicht die Bindung.** 9100 und 9101
gehören von außen dicht; öffentlich erreichbar soll nur NPM auf 80 und 443
sein. Wer weiß, dass Loopback bei ihm erreicht wird, setzt
`BIND_ADDR=127.0.0.1`.
---
## 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.