# Warden public multi-user — Docker Compose (Railway-compatible Linux) # Public: velocity gateway /setup /configure /sign /actions/* /v2/build-* # Loopback inside container: guardrail :8088, orchestrator :8091 # ZeroClaw daemon starts inside the image when WARDEN_START_ZEROCLAW=1 (default). services: warden: build: context: . dockerfile: Dockerfile ports: - "${WARDEN_PUBLIC_PORT:-8090}:8090" environment: SOLANA_NETWORK: devnet SOLANA_RPC_URL: ${SOLANA_RPC_URL:-https://api.devnet.solana.com} VELOCITY_OPERATOR_PUBKEY: ${VELOCITY_OPERATOR_PUBKEY:-} VELOCITY_USER_PDA: ${VELOCITY_USER_PDA:-} VELOCITY_MARKET_ALLOWLIST: SOL-PERP VELOCITY_POLL_INTERVAL_MS: ${VELOCITY_POLL_INTERVAL_MS:-15000} VELOCITY_CLIENT_POOL_MAX: ${VELOCITY_CLIENT_POOL_MAX:-32} VELOCITY_TOKEN_FAUCET: ${VELOCITY_TOKEN_FAUCET:-V4v1mQiAdLz4qwckEb45WqHYceYizoib39cDBHSWfaB} VELOCITY_DEVNET_DUSDT_MINT: ${VELOCITY_DEVNET_DUSDT_MINT:-GqmEqYsy8EyvofDpmtFxK8zhYrgWgNokAtYoduQdL7v6} WARDEN_PUBLIC_BASE_URL: ${WARDEN_PUBLIC_BASE_URL:-http://127.0.0.1:8090} GUARDRAIL_BASE_URL: http://127.0.0.1:8088 GATEWAY_BASE_URL: http://127.0.0.1:8090 ORCHESTRATOR_BASE_URL: http://127.0.0.1:8091 ORCHESTRATOR_DB_PATH: /app/data/orchestrator-db.json GUARDRAIL_DB_PATH: /app/data/guardrail.db GUARDRAIL_TOKEN_SECRET: ${GUARDRAIL_TOKEN_SECRET} GUARDRAIL_MAX_ACTION_QUOTE: ${GUARDRAIL_MAX_ACTION_QUOTE:-25} GUARDRAIL_DAILY_ACTION_CAP: ${GUARDRAIL_DAILY_ACTION_CAP:-3} GUARDRAIL_TOKEN_TTL_SECS: ${GUARDRAIL_TOKEN_TTL_SECS:-900} WARDEN_INTERNAL_TOKEN: ${WARDEN_INTERNAL_TOKEN:-} TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN} TELEGRAM_ALLOWED_USER_ID: ${TELEGRAM_ALLOWED_USER_ID:-} ONBOARD_MAX_DUSDT: ${ONBOARD_MAX_DUSDT:-10} FAUCET_GLOBAL_DAILY_CAP: ${FAUCET_GLOBAL_DAILY_CAP:-50} WATCH_CONCURRENCY: ${WATCH_CONCURRENCY:-3} volumes: - warden-data:/app/data - warden-workspace:/app/zeroclaw/workspace healthcheck: test: ["CMD", "curl", "-fsS", "http://127.0.0.1:8090/health"] interval: 30s timeout: 5s retries: 5 restart: unless-stopped volumes: warden-data: warden-workspace: