services: server: environment: # Forgejo blocks webhook deliveries to private addresses by default, # which silently drops deliveries to the compose-internal steward. # Matches templates/forgejo/app.staging.example.ini ([webhook]). FORGEJO__webhook__ALLOWED_HOST_LIST: "private,loopback" merge-steward: build: # The Dockerfile copies services/merge-steward/*, .forgejo, and # deployment relative to the package root, matching the CI build # (.forgejo/workflows/merge-steward.yml). context: . dockerfile: services/merge-steward/Dockerfile image: "${MERGE_STEWARD_IMAGE:-eliza-merge-steward:local}" restart: unless-stopped environment: PORT: "8787" MERGE_STEWARD_DEPLOYMENT_MODE: "${MERGE_STEWARD_DEPLOYMENT_MODE:-local}" FORGEJO_BASE_URL: "${FORGEJO_BASE_URL:-http://server:3000}" FORGEJO_TOKEN_ENV: "FORGEJO_STEWARD_TOKEN" FORGEJO_WEBHOOK_SECRET_ENV: "FORGEJO_WEBHOOK_SECRET" FORGEJO_STEWARD_TOKEN: "${FORGEJO_STEWARD_TOKEN:?set FORGEJO_STEWARD_TOKEN}" FORGEJO_WEBHOOK_SECRET: "${FORGEJO_WEBHOOK_SECRET:?set FORGEJO_WEBHOOK_SECRET}" MERGE_STEWARD_API_AUTH_REQUIRED: "${MERGE_STEWARD_API_AUTH_REQUIRED:-false}" MERGE_STEWARD_API_TOKEN_ENV: "MERGE_STEWARD_API_TOKEN" MERGE_STEWARD_API_TOKEN: "${MERGE_STEWARD_API_TOKEN:-}" MERGE_STEWARD_METRICS_ENABLED: "${MERGE_STEWARD_METRICS_ENABLED:-true}" MERGE_STEWARD_METRICS_AUTH_REQUIRED: "${MERGE_STEWARD_METRICS_AUTH_REQUIRED:-false}" MERGE_STEWARD_OIDC_ENABLED: "${MERGE_STEWARD_OIDC_ENABLED:-false}" OIDC_ISSUER_URL: "${OIDC_ISSUER_URL:-}" OIDC_DISCOVERY_URL: "${OIDC_DISCOVERY_URL:-}" OIDC_JWKS_URL: "${OIDC_JWKS_URL:-}" OIDC_AUDIENCE: "${OIDC_AUDIENCE:-}" MERGE_STEWARD_OIDC_REQUIRED_ROLES: "${MERGE_STEWARD_OIDC_REQUIRED_ROLES:-}" MERGE_STEWARD_OIDC_REQUIRED_GROUPS: "${MERGE_STEWARD_OIDC_REQUIRED_GROUPS:-}" MERGE_STEWARD_OIDC_ADMIN_ROLES: "${MERGE_STEWARD_OIDC_ADMIN_ROLES:-}" MERGE_STEWARD_OIDC_ADMIN_GROUPS: "${MERGE_STEWARD_OIDC_ADMIN_GROUPS:-}" MERGE_STEWARD_MAX_BODY_BYTES: "${MERGE_STEWARD_MAX_BODY_BYTES:-1048576}" MERGE_STEWARD_WEBHOOK_REQUIRE_DELIVERY_ID: "${MERGE_STEWARD_WEBHOOK_REQUIRE_DELIVERY_ID:-false}" MERGE_STEWARD_EVENT_GATE_ENABLED: "${MERGE_STEWARD_EVENT_GATE_ENABLED:-false}" MERGE_STEWARD_EVENT_GATE_REPOSITORIES: "${MERGE_STEWARD_EVENT_GATE_REPOSITORIES:-}" MERGE_STEWARD_EVENT_GATE_TRUSTED_ACTORS: "${MERGE_STEWARD_EVENT_GATE_TRUSTED_ACTORS:-}" MERGE_STEWARD_EVENT_GATE_ALLOWED_KINDS: "${MERGE_STEWARD_EVENT_GATE_ALLOWED_KINDS:-}" MERGE_STEWARD_EVENT_GATE_COMMAND_PREFIXES: "${MERGE_STEWARD_EVENT_GATE_COMMAND_PREFIXES:-/eliza,/steward}" MERGE_STEWARD_EVENT_GATE_ALLOW_FORKS: "${MERGE_STEWARD_EVENT_GATE_ALLOW_FORKS:-false}" QUEUE_STORE_PATH: "/state/queue.json" FORGEJO_FEEDBACK_ENABLED: "${FORGEJO_FEEDBACK_ENABLED:-false}" FORGEJO_FEEDBACK_DRY_RUN: "${FORGEJO_FEEDBACK_DRY_RUN:-true}" FORGEJO_FEEDBACK_LABELS: "${FORGEJO_FEEDBACK_LABELS:-true}" FORGEJO_FEEDBACK_COMMENTS: "${FORGEJO_FEEDBACK_COMMENTS:-true}" FORGEJO_ENRICHMENT_ENABLED: "${FORGEJO_ENRICHMENT_ENABLED:-false}" FORGEJO_PROTECTED_BRANCHES: "${FORGEJO_PROTECTED_BRANCHES:-main,develop}" FORGEJO_REQUIRED_CHECKS: "${FORGEJO_REQUIRED_CHECKS:-}" FORGEJO_ENRICHMENT_PAGE_LIMIT: "${FORGEJO_ENRICHMENT_PAGE_LIMIT:-50}" FORGEJO_ENRICHMENT_MAX_PAGES: "${FORGEJO_ENRICHMENT_MAX_PAGES:-10}" MERGE_STEWARD_INTEGRATION_ENABLED: "${MERGE_STEWARD_INTEGRATION_ENABLED:-false}" MERGE_STEWARD_INTEGRATION_DRY_RUN: "${MERGE_STEWARD_INTEGRATION_DRY_RUN:-true}" MERGE_STEWARD_INTEGRATION_EXECUTOR: "${MERGE_STEWARD_INTEGRATION_EXECUTOR:-none}" MERGE_STEWARD_INTEGRATION_BATCHING: "${MERGE_STEWARD_INTEGRATION_BATCHING:-false}" MERGE_STEWARD_INTEGRATION_BRANCH_PREFIX: "${MERGE_STEWARD_INTEGRATION_BRANCH_PREFIX:-eliza-queue}" MERGE_STEWARD_INTEGRATION_BRANCH_MODE: "${MERGE_STEWARD_INTEGRATION_BRANCH_MODE:-reset}" MERGE_STEWARD_INTEGRATION_ALLOW_EMPTY_CHECKS: "${MERGE_STEWARD_INTEGRATION_ALLOW_EMPTY_CHECKS:-false}" MERGE_STEWARD_INTEGRATION_REMOTE_URL: "${MERGE_STEWARD_INTEGRATION_REMOTE_URL:-}" MERGE_STEWARD_INTEGRATION_WORK_DIR: "${MERGE_STEWARD_INTEGRATION_WORK_DIR:-/state/git}" MERGE_STEWARD_INTEGRATION_GIT_BINARY: "${MERGE_STEWARD_INTEGRATION_GIT_BINARY:-git}" MERGE_STEWARD_INTEGRATION_PUSH_BRANCH: "${MERGE_STEWARD_INTEGRATION_PUSH_BRANCH:-false}" MERGE_STEWARD_INTEGRATION_MERGE_METHOD: "${MERGE_STEWARD_INTEGRATION_MERGE_METHOD:-merge}" MERGE_STEWARD_INTEGRATION_DELETE_BRANCH_AFTER_MERGE: "${MERGE_STEWARD_INTEGRATION_DELETE_BRANCH_AFTER_MERGE:-false}" MERGE_STEWARD_INTEGRATION_MERGE_TITLE: "${MERGE_STEWARD_INTEGRATION_MERGE_TITLE:-}" MERGE_STEWARD_INTEGRATION_MERGE_MESSAGE: "${MERGE_STEWARD_INTEGRATION_MERGE_MESSAGE:-}" MERGE_STEWARD_CHECK_POLL_ATTEMPTS: "${MERGE_STEWARD_CHECK_POLL_ATTEMPTS:-1}" MERGE_STEWARD_CHECK_POLL_INTERVAL_MS: "${MERGE_STEWARD_CHECK_POLL_INTERVAL_MS:-0}" MERGE_STEWARD_WORKER_ENABLED: "${MERGE_STEWARD_WORKER_ENABLED:-false}" MERGE_STEWARD_WORKER_ID: "${MERGE_STEWARD_WORKER_ID:-merge-steward-worker}" MERGE_STEWARD_WORKER_POLL_INTERVAL_MS: "${MERGE_STEWARD_WORKER_POLL_INTERVAL_MS:-5000}" MERGE_STEWARD_WORKER_CONFIRM_LIVE_EXECUTION: "${MERGE_STEWARD_WORKER_CONFIRM_LIVE_EXECUTION:-false}" MERGE_STEWARD_WORKER_MAX_CONSECUTIVE_ERRORS: "${MERGE_STEWARD_WORKER_MAX_CONSECUTIVE_ERRORS:-5}" MERGE_STEWARD_WORKER_LEASE_ENABLED: "${MERGE_STEWARD_WORKER_LEASE_ENABLED:-true}" MERGE_STEWARD_WORKER_LEASE_ID: "${MERGE_STEWARD_WORKER_LEASE_ID:-merge-queue}" MERGE_STEWARD_WORKER_LEASE_TTL_MS: "${MERGE_STEWARD_WORKER_LEASE_TTL_MS:-30000}" MERGE_STEWARD_WORKER_LEASE_HEARTBEAT_INTERVAL_MS: "${MERGE_STEWARD_WORKER_LEASE_HEARTBEAT_INTERVAL_MS:-10000}" DATABASE_URL: "${MERGE_STEWARD_DATABASE_URL:-}" volumes: - merge-steward-state:/state ports: - "127.0.0.1:8787:8787" depends_on: - server networks: - forgejo volumes: merge-steward-state: