35d5c64e5b
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.
56 lines
1.8 KiB
YAML
56 lines
1.8 KiB
YAML
# Start: podman-compose up -d Logs: podman-compose logs -f
|
||
# Stop: podman-compose down Build: podman-compose build
|
||
#
|
||
# Die Datei funktioniert auch mit docker-compose; ":Z" ist eine SELinux-Kennzeichnung
|
||
# und wird auf Systemen ohne SELinux ignoriert.
|
||
|
||
services:
|
||
trademind:
|
||
build:
|
||
context: .
|
||
dockerfile: Containerfile
|
||
image: localhost/trademind:latest
|
||
container_name: trademind
|
||
restart: unless-stopped
|
||
|
||
# Geheimnisse und Schalter – Vorlage: config/trademind.env.example
|
||
env_file:
|
||
- ./config/trademind.env
|
||
|
||
command: ["run", "--config", "/config/config.yaml"]
|
||
|
||
ports:
|
||
# 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
|
||
- trademind-data:/data:Z # SQLite-Datenbank und trainiertes Modell
|
||
|
||
healthcheck:
|
||
test: ["CMD", "python", "-c", "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:8080/health', timeout=4).status==200 else 1)"]
|
||
interval: 30s
|
||
timeout: 5s
|
||
retries: 3
|
||
start_period: 45s
|
||
|
||
# Absicherung: keine zusätzlichen Rechte, Dateisystem nur dort schreibbar, wo nötig.
|
||
security_opt:
|
||
- no-new-privileges:true
|
||
read_only: false
|
||
tmpfs:
|
||
- /tmp:size=64m
|
||
|
||
logging:
|
||
driver: json-file
|
||
options:
|
||
max-size: "10m"
|
||
max-file: "5"
|
||
|
||
volumes:
|
||
trademind-data:
|