version: '3.8' services: foxhunt-core-staging: build: context: ../../core dockerfile: Dockerfile.staging args: RUST_VERSION: 1.75.0 BUILD_MODE: release container_name: foxhunt-core-staging hostname: foxhunt-core-staging ports: - "8090:8080" # Different ports for staging - "9100:9090" # Metrics on different port volumes: - /opt/foxhunt/staging/config/staging.toml:/app/config/config.toml:ro - /opt/foxhunt/staging/data:/app/data:rw - /var/log/foxhunt/staging:/app/logs:rw - /dev/shm:/dev/shm environment: - RUST_LOG=debug - FOXHUNT_ENV=staging - FOXHUNT_CONFIG=/app/config/config.toml - FOXHUNT_PORT=8080 networks: - foxhunt-staging-net # Performance settings similar to production but less aggressive cpuset: "18-19" # Different cores than production mem_limit: 2g memswap_limit: 2g ulimits: memlock: soft: -1 hard: -1 nofile: soft: 32768 hard: 32768 restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 15s timeout: 10s retries: 3 start_period: 45s logging: driver: "json-file" options: max-size: "50m" max-file: "5" foxhunt-tli-staging: build: context: ../../tli dockerfile: Dockerfile.staging args: RUST_VERSION: 1.75.0 BUILD_MODE: release container_name: foxhunt-tli-staging hostname: foxhunt-tli-staging ports: - "50061:50051" # Different gRPC port - "8091:8081" # Different health check port volumes: - /opt/foxhunt/staging/config/staging.toml:/app/config/config.toml:ro - /var/log/foxhunt/staging:/app/logs:rw environment: - RUST_LOG=debug - FOXHUNT_CORE_ENDPOINT=http://foxhunt-core-staging:8080 - FOXHUNT_CONFIG=/app/config/config.toml - FOXHUNT_ENV=staging - FOXHUNT_GRPC_PORT=50051 - FOXHUNT_HTTP_PORT=8081 depends_on: foxhunt-core-staging: condition: service_healthy networks: - foxhunt-staging-net cpuset: "20" mem_limit: 1g restart: unless-stopped healthcheck: test: ["CMD", "grpcurl", "-plaintext", "localhost:50051", "list"] interval: 20s timeout: 15s retries: 3 start_period: 60s foxhunt-ml-training-staging: build: context: ../../ml dockerfile: Dockerfile.staging args: RUST_VERSION: 1.75.0 BUILD_MODE: release CUDA_VERSION: "12.1" container_name: foxhunt-ml-training-staging hostname: foxhunt-ml-training-staging ports: - "8092:8082" # Different health check port - "6016:6006" # Different TensorBoard port volumes: - /opt/foxhunt/staging/config/staging.toml:/app/config/config.toml:ro - /opt/foxhunt/staging/models:/app/models:rw - /opt/foxhunt/staging/data:/app/data:ro - /opt/foxhunt/staging/checkpoints:/app/checkpoints:rw - /var/log/foxhunt/staging:/app/logs:rw - /tmp/cuda-cache-staging:/tmp/cuda-cache:rw environment: - RUST_LOG=debug - FOXHUNT_CORE_ENDPOINT=http://foxhunt-core-staging:8080 - FOXHUNT_DATA_ENDPOINT=http://foxhunt-data-staging:8084 - FOXHUNT_CONFIG=/app/config/config.toml - FOXHUNT_ENV=staging - FOXHUNT_PORT=8082 # CUDA/GPU environment (use different GPU or share) - CUDA_VISIBLE_DEVICES=1 - NVIDIA_VISIBLE_DEVICES=1 - NVIDIA_DRIVER_CAPABILITIES=compute,utility - NVIDIA_REQUIRE_CUDA=cuda>=11.8 # Reduced ML framework settings for staging - OMP_NUM_THREADS=2 - MKL_NUM_THREADS=2 - PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:256 - TF_GPU_MEMORY_GROWTH=true depends_on: foxhunt-core-staging: condition: service_healthy networks: - foxhunt-staging-net cpuset: "21-22" mem_limit: 4g shm_size: 1g # GPU access for staging (if available) runtime: nvidia deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8082/health"] interval: 45s timeout: 20s retries: 5 start_period: 180s foxhunt-risk-staging: build: context: ../../risk dockerfile: Dockerfile.staging args: RUST_VERSION: 1.75.0 BUILD_MODE: release container_name: foxhunt-risk-staging hostname: foxhunt-risk-staging ports: - "8093:8083" volumes: - /opt/foxhunt/staging/config/staging.toml:/app/config/config.toml:ro - /opt/foxhunt/staging/data:/app/data:ro - /var/log/foxhunt/staging:/app/logs:rw environment: - RUST_LOG=debug - FOXHUNT_CORE_ENDPOINT=http://foxhunt-core-staging:8080 - FOXHUNT_CONFIG=/app/config/config.toml - FOXHUNT_ENV=staging - FOXHUNT_PORT=8083 depends_on: foxhunt-core-staging: condition: service_healthy networks: - foxhunt-staging-net cpuset: "23" mem_limit: 1g restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8083/health"] interval: 20s timeout: 10s retries: 3 start_period: 45s foxhunt-data-staging: build: context: ../../data dockerfile: Dockerfile.staging args: RUST_VERSION: 1.75.0 BUILD_MODE: release container_name: foxhunt-data-staging hostname: foxhunt-data-staging ports: - "8094:8084" volumes: - /opt/foxhunt/staging/config/staging.toml:/app/config/config.toml:ro - /opt/foxhunt/staging/data:/app/data:rw - /var/log/foxhunt/staging:/app/logs:rw environment: - RUST_LOG=debug - FOXHUNT_CONFIG=/app/config/config.toml - FOXHUNT_ENV=staging - FOXHUNT_PORT=8084 # Use test API keys for staging - POLYGON_API_KEY=${POLYGON_STAGING_API_KEY:-demo} networks: - foxhunt-staging-net cpuset: "24" mem_limit: 1g restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8084/health"] interval: 15s timeout: 10s retries: 3 start_period: 45s # Staging-specific monitoring (lightweight) prometheus-staging: image: prom/prometheus:v2.45.0 container_name: foxhunt-prometheus-staging ports: - "9191:9090" volumes: - ../monitoring/prometheus-staging.yml:/etc/prometheus/prometheus.yml:ro - prometheus-staging-data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--storage.tsdb.retention.time=7d' # Shorter retention for staging - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' networks: - foxhunt-staging-net restart: unless-stopped mem_limit: 512m redis-staging: image: redis:7.0-alpine container_name: foxhunt-redis-staging ports: - "6389:6379" # Different port for staging volumes: - redis-staging-data:/data - ../monitoring/redis-staging.conf:/usr/local/etc/redis/redis.conf:ro command: redis-server /usr/local/etc/redis/redis.conf networks: - foxhunt-staging-net mem_limit: 256m restart: unless-stopped # Test load generator for staging validation load-generator: build: context: ../../tests dockerfile: Dockerfile.load-generator container_name: foxhunt-load-generator environment: - TARGET_ENDPOINT=http://foxhunt-core-staging:8080 - LOAD_LEVEL=low - TEST_DURATION=3600 # 1 hour continuous testing depends_on: foxhunt-core-staging: condition: service_healthy networks: - foxhunt-staging-net restart: "no" # Run once for testing profiles: - testing # Only start with --profile testing networks: foxhunt-staging-net: driver: bridge driver_opts: com.docker.network.bridge.name: foxhunt-staging-br0 ipam: config: - subnet: 172.21.0.0/16 volumes: prometheus-staging-data: driver: local redis-staging-data: driver: local