services: redis: image: redis:7-alpine ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 networks: [internal] deploy: resources: limits: memory: 256M cpus: '0.5' postgres: image: postgres:16-alpine ports: - "5432:5432" environment: POSTGRES_USER: ${POSTGRES_USER:-trading} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-trading} POSTGRES_DB: ${POSTGRES_DB:-trading} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD", "pg_isready", "-U", "trading"] interval: 5s timeout: 3s retries: 5 networks: [internal] deploy: resources: limits: memory: 256M cpus: '0.5' data-collector: build: context: . dockerfile: services/data-collector/Dockerfile env_file: .env ports: - "8080:8080" depends_on: redis: condition: service_healthy postgres: condition: service_healthy healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8080/health')"] interval: 10s timeout: 5s retries: 3 restart: unless-stopped networks: [internal] deploy: resources: limits: memory: 512M cpus: '1.0' strategy-engine: build: context: . dockerfile: services/strategy-engine/Dockerfile env_file: .env ports: - "8081:8081" depends_on: redis: condition: service_healthy postgres: condition: service_healthy healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8081/health')"] interval: 10s timeout: 5s retries: 3 restart: unless-stopped networks: [internal] deploy: resources: limits: memory: 1G cpus: '1.0' order-executor: build: context: . dockerfile: services/order-executor/Dockerfile env_file: .env ports: - "8082:8082" depends_on: redis: condition: service_healthy postgres: condition: service_healthy healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8082/health')"] interval: 10s timeout: 5s retries: 3 restart: unless-stopped networks: [internal] deploy: resources: limits: memory: 512M cpus: '1.0' portfolio-manager: build: context: . dockerfile: services/portfolio-manager/Dockerfile env_file: .env ports: - "8083:8083" depends_on: redis: condition: service_healthy postgres: condition: service_healthy healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8083/health')"] interval: 10s timeout: 5s retries: 3 restart: unless-stopped networks: [internal] deploy: resources: limits: memory: 512M cpus: '1.0' api: build: context: . dockerfile: services/api/Dockerfile env_file: .env ports: - "8000:8000" depends_on: redis: condition: service_healthy postgres: condition: service_healthy healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"] interval: 10s timeout: 5s retries: 3 restart: unless-stopped networks: [internal] deploy: resources: limits: memory: 512M cpus: '1.0' news-collector: build: context: . dockerfile: services/news-collector/Dockerfile env_file: .env ports: - "8084:8084" depends_on: redis: condition: service_healthy postgres: condition: service_healthy healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8084/health')"] interval: 10s timeout: 5s retries: 3 restart: unless-stopped networks: [internal] deploy: resources: limits: memory: 512M cpus: '1.0' loki: image: grafana/loki:latest profiles: ["monitoring"] ports: - "3100:3100" volumes: - ./monitoring/loki/loki-config.yaml:/etc/loki/local-config.yaml - loki_data:/loki command: -config.file=/etc/loki/local-config.yaml networks: [monitoring] deploy: resources: limits: memory: 512M cpus: '1.0' promtail: image: grafana/promtail:latest profiles: ["monitoring"] volumes: - ./monitoring/promtail/promtail-config.yaml:/etc/promtail/config.yaml - /var/run/docker.sock:/var/run/docker.sock:ro command: -config.file=/etc/promtail/config.yaml depends_on: - loki networks: [monitoring] deploy: resources: limits: memory: 512M cpus: '1.0' prometheus: image: prom/prometheus:latest profiles: ["monitoring"] ports: - "9090:9090" volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml - ./monitoring/prometheus/alert_rules.yml:/etc/prometheus/alert_rules.yml depends_on: - data-collector - strategy-engine - order-executor - portfolio-manager networks: [internal, monitoring] deploy: resources: limits: memory: 512M cpus: '1.0' grafana: image: grafana/grafana:latest profiles: ["monitoring"] ports: - "3000:3000" environment: GF_SECURITY_ADMIN_PASSWORD: admin GF_AUTH_ANONYMOUS_ENABLED: "true" volumes: - ./monitoring/grafana/provisioning:/etc/grafana/provisioning - ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards depends_on: - prometheus networks: [internal, monitoring] deploy: resources: limits: memory: 512M cpus: '1.0' volumes: redis_data: postgres_data: loki_data: networks: internal: driver: bridge monitoring: driver: bridge