# Trading Bot v4 - Docker Compose Configuration # Production-ready setup with PostgreSQL and monitoring services: # ================================ # Trading Bot Application # ================================ trading-bot: build: context: . dockerfile: Dockerfile container_name: trading-bot-v4 restart: unless-stopped dns: - 8.8.8.8 - 8.8.4.4 ports: - "3001:3000" environment: # Timezone TZ: Europe/Berlin # Node environment NODE_ENV: production PORT: 3000 # Load from .env file (create from .env.example) DRIFT_WALLET_PRIVATE_KEY: ${DRIFT_WALLET_PRIVATE_KEY} DRIFT_ENV: ${DRIFT_ENV:-mainnet-beta} API_SECRET_KEY: ${API_SECRET_KEY} SOLANA_RPC_URL: ${SOLANA_RPC_URL} PYTH_HERMES_URL: ${PYTH_HERMES_URL:-https://hermes.pyth.network} # Trading configuration MAX_POSITION_SIZE_USD: ${MAX_POSITION_SIZE_USD:-50} LEVERAGE: ${LEVERAGE:-10} STOP_LOSS_PERCENT: ${STOP_LOSS_PERCENT:--1.5} TAKE_PROFIT_1_PERCENT: ${TAKE_PROFIT_1_PERCENT:-0.7} TAKE_PROFIT_1_SIZE_PERCENT: ${TAKE_PROFIT_1_SIZE_PERCENT:-50} TAKE_PROFIT_2_PERCENT: ${TAKE_PROFIT_2_PERCENT:-1.5} TAKE_PROFIT_2_SIZE_PERCENT: ${TAKE_PROFIT_2_SIZE_PERCENT:-50} # Signal quality thresholds (Nov 23, 2025 - direction-specific) MIN_SIGNAL_QUALITY_SCORE: ${MIN_SIGNAL_QUALITY_SCORE:-91} MIN_SIGNAL_QUALITY_SCORE_LONG: ${MIN_SIGNAL_QUALITY_SCORE_LONG:-90} MIN_SIGNAL_QUALITY_SCORE_SHORT: ${MIN_SIGNAL_QUALITY_SCORE_SHORT:-95} # Adaptive Leverage (Dec 1, 2025 - quality-based position sizing) USE_ADAPTIVE_LEVERAGE: ${USE_ADAPTIVE_LEVERAGE:-true} HIGH_QUALITY_LEVERAGE: ${HIGH_QUALITY_LEVERAGE:-5} LOW_QUALITY_LEVERAGE: ${LOW_QUALITY_LEVERAGE:-1} QUALITY_LEVERAGE_THRESHOLD: ${QUALITY_LEVERAGE_THRESHOLD:-95} # Database (if using PostgreSQL) DATABASE_URL: ${DATABASE_URL:-postgresql://postgres:postgres@postgres:5432/trading_bot_v4} # Notifications TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN:-} TELEGRAM_CHAT_ID: ${TELEGRAM_CHAT_ID:-} DISCORD_WEBHOOK_URL: ${DISCORD_WEBHOOK_URL:-} # n8n integration N8N_WEBHOOK_URL: ${N8N_WEBHOOK_URL:-} TRADINGVIEW_WEBHOOK_SECRET: ${TRADINGVIEW_WEBHOOK_SECRET:-} # Monitoring LOG_LEVEL: ${LOG_LEVEL:-info} DRY_RUN: ${DRY_RUN:-false} volumes: # Mount .env file for settings persistence - ./.env:/app/.env # Mount logs directory - ./logs:/app/logs # Mount cluster directory for exploration database - ./cluster:/app/cluster # Mount Docker socket for container restart capability - /var/run/docker.sock:/var/run/docker.sock # Mount for hot reload in development (comment out in production) # - ./v4:/app/v4:ro networks: - trading-net depends_on: - postgres deploy: resources: limits: memory: 2G cpus: '2.0' reservations: memory: 512M cpus: '0.5' healthcheck: test: ["CMD", "node", "-e", "require('http').get('http://localhost:3000/api/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"] interval: 30s timeout: 10s retries: 3 # ================================ # PostgreSQL Database (Optional) # ================================ postgres: image: postgres:16-alpine command: | postgres -c shared_buffers=128MB -c effective_cache_size=512MB -c work_mem=8MB -c maintenance_work_mem=64MB -c max_connections=20 -c random_page_cost=1.1 container_name: trading-bot-postgres restart: unless-stopped ports: - "55432:5432" environment: TZ: Europe/Berlin POSTGRES_DB: trading_bot_v4 POSTGRES_USER: postgres POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=en_US.UTF-8" volumes: # Persist database data - postgres-data:/var/lib/postgresql/data # Custom initialization scripts (optional) - ./prisma/init.sql:/docker-entrypoint-initdb.d/init.sql:ro networks: - trading-net deploy: resources: limits: memory: 1G cpus: '1.0' reservations: memory: 512M cpus: '0.25' healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 # ================================ # Networks # ================================ networks: trading-net: driver: bridge ipam: config: - subnet: 172.28.0.0/16 # ================================ # Volumes # ================================ volumes: postgres-data: driver: local