version: "3.9" services: nats: image: nats:2.10-alpine command: ["-js", "-m", "8222"] ports: - "4222:4222" - "8222:8222" volumes: - nats_data:/data deploy: replicas: 1 gateway: image: ${IMAGE_PREFIX:-cloudlysis}/gateway:${IMAGE_TAG:-dev} environment: GATEWAY_ADDR: 0.0.0.0:8080 GATEWAY_GRPC_ADDR: 0.0.0.0:8081 GATEWAY_STORAGE_PATH: /data/gateway.mdbx GATEWAY_ROUTING_NATS_URL: nats://nats:4222 GATEWAY_ROUTING_NATS_BUCKET: gateway.routing GATEWAY_ROUTING_NATS_KEY: routing.json ports: - "8080:8080" - "8081:8081" volumes: - gateway_data:/data deploy: replicas: 2 update_config: parallelism: 1 order: start-first failure_action: rollback rollback_config: parallelism: 1 order: stop-first aggregate: image: ${IMAGE_PREFIX:-cloudlysis}/aggregate:${IMAGE_TAG:-dev} environment: AGGREGATE_NATS_URL: nats://nats:4222 AGGREGATE_STORAGE_PATH: /data AGGREGATE_HTTP_ADDR: 0.0.0.0:8080 AGGREGATE_GRPC_ADDR: 0.0.0.0:50051 volumes: - aggregate_data:/data deploy: replicas: 3 placement: constraints: - node.labels.tenant_range != "" restart_policy: condition: on-failure projection: image: ${IMAGE_PREFIX:-cloudlysis}/projection:${IMAGE_TAG:-dev} environment: PROJECTION_NATS_URL: nats://nats:4222 PROJECTION_STREAM_NAME: AGGREGATE_EVENTS PROJECTION_DURABLE_NAME: projection PROJECTION_STORAGE_PATH: /data PROJECTION_MANIFEST_PATH: /config/projection-manifest.yaml PROJECTION_MULTI_TENANT: "true" PROJECTION_MAX_IN_FLIGHT: "128" PROJECTION_ACK_TIMEOUT_MS: "30000" PROJECTION_MAX_DELIVER: "10" PROJECTION_CONSUMER_MODE: single volumes: - projection_data:/data configs: - source: projection_manifest target: /config/projection-manifest.yaml deploy: replicas: 2 restart_policy: condition: on-failure update_config: parallelism: 1 order: start-first failure_action: rollback runner_saga: image: ${IMAGE_PREFIX:-cloudlysis}/runner:${IMAGE_TAG:-dev} environment: RUNNER_NATS_URL: nats://nats:4222 RUNNER_MODE: saga RUNNER_HTTP_ADDR: 0.0.0.0:8080 RUNNER_STORAGE_PATH: /data/runner.mdbx RUNNER_SAGA_MANIFEST_PATH: /config/sagas.yaml RUNNER_EFFECTS_MANIFEST_PATH: /config/effects.yaml # For production, point this at a real relay (SMTP/Resend/Postmark/SES) via effects config. RUNNER_SMTP_URL: "${RUNNER_SMTP_URL:-}" volumes: - runner_saga_data:/data configs: - source: runner_sagas target: /config/sagas.yaml - source: runner_effects target: /config/effects.yaml deploy: replicas: 1 runner_effect: image: ${IMAGE_PREFIX:-cloudlysis}/runner:${IMAGE_TAG:-dev} environment: RUNNER_NATS_URL: nats://nats:4222 RUNNER_MODE: effect RUNNER_HTTP_ADDR: 0.0.0.0:8081 RUNNER_STORAGE_PATH: /data/runner.mdbx RUNNER_EFFECTS_MANIFEST_PATH: /config/effects.yaml RUNNER_SMTP_URL: "${RUNNER_SMTP_URL:-}" volumes: - runner_effect_data:/data configs: - source: runner_effects target: /config/effects.yaml deploy: replicas: 1 configs: projection_manifest: file: ../../projection/projection-manifest.yaml runner_sagas: file: ../../runner/config/sagas.yaml runner_effects: file: ../../runner/config/effects.yaml volumes: aggregate_data: gateway_data: nats_data: projection_data: runner_effect_data: runner_saga_data: