Files
Trademind/Containerfile
T
Tobias Zimmermann 65ed73977e Initial commit: TradeMind – Krypto-Trading-Bot mit Lernmodus
Per Podman deploybarer Bot, der Käufe und Verkäufe simuliert ausführt und sich
aus den Ergebnissen weiter antrainiert.

Aufbau
- Einheitliche Bar-Verarbeitung für paper, backtest und live; ausgetauscht werden
  nur Datenquelle und Broker.
- Börsenanbindung über ccxt: rund 100 Börsen allein über exchange.id erreichbar.
  Zugangsdaten kommen über ENV-Platzhalter, der Live-Modus ist doppelt abgesichert.
- Paper-Broker mit Gebühren, Slippage, Börsenpräzision und Volumengrenzen.
- Online trainierte logistische Regression bewertet jedes Einstiegssignal. Sie lernt
  aus realen Trade-Ergebnissen, aus Shadow-Labels aller Kandidaten – auch der
  abgelehnten – und aus Hintergrund-Stichproben; beim Kaltstart wird sie aus der
  Kurshistorie vorgelernt.
- Risikomanagement: Positions- und Exposure-Grenzen, ATR-Stops, Cooldown sowie
  Tagesverlust- und Drawdown-Notbremsen.
- SQLite-Persistenz, HTTP-Status mit Prometheus-Metriken und Dashboard, Webhooks.

Deployment
- Containerfile (zweistufig, non-root UID 10001), podman-compose, systemd-Quadlet.
- Modell und Datenbank liegen im Volume /data und überleben Neustarts.

128 Tests, ruff sauber. Verifiziert gegen echte Marktdaten sowie im gebauten
Container inklusive Healthcheck und Zustandswiederherstellung.
2026-08-22 08:53:04 +02:00

70 lines
2.9 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# syntax=docker/dockerfile:1
# ─────────────────────────────────────────────────────────────────────────────
# TradeMind Container-Image
#
# podman build --format docker -t trademind:latest -f Containerfile .
#
# --format docker ist nötig, damit die HEALTHCHECK-Anweisung ins Image übernommen wird;
# das OCI-Format kennt sie nicht. podman-compose und die Quadlet-Einheit bringen den
# Healthcheck ohnehin selbst mit, dort ist das Format egal.
# ─────────────────────────────────────────────────────────────────────────────
# ---------- Stufe 1: Abhängigkeiten in ein virtuelles Environment installieren
FROM docker.io/library/python:3.12-slim AS builder
ENV PIP_NO_CACHE_DIR=1 \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
PYTHONDONTWRITEBYTECODE=1
WORKDIR /build
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
# Erst die Metadaten kopieren so bleibt der Dependency-Layer über Codeänderungen hinweg gültig.
COPY pyproject.toml README.md ./
COPY src/trademind/__init__.py ./src/trademind/__init__.py
RUN pip install --upgrade pip setuptools wheel && pip install .
# Jetzt den vollständigen Quellcode und das Paket selbst installieren.
COPY src/ ./src/
RUN pip install --no-deps .
# ---------- Stufe 2: schlankes Laufzeit-Image
FROM docker.io/library/python:3.12-slim AS runtime
LABEL org.opencontainers.image.title="TradeMind" \
org.opencontainers.image.description="Selbstlernender Krypto-Trading-Bot (Paper, Backtest, Live)" \
org.opencontainers.image.source="https://github.com/tlt-turbo/trademind" \
org.opencontainers.image.licenses="MIT"
ENV PATH="/opt/venv/bin:$PATH" \
PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
TRADEMIND_CONFIG=/config/config.yaml \
TZ=UTC
# Nicht-Root-Benutzer; UID/GID 10001 kollidiert selten mit Host-Benutzern.
RUN groupadd --gid 10001 trademind \
&& useradd --uid 10001 --gid 10001 --create-home --home-dir /home/trademind trademind \
&& mkdir -p /data/models /config \
&& chown -R 10001:10001 /data /config
COPY --from=builder /opt/venv /opt/venv
COPY --chown=10001:10001 config/config.example.yaml /config/config.example.yaml
USER 10001:10001
WORKDIR /home/trademind
# /data hält SQLite-Datenbank und trainiertes Modell als Volume einhängen, sonst
# gehen Lernfortschritt und Historie beim Neustart verloren.
VOLUME ["/data"]
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=5s --start-period=45s --retries=3 \
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)"
ENTRYPOINT ["trademind"]
CMD ["run", "--config", "/config/config.yaml"]