From 2f065df1e9f84bbf805dc8032ed576ddccbb70f0 Mon Sep 17 00:00:00 2001 From: bnair123 Date: Sat, 27 Dec 2025 21:45:30 +0400 Subject: [PATCH] Update docker-compose to use pre-built registry images - Use gitea.thefetagroup.com/bnair/cryptobot:latest for engine - Use gitea.thefetagroup.com/bnair/cryptobot-ui:latest for dashboard - Remove deprecated 'version' field - Change default DATA_ROOT from /opt/trading/crypto to ./data/ - Add start_period to healthchecks - Add service dependency conditions --- docker-compose.yml | 123 +++++++++++++++++++++------------------------ 1 file changed, 56 insertions(+), 67 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 0617c7a..5a653bb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,15 @@ -version: "3.9" - # TradeFinder - Automated Crypto Trading System -# Mount point: /opt/trading/crypto (configurable via DATA_ROOT) +# Uses pre-built images from Gitea Container Registry +# +# Quick Start: +# docker compose up -d +# +# With optimizer/backtester: +# docker compose --profile optimizer up -d +# docker compose --profile backtest run --rm backtester +# +# Environment: +# Copy .env.example to .env and configure API keys x-common: &common restart: unless-stopped @@ -13,43 +21,38 @@ x-common: &common max-size: "10m" max-file: "3" +x-engine-image: &engine-image + image: gitea.thefetagroup.com/bnair/cryptobot:latest + +x-ui-image: &ui-image + image: gitea.thefetagroup.com/bnair/cryptobot-ui:latest + services: - # ========================================================================== - # CORE TRADING ENGINE - # ========================================================================== engine: - <<: *common - build: - context: . - dockerfile: Dockerfile - target: engine + <<: [*common, *engine-image] container_name: tf-engine env_file: - .env environment: - PYTHONUNBUFFERED=1 - DUCKDB_PATH=/data/engine/tradefinder.duckdb + - TRADING_MODE=${TRADING_MODE:-paper} volumes: - - ${DATA_ROOT:-/opt/trading/crypto}/engine:/data/engine - - ${DATA_ROOT:-/opt/trading/crypto}/shared:/data/shared + - ${DATA_ROOT:-./data}/engine:/data/engine + - ${DATA_ROOT:-./data}/shared:/data/shared depends_on: - - redis + redis: + condition: service_healthy healthcheck: test: ["CMD", "python", "-c", "import tradefinder; print('ok')"] interval: 30s timeout: 10s retries: 3 + start_period: 10s command: ["python", "-m", "tradefinder.core.main"] - # ========================================================================== - # STREAMLIT UI - # ========================================================================== ui: - <<: *common - build: - context: . - dockerfile: Dockerfile - target: ui + <<: [*common, *ui-image] container_name: tf-ui env_file: - .env @@ -59,8 +62,8 @@ services: ports: - "${STREAMLIT_PORT:-8501}:8501" volumes: - - ${DATA_ROOT:-/opt/trading/crypto}/engine:/data/engine:ro - - ${DATA_ROOT:-/opt/trading/crypto}/shared:/data/shared + - ${DATA_ROOT:-./data}/engine:/data/engine:ro + - ${DATA_ROOT:-./data}/shared:/data/shared depends_on: - engine healthcheck: @@ -68,40 +71,15 @@ services: interval: 30s timeout: 10s retries: 3 + start_period: 15s command: ["streamlit", "run", "src/tradefinder/ui/app.py", "--server.port=8501", "--server.address=0.0.0.0"] - # ========================================================================== - # OPTIMIZER (runs weekly via scheduler or manually) - # ========================================================================== - optimizer: - <<: *common - build: - context: . - dockerfile: Dockerfile - target: engine - container_name: tf-optimizer - env_file: - - .env - environment: - - PYTHONUNBUFFERED=1 - - DUCKDB_PATH=/data/engine/tradefinder.duckdb - volumes: - - ${DATA_ROOT:-/opt/trading/crypto}/engine:/data/engine - - ${DATA_ROOT:-/opt/trading/crypto}/optimizer:/data/optimizer - - ${DATA_ROOT:-/opt/trading/crypto}/shared:/data/shared - profiles: - - optimizer # Only runs when explicitly started: docker compose --profile optimizer up optimizer - command: ["python", "-m", "tradefinder.core.optimize"] - - # ========================================================================== - # REDIS (for real-time state, pub/sub, caching) - # ========================================================================== redis: <<: *common image: redis:7-alpine container_name: tf-redis volumes: - - ${DATA_ROOT:-/opt/trading/crypto}/redis:/data + - ${DATA_ROOT:-./data}/redis:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s @@ -109,15 +87,27 @@ services: retries: 3 command: ["redis-server", "--appendonly", "yes", "--maxmemory", "256mb", "--maxmemory-policy", "allkeys-lru"] - # ========================================================================== - # BACKTESTER (runs on-demand) - # ========================================================================== + optimizer: + <<: [*common, *engine-image] + container_name: tf-optimizer + env_file: + - .env + environment: + - PYTHONUNBUFFERED=1 + - DUCKDB_PATH=/data/engine/tradefinder.duckdb + volumes: + - ${DATA_ROOT:-./data}/engine:/data/engine + - ${DATA_ROOT:-./data}/optimizer:/data/optimizer + - ${DATA_ROOT:-./data}/shared:/data/shared + depends_on: + redis: + condition: service_healthy + profiles: + - optimizer + command: ["python", "-m", "tradefinder.core.optimize"] + backtester: - <<: *common - build: - context: . - dockerfile: Dockerfile - target: engine + <<: [*common, *engine-image] container_name: tf-backtester env_file: - .env @@ -125,11 +115,11 @@ services: - PYTHONUNBUFFERED=1 - DUCKDB_PATH=/data/engine/tradefinder.duckdb volumes: - - ${DATA_ROOT:-/opt/trading/crypto}/engine:/data/engine - - ${DATA_ROOT:-/opt/trading/crypto}/backtest:/data/backtest - - ${DATA_ROOT:-/opt/trading/crypto}/shared:/data/shared + - ${DATA_ROOT:-./data}/engine:/data/engine + - ${DATA_ROOT:-./data}/backtest:/data/backtest + - ${DATA_ROOT:-./data}/shared:/data/shared profiles: - - backtest # Only runs when explicitly started + - backtest command: ["python", "-m", "tradefinder.core.backtest"] networks: @@ -137,10 +127,9 @@ networks: driver: bridge name: tradefinder-network -# Volume labels for clarity -# All data persisted under ${DATA_ROOT:-/opt/trading/crypto}/ -# ├── engine/ # DuckDB, order logs, positions -# ├── optimizer/ # Optuna studies, best params +# Data Structure (default: ./data/) +# ├── engine/ # DuckDB database, order logs, positions +# ├── optimizer/ # Optuna studies, best parameters # ├── backtest/ # Backtest results, reports # ├── redis/ # Redis AOF persistence # └── shared/ # Shared configs, FX rates cache