services: nats: image: nats:2.12.4-alpine3.22 container_name: tactical-nats command: > --jetstream --store_dir /data --max_mem_store 256MB ports: - "4222:4222" - "8222:8222" volumes: - nats-data:/data healthcheck: test: ["CMD", "nats-server", "--signal", "ldm"] interval: 5s timeout: 3s retries: 5 networks: - tactical-network timescaledb: image: timescale/timescaledb:latest-pg18 container_name: tactical-timescaledb environment: POSTGRES_DB: tactical_intelligence POSTGRES_USER: ${DB_USER:-coach} POSTGRES_PASSWORD: ${DB_PASSWORD:-tactical_pass_2024} TIMESCALEDB_TELEMETRY: "off" ports: - "5432:5432" volumes: - timescale-data:/var/lib/postgresql/data - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-coach} -d tactical_intelligence"] interval: 5s timeout: 3s retries: 5 networks: - tactical-network redis: image: redis:9-alpine container_name: tactical-redis ports: - "6379:6379" command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru volumes: - redis-data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 3 networks: - tactical-network tactical-engine: build: context: ./services/tactical-engine dockerfile: Dockerfile container_name: tactical-engine environment: NATS_URL: nats://nats:4222 DB_HOST: timescaledb DB_PORT: "5432" DB_NAME: tactical_intelligence DB_USER: ${DB_USER:-coach} DB_PASSWORD: ${DB_PASSWORD:-tactical_pass_2024} REDIS_URL: redis:6379 STYLE_CONFIG: /app/config/styles/${DEFAULT_STYLE:-gegenpressing}.json LOG_LEVEL: ${LOG_LEVEL:-info} PORT: "8080" ports: - "8080:8080" depends_on: nats: condition: service_healthy timescaledb: condition: service_healthy redis: condition: service_healthy restart: unless-stopped volumes: - ./config/styles:/app/config/styles:ro networks: - tactical-network analytics-engine: build: context: ./services/analytics dockerfile: Dockerfile container_name: analytics-engine environment: DB_HOST: timescaledb DB_PORT: "5432" DB_NAME: tactical_intelligence DB_USER: ${DB_USER:-coach} DB_PASSWORD: ${DB_PASSWORD:-tactical_pass_2024} REDIS_URL: redis:6379 PORT: "8000" ports: - "8000:8000" depends_on: - timescaledb - redis restart: unless-stopped networks: - tactical-network dashboard: build: context: ./services/dashboard dockerfile: Dockerfile args: NEXT_PUBLIC_WS_URL: ws://localhost:8080 NEXT_PUBLIC_API_URL: http://localhost:8000 container_name: tactical-dashboard environment: NODE_ENV: production ports: - "3000:3000" depends_on: - tactical-engine - analytics-engine restart: unless-stopped networks: - tactical-network networks: tactical-network: driver: bridge volumes: nats-data: timescale-data: redis-data: