services: postgres-db: image: timescale/timescaledb:2.15.2-pg16 container_name: fundamental-postgres command: -c shared_preload_libraries=timescaledb environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: fundamental volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d fundamental"] interval: 5s timeout: 5s retries: 10 networks: - app-network restart: always nats: image: nats:2.9 container_name: fundamental-nats volumes: - nats_data:/data networks: - app-network restart: always data-persistence-service: image: harbor.3prism.ai/fundamental_analysis/data-persistence-service:latest container_name: data-persistence-service environment: HOST: 0.0.0.0 PORT: 3000 DATABASE_URL: postgresql://postgres:postgres@postgres-db:5432/fundamental RUST_LOG: info RUST_BACKTRACE: "1" SKIP_MIGRATIONS_ON_MISMATCH: "1" depends_on: postgres-db: condition: service_healthy healthcheck: test: ["CMD-SHELL", "curl -fsS http://localhost:3000/health >/dev/null || exit 1"] interval: 10s timeout: 5s retries: 5 networks: - app-network restart: always api-gateway: image: harbor.3prism.ai/fundamental_analysis/api-gateway:latest container_name: api-gateway environment: SERVER_PORT: 4000 NATS_ADDR: nats://nats:4222 DATA_PERSISTENCE_SERVICE_URL: http://data-persistence-service:3000 REPORT_GENERATOR_SERVICE_URL: http://report-generator-service:8004 RUST_LOG: info,axum=info RUST_BACKTRACE: "1" depends_on: nats: condition: service_started data-persistence-service: condition: service_healthy networks: - app-network healthcheck: test: ["CMD-SHELL", "curl -fsS http://localhost:4000/health >/dev/null || exit 1"] interval: 10s timeout: 5s retries: 5 restart: always alphavantage-provider-service: image: harbor.3prism.ai/fundamental_analysis/alphavantage-provider-service:latest container_name: alphavantage-provider-service volumes: - workflow_data:/mnt/workflow_data environment: SERVER_PORT: 8000 NATS_ADDR: nats://nats:4222 DATA_PERSISTENCE_SERVICE_URL: http://data-persistence-service:3000 API_GATEWAY_URL: http://api-gateway:4000 WORKFLOW_DATA_PATH: /mnt/workflow_data SERVICE_HOST: alphavantage-provider-service RUST_LOG: info RUST_BACKTRACE: "1" depends_on: - nats - data-persistence-service networks: - app-network restart: always tushare-provider-service: image: harbor.3prism.ai/fundamental_analysis/tushare-provider-service:latest container_name: tushare-provider-service volumes: - workflow_data:/mnt/workflow_data environment: SERVER_PORT: 8001 NATS_ADDR: nats://nats:4222 DATA_PERSISTENCE_SERVICE_URL: http://data-persistence-service:3000 TUSHARE_API_URL: http://api.waditu.com API_GATEWAY_URL: http://api-gateway:4000 WORKFLOW_DATA_PATH: /mnt/workflow_data SERVICE_HOST: tushare-provider-service RUST_LOG: info RUST_BACKTRACE: "1" depends_on: - nats - data-persistence-service networks: - app-network restart: always finnhub-provider-service: image: harbor.3prism.ai/fundamental_analysis/finnhub-provider-service:latest container_name: finnhub-provider-service volumes: - workflow_data:/mnt/workflow_data environment: SERVER_PORT: 8002 NATS_ADDR: nats://nats:4222 DATA_PERSISTENCE_SERVICE_URL: http://data-persistence-service:3000 FINNHUB_API_URL: https://finnhub.io/api/v1 API_GATEWAY_URL: http://api-gateway:4000 WORKFLOW_DATA_PATH: /mnt/workflow_data SERVICE_HOST: finnhub-provider-service RUST_LOG: info RUST_BACKTRACE: "1" depends_on: - nats - data-persistence-service networks: - app-network restart: always yfinance-provider-service: image: harbor.3prism.ai/fundamental_analysis/yfinance-provider-service:latest container_name: yfinance-provider-service volumes: - workflow_data:/mnt/workflow_data environment: SERVER_PORT: 8003 NATS_ADDR: nats://nats:4222 DATA_PERSISTENCE_SERVICE_URL: http://data-persistence-service:3000 API_GATEWAY_URL: http://api-gateway:4000 WORKFLOW_DATA_PATH: /mnt/workflow_data SERVICE_HOST: yfinance-provider-service RUST_LOG: info RUST_BACKTRACE: "1" depends_on: - nats - data-persistence-service networks: - app-network dns: - 8.8.8.8 - 8.8.4.4 restart: always report-generator-service: image: harbor.3prism.ai/fundamental_analysis/report-generator-service:latest container_name: report-generator-service volumes: - workflow_data:/mnt/workflow_data environment: SERVER_PORT: 8004 NATS_ADDR: nats://nats:4222 DATA_PERSISTENCE_SERVICE_URL: http://data-persistence-service:3000 GOTENBERG_URL: http://gotenberg:3000 WORKFLOW_DATA_PATH: /mnt/workflow_data RUST_LOG: info RUST_BACKTRACE: "1" depends_on: - nats - data-persistence-service - gotenberg networks: - app-network restart: always workflow-orchestrator-service: image: harbor.3prism.ai/fundamental_analysis/workflow-orchestrator-service:latest container_name: workflow-orchestrator-service volumes: - workflow_data:/mnt/workflow_data environment: SERVER_PORT: 8005 NATS_ADDR: nats://nats:4222 DATA_PERSISTENCE_SERVICE_URL: http://data-persistence-service:3000 WORKFLOW_DATA_PATH: /mnt/workflow_data RUST_LOG: info RUST_BACKTRACE: "1" depends_on: - nats - data-persistence-service networks: - app-network restart: always gotenberg: image: gotenberg/gotenberg:8 container_name: gotenberg networks: - app-network restart: always frontend: image: harbor.3prism.ai/fundamental_analysis/frontend:latest container_name: fundamental-frontend ports: - "28080:80" # Map host 28080 to container 80 (Nginx) depends_on: api-gateway: condition: service_healthy networks: - app-network restart: always volumes: workflow_data: pgdata: nats_data: networks: app-network: