version: '3.8' services: # PostgreSQL - Primary database for SQLx compilation and app data postgres: image: postgres:16-alpine container_name: foxhunt-postgres environment: POSTGRES_DB: foxhunt POSTGRES_USER: foxhunt POSTGRES_PASSWORD: foxhunt_dev_password ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U foxhunt"] interval: 10s timeout: 5s retries: 5 networks: - foxhunt-network # Redis - Caching and real-time data redis: image: redis:7-alpine container_name: foxhunt-redis ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 networks: - foxhunt-network # InfluxDB - Time-series data for HFT metrics influxdb: image: influxdb:2.7-alpine container_name: foxhunt-influxdb environment: DOCKER_INFLUXDB_INIT_MODE: setup DOCKER_INFLUXDB_INIT_USERNAME: foxhunt DOCKER_INFLUXDB_INIT_PASSWORD: foxhunt_dev_password DOCKER_INFLUXDB_INIT_ORG: foxhunt DOCKER_INFLUXDB_INIT_BUCKET: trading_metrics DOCKER_INFLUXDB_INIT_RETENTION: 30d ports: - "8086:8086" volumes: - influxdb_data:/var/lib/influxdb2 healthcheck: test: ["CMD", "influx", "ping"] interval: 30s timeout: 10s retries: 5 networks: - foxhunt-network # HashiCorp Vault - Secrets management vault: image: hashicorp/vault:1.15 container_name: foxhunt-vault environment: VAULT_ADDR: http://0.0.0.0:8200 VAULT_DEV_ROOT_TOKEN_ID: foxhunt-dev-root ports: - "8200:8200" volumes: - vault_data:/vault/data cap_add: - IPC_LOCK command: vault server -dev -dev-listen-address=0.0.0.0:8200 healthcheck: test: ["CMD", "vault", "status"] interval: 30s timeout: 10s retries: 5 networks: - foxhunt-network # Prometheus - HFT Metrics Collection prometheus: image: prom/prometheus:latest container_name: foxhunt-prometheus ports: - "9090:9090" volumes: - prometheus_data:/prometheus - ./config/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - ./config/prometheus/rules:/etc/prometheus/rules:ro command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--storage.tsdb.retention.time=15d' - '--web.enable-lifecycle' - '--query.max-concurrency=50' healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9090/-/healthy"] interval: 30s timeout: 10s retries: 5 networks: - foxhunt-network # Grafana - HFT Trading Dashboards grafana: image: grafana/grafana:latest container_name: foxhunt-grafana ports: - "3000:3000" volumes: - grafana_data:/var/lib/grafana - ./config/grafana/dashboards:/var/lib/grafana/dashboards:ro - ./config/grafana/provisioning:/etc/grafana/provisioning:ro environment: - GF_SECURITY_ADMIN_PASSWORD=foxhunt123 - GF_USERS_ALLOW_SIGN_UP=false - GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/hft-trading-performance.json 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 networks: - foxhunt-network volumes: postgres_data: redis_data: influxdb_data: vault_data: prometheus_data: grafana_data: networks: foxhunt-network: driver: bridge