# ============================================================================= # FOXHUNT HFT TRADING SYSTEM - STAGING ENVIRONMENT # ============================================================================= # Complete staging deployment with all services, databases, and monitoring # for production-like testing and validation # # Usage: # docker-compose -f docker-compose.staging.yml up -d # docker-compose -f docker-compose.staging.yml down # # Health Checks: # ./deployment/health_check.sh staging # # ============================================================================= version: '3.8' services: # ========================================================================== # DATABASE SERVICES # ========================================================================== postgres: image: postgres:15-alpine container_name: foxhunt-postgres-staging environment: POSTGRES_DB: foxhunt_staging POSTGRES_USER: foxhunt_staging POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-foxhunt_staging_password} POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --lc-collate=C --lc-ctype=C" ports: - "5433:5432" # Different port to avoid conflicts volumes: - postgres_staging_data:/var/lib/postgresql/data - ./database/schemas:/docker-entrypoint-initdb.d:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U foxhunt_staging -d foxhunt_staging"] interval: 10s timeout: 5s retries: 5 networks: - foxhunt-staging restart: unless-stopped deploy: resources: limits: cpus: '2.0' memory: 4G reservations: cpus: '1.0' memory: 2G redis: image: redis:7-alpine container_name: foxhunt-redis-staging command: redis-server --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru ports: - "6380:6379" # Different port to avoid conflicts volumes: - redis_staging_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 networks: - foxhunt-staging restart: unless-stopped deploy: resources: limits: cpus: '1.0' memory: 1G reservations: cpus: '0.5' memory: 512M # ========================================================================== # FOXHUNT CORE SERVICES # ========================================================================== trading-service: build: context: . dockerfile: services/trading_service/Dockerfile.production args: BUILD_MODE: staging container_name: foxhunt-trading-service-staging depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: - DATABASE_URL=postgres://foxhunt_staging:${POSTGRES_PASSWORD:-foxhunt_staging_password}@postgres:5432/foxhunt_staging - REDIS_URL=redis://redis:6379 - RUST_LOG=info,trading_service=debug - FOXHUNT_ENV=staging - SERVICE_NAME=trading-service - SERVICE_PORT=50051 - METRICS_PORT=9001 - HEALTH_PORT=8081 ports: - "50051:50051" # gRPC - "8081:8081" # Health/Debug - "9001:9001" # Metrics volumes: - ./config:/app/config:ro - ./logs/staging:/app/logs - trading_staging_data:/app/data networks: - foxhunt-staging restart: unless-stopped healthcheck: test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:8081/health || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 40s deploy: resources: limits: cpus: '4.0' memory: 8G reservations: cpus: '2.0' memory: 4G backtesting-service: build: context: . dockerfile: services/backtesting_service/Dockerfile.production args: BUILD_MODE: staging container_name: foxhunt-backtesting-service-staging depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: - DATABASE_URL=postgres://foxhunt_staging:${POSTGRES_PASSWORD:-foxhunt_staging_password}@postgres:5432/foxhunt_staging - REDIS_URL=redis://redis:6379 - RUST_LOG=info,backtesting_service=debug - FOXHUNT_ENV=staging - SERVICE_NAME=backtesting-service - SERVICE_PORT=50052 - METRICS_PORT=9002 - HEALTH_PORT=8082 ports: - "50052:50052" # gRPC - "8082:8082" # Health/Debug - "9002:9002" # Metrics volumes: - ./config:/app/config:ro - ./data:/app/data:ro - ./logs/staging:/app/logs - backtesting_staging_data:/app/backtests networks: - foxhunt-staging restart: unless-stopped healthcheck: test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:8082/health || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 40s deploy: resources: limits: cpus: '4.0' memory: 8G reservations: cpus: '2.0' memory: 4G ml-training-service: build: context: . dockerfile: services/ml_training_service/Dockerfile.production args: BUILD_MODE: staging container_name: foxhunt-ml-training-service-staging depends_on: postgres: condition: service_healthy environment: - DATABASE_URL=postgres://foxhunt_staging:${POSTGRES_PASSWORD:-foxhunt_staging_password}@postgres:5432/foxhunt_staging - AWS_ENDPOINT_URL=${AWS_ENDPOINT_URL:-} - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-} - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-} - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:-us-east-1} - RUST_LOG=info,ml_training_service=debug - FOXHUNT_ENV=staging - SERVICE_NAME=ml-training-service - SERVICE_PORT=50053 - METRICS_PORT=9003 - HEALTH_PORT=8083 ports: - "50053:50053" # gRPC - "8083:8083" # Health/Debug - "9003:9003" # Metrics - "6006:6006" # TensorBoard volumes: - ./config:/app/config:ro - ./logs/staging:/app/logs - ml_staging_data:/app/models - ml_cache_staging:/app/cache networks: - foxhunt-staging restart: unless-stopped healthcheck: test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:8083/health || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 60s deploy: resources: limits: cpus: '6.0' memory: 16G reservations: cpus: '4.0' memory: 8G # ========================================================================== # MONITORING AND OBSERVABILITY # ========================================================================== prometheus: image: prom/prometheus:v2.48.0 container_name: foxhunt-prometheus-staging command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--storage.tsdb.retention.time=15d' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--web.enable-lifecycle' - '--web.enable-admin-api' - '--log.level=info' ports: - "9090:9090" volumes: - prometheus_staging_data:/prometheus - ./config/monitoring/prometheus-staging.yml:/etc/prometheus/prometheus.yml:ro - ./config/monitoring/hft-alerts.yml:/etc/prometheus/alerts/hft-alerts.yml:ro healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9090/-/healthy"] interval: 30s timeout: 10s retries: 5 start_period: 30s networks: - foxhunt-staging restart: unless-stopped deploy: resources: limits: cpus: '2.0' memory: 4G reservations: cpus: '1.0' memory: 2G grafana: image: grafana/grafana:10.2.0 container_name: foxhunt-grafana-staging environment: - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-foxhunt_staging} - GF_USERS_ALLOW_SIGN_UP=false - GF_INSTALL_PLUGINS=grafana-piechart-panel,grafana-clock-panel - GF_LOG_LEVEL=info - GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s:%(http_port)s/ - GF_ANALYTICS_REPORTING_ENABLED=false - GF_ANALYTICS_CHECK_FOR_UPDATES=false ports: - "3001:3000" # Different port to avoid conflicts volumes: - grafana_staging_data:/var/lib/grafana - ./config/monitoring/grafana/dashboards:/var/lib/grafana/dashboards:ro - ./config/monitoring/grafana/provisioning:/etc/grafana/provisioning:ro depends_on: prometheus: condition: service_healthy healthcheck: test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1"] interval: 30s timeout: 10s retries: 5 start_period: 30s networks: - foxhunt-staging restart: unless-stopped deploy: resources: limits: cpus: '1.0' memory: 2G reservations: cpus: '0.5' memory: 1G # ========================================================================== # OPTIONAL: TLI CLIENT (for interactive testing) # ========================================================================== tli: build: context: . dockerfile: tli/Dockerfile.production container_name: foxhunt-tli-staging depends_on: - trading-service - backtesting-service - ml-training-service environment: - TRADING_SERVICE_URL=http://trading-service:50051 - BACKTESTING_SERVICE_URL=http://backtesting-service:50052 - ML_SERVICE_URL=http://ml-training-service:50053 - RUST_LOG=info - FOXHUNT_ENV=staging stdin_open: true tty: true volumes: - ./config:/app/config:ro - ./logs/staging:/app/logs networks: - foxhunt-staging profiles: - interactive # Only start when explicitly requested deploy: resources: limits: cpus: '1.0' memory: 1G # ============================================================================= # NETWORKS AND VOLUMES # ============================================================================= networks: foxhunt-staging: driver: bridge name: foxhunt-staging-network ipam: driver: default config: - subnet: 172.20.0.0/16 volumes: postgres_staging_data: name: foxhunt-postgres-staging-data redis_staging_data: name: foxhunt-redis-staging-data trading_staging_data: name: foxhunt-trading-staging-data backtesting_staging_data: name: foxhunt-backtesting-staging-data ml_staging_data: name: foxhunt-ml-staging-data ml_cache_staging: name: foxhunt-ml-cache-staging prometheus_staging_data: name: foxhunt-prometheus-staging-data grafana_staging_data: name: foxhunt-grafana-staging-data