# TradeFinder - Automated Crypto Trading System # 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 networks: - tradefinder-net logging: driver: json-file options: 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: 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:-./data}/engine:/data/engine - ${DATA_ROOT:-./data}/shared:/data/shared depends_on: 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"] ui: <<: [*common, *ui-image] container_name: tf-ui env_file: - .env environment: - PYTHONUNBUFFERED=1 - DUCKDB_PATH=/data/engine/tradefinder.duckdb ports: - "${STREAMLIT_PORT:-8501}:8501" volumes: - ${DATA_ROOT:-./data}/engine:/data/engine:ro - ${DATA_ROOT:-./data}/shared:/data/shared depends_on: - engine healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8501/_stcore/health"] 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"] redis: <<: *common image: redis:7-alpine container_name: tf-redis volumes: - ${DATA_ROOT:-./data}/redis:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 3 command: ["redis-server", "--appendonly", "yes", "--maxmemory", "256mb", "--maxmemory-policy", "allkeys-lru"] 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, *engine-image] container_name: tf-backtester env_file: - .env environment: - PYTHONUNBUFFERED=1 - DUCKDB_PATH=/data/engine/tradefinder.duckdb volumes: - ${DATA_ROOT:-./data}/engine:/data/engine - ${DATA_ROOT:-./data}/backtest:/data/backtest - ${DATA_ROOT:-./data}/shared:/data/shared profiles: - backtest command: ["python", "-m", "tradefinder.core.backtest"] networks: tradefinder-net: driver: bridge name: tradefinder-network # 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