services: # Temporal Server (development mode with embedded UI) temporal: image: temporalio/temporal:latest container_name: temporal ports: - "7234:7233" # gRPC frontend - "8234:8233" # Web UI command: ["server", "start-dev", "--ip", "0.0.0.0"] healthcheck: test: ["CMD", "temporal", "operator", "cluster", "health"] interval: 10s timeout: 5s retries: 10 start_period: 30s # Conductor Server (with Temporal backend) conductor-server: build: context: .. dockerfile: docker/Dockerfile container_name: conductor-server ports: - "8080:8080" # Conductor REST API environment: - SPRING_PROFILES_ACTIVE=temporal - TEMPORAL_ADDRESS=temporal:7233 - TEMPORAL_NAMESPACE=conductor - JAVA_OPTS=-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 depends_on: temporal: condition: service_healthy healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/actuator/health/liveness"] interval: 30s timeout: 5s retries: 3 start_period: 60s # Initialize Temporal with search attributes init-temporal: image: temporalio/temporal:latest container_name: init-temporal depends_on: temporal: condition: service_healthy entrypoint: ["/bin/sh", "-c"] command: - | echo "Creating conductor namespace..." temporal operator namespace create conductor --address temporal:7233 || true sleep 2 echo "Registering search attributes..." temporal operator search-attribute create --address temporal:7233 --namespace conductor \ --name ConductorDefinitionType --type Keyword || true temporal operator search-attribute create --address temporal:7233 --namespace conductor \ --name ConductorDefinitionName --type Keyword || true temporal operator search-attribute create --address temporal:7233 --namespace conductor \ --name ConductorDefinitionVersion --type Int || true temporal operator search-attribute create --address temporal:7233 --namespace conductor \ --name ConductorWorkflowType --type Keyword || true temporal operator search-attribute create --address temporal:7233 --namespace conductor \ --name ConductorWorkflowVersion --type Int || true temporal operator search-attribute create --address temporal:7233 --namespace conductor \ --name ConductorStatus --type Keyword || true temporal operator search-attribute create --address temporal:7233 --namespace conductor \ --name ConductorCorrelationId --type Keyword || true temporal operator search-attribute create --address temporal:7233 --namespace conductor \ --name ConductorPriority --type Int || true temporal operator search-attribute create --address temporal:7233 --namespace conductor \ --name ConductorFailedTaskNames --type KeywordList || true temporal operator search-attribute create --address temporal:7233 --namespace conductor \ --name ConductorOwnerApp --type Keyword || true echo "Search attributes registered successfully!" # Conductor UI (using official image with server disabled) conductor-ui: image: conductoross/conductor-standalone:3.15.0 container_name: conductor-ui ports: - "5001:5000" entrypoint: ["/bin/sh", "-c"] command: ["nginx -g 'daemon off;'"] volumes: - ./nginx-ui.conf:/etc/nginx/http.d/default.conf:ro depends_on: conductor-server: condition: service_healthy networks: - default # Conductor Server (stub mode - for testing without Temporal) conductor-server-stub: build: context: .. dockerfile: docker/Dockerfile container_name: conductor-server-stub ports: - "8082:8080" environment: - SPRING_PROFILES_ACTIVE=stub - JAVA_OPTS=-XX:+UseContainerSupport -XX:MaxRAMPercentage=50.0 profiles: - stub healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/actuator/health/liveness"] interval: 30s timeout: 5s retries: 3 start_period: 30s networks: default: name: conductor-network