From 35d5c64e5b58ac2cb52220dcd635ec89be187e91 Mon Sep 17 00:00:00 2001 From: Tobias Zimmermann Date: Sat, 22 Aug 2026 11:14:40 +0200 Subject: [PATCH] =?UTF-8?q?Dashboard=20und=20Metriken=20standardm=C3=A4?= =?UTF-8?q?=C3=9Fig=20von=20au=C3=9Fen=20erreichbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- README.md | 32 +++++++++++++++++++++++--------- deploy/trademind.container | 7 +++++-- podman-compose.yml | 7 ++++++- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 6034380..ac1c2aa 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ podman-compose up -d das OCI-Format kennt die Anweisung nicht. Compose und Quadlet bringen ihren eigenen Healthcheck mit, dort spielt das Format keine Rolle. -Dashboard: · Logs: `podman-compose logs -f` +Dashboard: `http://:8080/` · Logs: `podman-compose logs -f` 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. @@ -61,14 +61,28 @@ podman-compose logs -f # verfolgen podman-compose down # stoppen ``` -Der Port ist bewusst auf `127.0.0.1:8080` gebunden; das Dashboard ist damit nicht aus dem -Netz erreichbar. Für Zugriff von außen einen Reverse Proxy mit Authentifizierung davorsetzen. +Port 8080 wird auf allen Interfaces veröffentlicht — das Dashboard ist damit standardmäßig +von anderen Rechnern erreichbar. -> **Windows und macOS.** Dort läuft Podman in einer VM (`podman machine`). Auf Loopback -> veröffentlichte Ports bleiben in der VM und erreichen den Host nicht. Zum Testen entweder -> `podman machine ssh curl -s localhost:8080/health` verwenden oder in -> `podman-compose.yml` auf `"8080:8080"` umstellen. Auf Linux — dem Ziel für den -> Dauerbetrieb — funktioniert die Loopback-Bindung unmittelbar. +> **Sicherheit.** Alle Endpunkte sind lesend (`GET`, keine Steuerbefehle), aber **nicht +> authentifiziert**. Wer den Port erreicht, sieht Kontostand, offene Positionen und die +> gesamte Trade-Historie. In offenen Netzen deshalb entweder einen Reverse Proxy mit +> Authentifizierung davorsetzen, den Zugriff per Firewall auf bekannte Quell-IPs begrenzen +> 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 @@ -79,7 +93,7 @@ podman run -d --name trademind \ --env-file config/trademind.env \ -v ./config:/config:ro,Z \ -v trademind-data:/data:Z \ - -p 127.0.0.1:8080:8080 \ + -p 8080:8080 \ --security-opt no-new-privileges \ trademind:latest ``` diff --git a/deploy/trademind.container b/deploy/trademind.container index 28965c7..374796e 100644 --- a/deploy/trademind.container +++ b/deploy/trademind.container @@ -35,8 +35,11 @@ Environment=TRADEMIND_CONFIG=/config/config.yaml Exec=run --config /config/config.yaml -# Dashboard/Metriken nur auf dem Loopback-Interface -PublishPort=127.0.0.1:8080:8080 +# Dashboard und Metriken auf allen Interfaces, also von außen erreichbar. +# 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 NoNewPrivileges=true diff --git a/podman-compose.yml b/podman-compose.yml index c39496a..1696bdf 100644 --- a/podman-compose.yml +++ b/podman-compose.yml @@ -20,7 +20,12 @@ services: command: ["run", "--config", "/config/config.yaml"] 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: - ./config:/config:ro,Z # Konfiguration schreibgeschützt hineinreichen