version: '3.8' services: # === STANDALONE TRADING SERVICE === # Monolithic service containing trading, risk, and ML components foxhunt-trading: build: context: ../../services/trading_service dockerfile: Dockerfile args: RUST_VERSION: 1.75.0 BUILD_MODE: release container_name: foxhunt-trading-service hostname: foxhunt-trading ports: - "8080:8080" # Main gRPC port - "8081:8081" # Health check port - "9090:9090" # Metrics port volumes: - /opt/foxhunt/config/trading.toml:/app/config/config.toml:ro - /opt/foxhunt/data:/app/data:rw - /var/log/foxhunt:/app/logs:rw - /dev/shm:/dev/shm # Shared memory for IPC environment: - RUST_LOG=info - FOXHUNT_ENV=production - FOXHUNT_CONFIG=/app/config/config.toml - DATABASE_URL=postgresql://foxhunt:foxhunt@postgres:5432/foxhunt - REDIS_URL=redis://redis:6379 # ML framework optimizations - OMP_NUM_THREADS=6 - MKL_NUM_THREADS=6 - PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512 - TF_GPU_MEMORY_GROWTH=true # CUDA/GPU environment - CUDA_VISIBLE_DEVICES=0 - NVIDIA_VISIBLE_DEVICES=0 - NVIDIA_DRIVER_CAPABILITIES=compute,utility - NVIDIA_REQUIRE_CUDA=cuda>=11.8 depends_on: postgres: condition: service_healthy redis: condition: service_started networks: - foxhunt-net # HFT Performance Optimizations cpuset: "0-7" # Dedicated CPU cores for trading cpu_count: 8 cpu_percent: 800 # 8 cores * 100% mem_limit: 16g memswap_limit: 16g mem_swappiness: 1 oom_kill_disable: true shm_size: 2g # Shared memory for ML frameworks # Real-time capabilities cap_add: - SYS_NICE - IPC_LOCK ulimits: memlock: soft: -1 hard: -1 nofile: soft: 65536 hard: 65536 rtprio: soft: 90 hard: 90 # GPU access for ML runtime: nvidia deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] # Network optimizations sysctls: - net.core.rmem_max=134217728 - net.core.wmem_max=134217728 - net.ipv4.tcp_rmem=4096 65536 134217728 - net.ipv4.tcp_wmem=4096 65536 134217728 - net.core.netdev_max_backlog=5000 restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8081/health"] interval: 10s timeout: 5s retries: 3 start_period: 30s logging: driver: "json-file" options: max-size: "100m" max-file: "10" # === STANDALONE BACKTESTING SERVICE === # Independent service for strategy testing and validation foxhunt-backtesting: build: context: ../../services/backtesting_service dockerfile: Dockerfile args: RUST_VERSION: 1.75.0 BUILD_MODE: release container_name: foxhunt-backtesting-service hostname: foxhunt-backtesting ports: - "8082:8082" # Main gRPC port - "8083:8083" # Health check port - "6006:6006" # TensorBoard (optional) volumes: - /opt/foxhunt/config/backtesting.toml:/app/config/config.toml:ro - /opt/foxhunt/data:/app/data:ro - /opt/foxhunt/backtests:/app/backtests:rw - /var/log/foxhunt:/app/logs:rw environment: - RUST_LOG=info - FOXHUNT_ENV=production - FOXHUNT_CONFIG=/app/config/config.toml - DATABASE_URL=postgresql://foxhunt:foxhunt@postgres:5432/foxhunt - INFLUXDB_URL=http://influxdb:8086 - FOXHUNT_BACKTEST_DATA_DIR=/app/backtests depends_on: postgres: condition: service_healthy influxdb: condition: service_started networks: - foxhunt-net # Resource allocation for compute-intensive backtesting cpuset: "8-15" # Dedicated cores for backtesting cpu_count: 8 cpu_percent: 800 mem_limit: 32g memswap_limit: 32g shm_size: 4g # GPU access for ML backtesting runtime: nvidia deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8083/health"] interval: 15s timeout: 10s retries: 3 start_period: 45s logging: driver: "json-file" options: max-size: "100m" max-file: "5" # === TLI CLIENT === # Terminal Line Interface - gRPC client only foxhunt-tli: build: context: ../../tli dockerfile: Dockerfile args: RUST_VERSION: 1.75.0 BUILD_MODE: release container_name: foxhunt-tli-client hostname: foxhunt-tli # TLI is a client - no ports exposed stdin_open: true tty: true volumes: - /opt/foxhunt/config/tli.toml:/app/config/config.toml:ro - /var/log/foxhunt:/app/logs:rw - /tmp/.X11-unix:/tmp/.X11-unix:rw # X11 forwarding for GUI environment: - RUST_LOG=info - FOXHUNT_CONFIG=/app/config/config.toml - FOXHUNT_TRADING_ENDPOINT=foxhunt-trading:8080 - FOXHUNT_BACKTESTING_ENDPOINT=foxhunt-backtesting:8082 - DISPLAY=${DISPLAY} # For GUI applications depends_on: foxhunt-trading: condition: service_healthy foxhunt-backtesting: condition: service_healthy networks: - foxhunt-net cpuset: "16-17" mem_limit: 2g restart: unless-stopped command: ["sh", "-c", "sleep infinity"] # Keep container running logging: driver: "json-file" options: max-size: "50m" max-file: "3" # === SUPPORTING INFRASTRUCTURE === postgres: image: postgres:15-alpine container_name: foxhunt-postgres ports: - "5432:5432" environment: - POSTGRES_DB=foxhunt - POSTGRES_USER=foxhunt - POSTGRES_PASSWORD=foxhunt volumes: - postgres-data:/var/lib/postgresql/data - ../sql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro networks: - foxhunt-net restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U foxhunt -d foxhunt"] interval: 10s timeout: 5s retries: 5 start_period: 30s redis: image: redis:7.0-alpine container_name: foxhunt-redis ports: - "6379:6379" volumes: - redis-data:/data - ../monitoring/redis.conf:/usr/local/etc/redis/redis.conf:ro command: redis-server /usr/local/etc/redis/redis.conf networks: - foxhunt-net mem_limit: 2g sysctls: - net.core.somaxconn=65535 restart: unless-stopped influxdb: image: influxdb:2.7-alpine container_name: foxhunt-influxdb ports: - "8086:8086" environment: - INFLUXDB_DB=foxhunt - INFLUXDB_ADMIN_USER=admin - INFLUXDB_ADMIN_PASSWORD=admin volumes: - influxdb-data:/var/lib/influxdb2 networks: - foxhunt-net restart: unless-stopped # === MONITORING SERVICES === prometheus: image: prom/prometheus:v2.45.0 container_name: foxhunt-prometheus ports: - "9091:9090" # Different port to avoid conflict with trading service volumes: - ../monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro - prometheus-data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--storage.tsdb.retention.time=30d' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--web.enable-lifecycle' networks: - foxhunt-net restart: unless-stopped grafana: image: grafana/grafana:10.0.0 container_name: foxhunt-grafana ports: - "3000:3000" volumes: - grafana-data:/var/lib/grafana - ../monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards:ro - ../monitoring/grafana/datasources:/etc/grafana/provisioning/datasources:ro environment: - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD:-admin} - GF_USERS_ALLOW_SIGN_UP=false - GF_SERVER_ROOT_URL=http://localhost:3000 networks: - foxhunt-net restart: unless-stopped networks: foxhunt-net: driver: bridge driver_opts: com.docker.network.bridge.name: foxhunt-br0 ipam: config: - subnet: 172.20.0.0/16 volumes: postgres-data: driver: local redis-data: driver: local influxdb-data: driver: local prometheus-data: driver: local grafana-data: driver: local