version: '3.9' services: # Catalog Registry: Provides schemas and metadata for all taskservs catalog-registry: image: provisioning/catalog-registry:latest container_name: catalog-registry restart: unless-stopped ports: - "8082:8082" environment: REGISTRY_PORT: "8082" EXTENSIONS_PATH: /extensions LOG_LEVEL: ${LOG_LEVEL:-info} volumes: - ./extensions:/extensions:ro - ./schemas:/schemas:ro healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8082/api/v1/health"] interval: 10s timeout: 5s retries: 3 start_period: 5s networks: - provisioning # Orchestrator: Batch workflow executor and taskserv coordinator orchestrator: image: provisioning/orchestrator:latest container_name: orchestrator restart: unless-stopped ports: - "9090:9090" environment: ORCHESTRATOR_PORT: "9090" REGISTRY_URL: http://catalog-registry:8082 ETCD_ENDPOINTS: http://etcd:2379 LOG_LEVEL: ${LOG_LEVEL:-info} volumes: - ./workflows:/workflows:rw - ./workspaces:/workspaces:rw - ./config:/config:ro depends_on: catalog-registry: condition: service_healthy etcd: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9090/api/v1/health"] interval: 10s timeout: 5s retries: 3 start_period: 10s networks: - provisioning # ETCD: Distributed coordination for orchestrator state etcd: image: quay.io/coreos/etcd:v3.5.11 container_name: etcd restart: unless-stopped ports: - "2379:2379" - "2380:2380" environment: ETCD_LISTEN_CLIENT_URLS: http://0.0.0.0:2379 ETCD_ADVERTISE_CLIENT_URLS: http://etcd:2379 ETCD_LISTEN_PEER_URLS: http://0.0.0.0:2380 ETCD_INITIAL_ADVERTISE_PEER_URLS: http://etcd:2380 ETCD_INITIAL_CLUSTER: "etcd=http://etcd:2380" ETCD_INITIAL_CLUSTER_STATE: "new" ETCD_INITIAL_CLUSTER_TOKEN: "provisioning-cluster" ETCD_NAME: "etcd" ETCD_SNAPSHOT_COUNT: "10000" ETCD_LOG_LEVEL: info volumes: - etcd-data:/etcd-data healthcheck: test: ["CMD", "etcdctl", "endpoint", "health"] interval: 10s timeout: 5s retries: 3 start_period: 5s networks: - provisioning # API Gateway: Frontend for local testing api-gateway: image: provisioning/api-gateway:latest container_name: api-gateway restart: unless-stopped ports: - "8080:8080" environment: GATEWAY_PORT: "8080" REGISTRY_URL: http://catalog-registry:8082 ORCHESTRATOR_URL: http://orchestrator:9090 LOG_LEVEL: ${LOG_LEVEL:-info} depends_on: catalog-registry: condition: service_healthy orchestrator: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/api/v1/health"] interval: 10s timeout: 5s retries: 3 start_period: 10s networks: - provisioning # Optional: Prometheus for metrics collection prometheus: image: prom/prometheus:latest container_name: prometheus restart: unless-stopped ports: - "9091:9090" volumes: - ./config/prometheus.yml:/etc/prometheus/prometheus.yml:ro - prometheus-data:/prometheus command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" networks: - provisioning volumes: etcd-data: driver: local prometheus-data: driver: local networks: provisioning: driver: bridge ipam: config: - subnet: 172.28.0.0/16