services: core: build: context: . dockerfile: apps/core-gateway/Dockerfile environment: PORT: "4020" CORE_GATEWAY_HOST: "0.0.0.0" CORE_PUBLIC_URL: "http://127.0.0.1:4020" CORE_FUNCTION_API_BASE: "http://core:4020" CORE_DATABASE_URL: "postgres://run402_core:run402_core_dev@postgres:5432/run402_core" CORE_POSTGREST_URL: "http://postgrest:3000" CORE_POSTGREST_PUBLIC_URL: "http://127.0.0.1:4300" RUN402_CORE_ROOT_PROJECT_ID: "${RUN402_CORE_ROOT_PROJECT_ID:-}" CORE_CONTENT_DIR: "/var/lib/run402-core/content" CORE_FUNCTION_WORKER_URL: "http://function-worker:4021" CORE_JWT_SECRET: "run402-core-local-jwt-secret-change-me" CORE_EMAIL_PROVIDER: "${CORE_EMAIL_PROVIDER:-disabled}" CORE_EMAIL_FROM_DOMAIN: "${CORE_EMAIL_FROM_DOMAIN:-}" CORE_EMAIL_SES_REGION: "${CORE_EMAIL_SES_REGION:-}" CORE_EMAIL_SES_ENDPOINT: "${CORE_EMAIL_SES_ENDPOINT:-}" CORE_EMAIL_INBOUND_PROVIDER: "${CORE_EMAIL_INBOUND_PROVIDER:-disabled}" CORE_EMAIL_INBOUND_DOMAINS: "${CORE_EMAIL_INBOUND_DOMAINS:-}" CORE_EMAIL_INBOUND_INGEST_TOKEN: "${CORE_EMAIL_INBOUND_INGEST_TOKEN:-}" CORE_EMAIL_INBOUND_SES_REGION: "${CORE_EMAIL_INBOUND_SES_REGION:-}" CORE_EMAIL_INBOUND_RAW_BUCKET: "${CORE_EMAIL_INBOUND_RAW_BUCKET:-}" CORE_EMAIL_INBOUND_RAW_PREFIX: "${CORE_EMAIL_INBOUND_RAW_PREFIX:-}" CORE_EMAIL_INBOUND_MAX_RAW_BYTES: "${CORE_EMAIL_INBOUND_MAX_RAW_BYTES:-}" CORE_WEBHOOK_DELIVERY_ENABLED: "${CORE_WEBHOOK_DELIVERY_ENABLED:-}" CORE_WEBHOOK_DELIVERY_INTERVAL_MS: "${CORE_WEBHOOK_DELIVERY_INTERVAL_MS:-}" CORE_WEBHOOK_DELIVERY_BATCH_SIZE: "${CORE_WEBHOOK_DELIVERY_BATCH_SIZE:-}" CORE_WEBHOOK_DELIVERY_TIMEOUT_MS: "${CORE_WEBHOOK_DELIVERY_TIMEOUT_MS:-}" CORE_WEBHOOK_DELIVERY_LEASE_MS: "${CORE_WEBHOOK_DELIVERY_LEASE_MS:-}" CORE_WEBHOOK_DELIVERY_MAX_ATTEMPTS: "${CORE_WEBHOOK_DELIVERY_MAX_ATTEMPTS:-}" CORE_WEBHOOK_DELIVERY_RETRY_BASE_MS: "${CORE_WEBHOOK_DELIVERY_RETRY_BASE_MS:-}" CORE_WEBHOOK_DELIVERY_RETRY_MAX_MS: "${CORE_WEBHOOK_DELIVERY_RETRY_MAX_MS:-}" ports: - "${CORE_GATEWAY_BIND:-127.0.0.1}:4020:4020" volumes: - run402-core-content-data:/var/lib/run402-core/content depends_on: postgres: condition: service_healthy postgrest: condition: service_started function-worker: condition: service_healthy healthcheck: test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:4020/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""] interval: 10s timeout: 5s retries: 12 function-worker: build: context: . dockerfile: apps/core-gateway/Dockerfile command: ["node", "apps/core-gateway/dist/function-worker.js"] environment: CORE_FUNCTION_WORKER_HOST: "0.0.0.0" CORE_FUNCTION_WORKER_PORT: "4021" CORE_CONTENT_DIR: "/var/lib/run402-core/content" CORE_FUNCTION_WORK_DIR: "/app/.run402-core/functions-runtime" NODE_ENV: "production" volumes: - run402-core-content-data:/var/lib/run402-core/content - run402-core-function-work-data:/app/.run402-core/functions-runtime mem_limit: 512m healthcheck: test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:4021/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""] interval: 10s timeout: 5s retries: 12 postgres: image: postgres:16.11-bookworm environment: POSTGRES_DB: run402_core POSTGRES_USER: run402_core POSTGRES_PASSWORD: run402_core_dev ports: - "${CORE_POSTGRES_BIND:-127.0.0.1}:55432:5432" volumes: - run402-core-postgres-data:/var/lib/postgresql/data - ./docker/postgres/init:/docker-entrypoint-initdb.d:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U run402_core -d run402_core"] interval: 5s timeout: 5s retries: 20 postgrest: image: postgrest/postgrest:v12.2.3 environment: PGRST_DB_URI: "postgres://authenticator:run402_core_authenticator_dev@postgres:5432/run402_core" PGRST_DB_SCHEMAS: "public" PGRST_DB_PRE_CONFIG: "postgrest.pre_config" PGRST_DB_ANON_ROLE: "anon" PGRST_JWT_SECRET: "run402-core-local-jwt-secret-change-me" depends_on: postgres: condition: service_healthy ports: - "${CORE_POSTGREST_BIND:-127.0.0.1}:4300:3000" bootstrap: image: postgres:16.11-bookworm profiles: ["bootstrap"] environment: PGPASSWORD: run402_core_dev depends_on: postgres: condition: service_healthy command: - psql - -h - postgres - -U - run402_core - -d - run402_core - -c - "SELECT 'run402 core bootstrap placeholder' AS status" volumes: run402-core-postgres-data: run402-core-content-data: run402-core-function-work-data: