Dashboard und Metriken standardmäßig von außen erreichbar

Port 8080 wird in podman-compose.yml und in der Quadlet-Einheit auf allen
Interfaces veröffentlicht statt nur auf dem Loopback.

Die Endpunkte sind ausschließlich lesend – über HTTP lässt sich weder handeln
noch etwas konfigurieren –, aber sie sind nicht authentifiziert: Kontostand,
offene Positionen und die Trade-Historie sieht jeder, der den Port erreicht.
Das README nennt deshalb jetzt Reverse Proxy und Firewall als Absicherung, den
einzeiligen Weg zurück zu rein lokalem Zugriff sowie server.enabled: false zum
vollständigen Abschalten.

Geprüft im laufenden Container über die Nicht-Loopback-Adresse des Hosts:
/health, / , /status und /metrics antworten.
This commit is contained in:
Tobias Zimmermann
2026-08-22 11:14:40 +02:00
parent 65ed73977e
commit 35d5c64e5b
3 changed files with 34 additions and 12 deletions
+23 -9
View File
@@ -35,7 +35,7 @@ podman-compose up -d
das OCI-Format kennt die Anweisung nicht. Compose und Quadlet bringen ihren eigenen das OCI-Format kennt die Anweisung nicht. Compose und Quadlet bringen ihren eigenen
Healthcheck mit, dort spielt das Format keine Rolle. Healthcheck mit, dort spielt das Format keine Rolle.
Dashboard: <http://127.0.0.1:8080/> · Logs: `podman-compose logs -f` Dashboard: `http://<host>:8080/` · Logs: `podman-compose logs -f`
Ohne Zugangsdaten läuft der Bot im Paper-Modus auf echten Live-Kursen und beginnt sofort zu Ohne Zugangsdaten läuft der Bot im Paper-Modus auf echten Live-Kursen und beginnt sofort zu
lernen. Für den Start werden nur öffentliche Marktdaten gelesen — kein API-Schlüssel nötig. lernen. Für den Start werden nur öffentliche Marktdaten gelesen — kein API-Schlüssel nötig.
@@ -61,14 +61,28 @@ podman-compose logs -f # verfolgen
podman-compose down # stoppen podman-compose down # stoppen
``` ```
Der Port ist bewusst auf `127.0.0.1:8080` gebunden; das Dashboard ist damit nicht aus dem Port 8080 wird auf allen Interfaces veröffentlicht — das Dashboard ist damit standardmäßig
Netz erreichbar. Für Zugriff von außen einen Reverse Proxy mit Authentifizierung davorsetzen. von anderen Rechnern erreichbar.
> **Windows und macOS.** Dort läuft Podman in einer VM (`podman machine`). Auf Loopback > **Sicherheit.** Alle Endpunkte sind lesend (`GET`, keine Steuerbefehle), aber **nicht
> veröffentlichte Ports bleiben in der VM und erreichen den Host nicht. Zum Testen entweder > authentifiziert**. Wer den Port erreicht, sieht Kontostand, offene Positionen und die
> `podman machine ssh curl -s localhost:8080/health` verwenden oder in > gesamte Trade-Historie. In offenen Netzen deshalb entweder einen Reverse Proxy mit
> `podman-compose.yml` auf `"8080:8080"` umstellen. Auf Linux — dem Ziel für den > Authentifizierung davorsetzen, den Zugriff per Firewall auf bekannte Quell-IPs begrenzen
> Dauerbetrieb — funktioniert die Loopback-Bindung unmittelbar. > oder auf rein lokalen Zugriff zurückstellen:
>
> | Datei | lokal statt offen |
> |------------------------------|----------------------------------|
> | `podman-compose.yml` | `- "127.0.0.1:8080:8080"` |
> | `deploy/trademind.container` | `PublishPort=127.0.0.1:8080:8080`|
>
> Ganz abschalten lässt sich der Server über `server.enabled: false` in der Konfiguration
> oder `trademind run --no-server`; der Container-Healthcheck braucht ihn allerdings.
> **Windows und macOS.** Dort läuft Podman in einer VM (`podman machine`), die
> veröffentlichte Ports nicht in jeder Konstellation an den Host weiterreicht. Ist das
> Dashboard nicht erreichbar, mit `podman machine ssh curl -s localhost:8080/health`
> gegenprüfen — antwortet das, liegt es an der VM-Weiterleitung, nicht am Bot. Auf Linux —
> dem Ziel für den Dauerbetrieb — greift die Veröffentlichung unmittelbar.
### Variante 2 — einzelner Container ### Variante 2 — einzelner Container
@@ -79,7 +93,7 @@ podman run -d --name trademind \
--env-file config/trademind.env \ --env-file config/trademind.env \
-v ./config:/config:ro,Z \ -v ./config:/config:ro,Z \
-v trademind-data:/data:Z \ -v trademind-data:/data:Z \
-p 127.0.0.1:8080:8080 \ -p 8080:8080 \
--security-opt no-new-privileges \ --security-opt no-new-privileges \
trademind:latest trademind:latest
``` ```
+5 -2
View File
@@ -35,8 +35,11 @@ Environment=TRADEMIND_CONFIG=/config/config.yaml
Exec=run --config /config/config.yaml Exec=run --config /config/config.yaml
# Dashboard/Metriken nur auf dem Loopback-Interface # Dashboard und Metriken auf allen Interfaces, also von außen erreichbar.
PublishPort=127.0.0.1:8080:8080 # Die Endpunkte sind lesend, aber unauthentifiziert sie zeigen Kontostand, Positionen
# und Trade-Historie. In offenen Netzen einen Reverse Proxy mit Authentifizierung
# davorsetzen oder hier auf 127.0.0.1:8080:8080 zurückstellen.
PublishPort=8080:8080
# Härtung # Härtung
NoNewPrivileges=true NoNewPrivileges=true
+6 -1
View File
@@ -20,7 +20,12 @@ services:
command: ["run", "--config", "/config/config.yaml"] command: ["run", "--config", "/config/config.yaml"]
ports: ports:
- "127.0.0.1:8080:8080" # Dashboard nur lokal erreichbar # Dashboard und Metriken sind von außen erreichbar (alle Interfaces).
# Die Endpunkte sind lesend, aber unauthentifiziert sie zeigen Kontostand,
# Positionen und Trade-Historie. Nur in vertrauenswürdigen Netzen so betreiben,
# sonst einen Reverse Proxy mit Authentifizierung davorsetzen.
# Wieder auf rein lokalen Zugriff begrenzen: "127.0.0.1:8080:8080"
- "8080:8080"
volumes: volumes:
- ./config:/config:ro,Z # Konfiguration schreibgeschützt hineinreichen - ./config:/config:ro,Z # Konfiguration schreibgeschützt hineinreichen