services: openclaw-gateway: image: ${OPENCLAW_IMAGE:-ghcr.io/openclaw/openclaw:latest} container_name: openclaw-gateway # 你的 /volume2 无法正常 chown 给 UID 1000, # 因此当前环境用 root 运行,解决持久化目录写权限问题 user: "0:0" env_file: - .env environment: TZ: ${OPENCLAW_TZ:-Asia/Shanghai} HOME: /root OPENCLAW_HOME: /root TERM: xterm-256color OPENCLAW_STATE_DIR: /root/.openclaw OPENCLAW_CONFIG_PATH: /root/.openclaw/openclaw.json OPENCLAW_CONFIG_DIR: /root/.openclaw OPENCLAW_WORKSPACE_DIR: /root/.openclaw/workspace # OpenClaw 内部始终认 18789 OPENCLAW_GATEWAY_PORT: "18789" OPENCLAW_GATEWAY_BIND: ${OPENCLAW_GATEWAY_BIND:-lan} OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN} volumes: # 所有长期数据统一持久化 - /volume2/docker/docker_projects/openclaw/data:/root/.openclaw ports: # 宿主机 Web UI 2800 -> 容器 Gateway 18789 - "2800:18789" # 如果你希望 Bridge 外部仍用 2799 - "2799:18790" extra_hosts: - "host.docker.internal:host-gateway" init: true restart: unless-stopped command: [ "node", "dist/index.js", "gateway", "--bind", "lan", "--port", "18789" ] healthcheck: test: [ "CMD", "node", "-e", "fetch('http://127.0.0.1:18789/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" ] interval: 30s timeout: 5s retries: 5 start_period: 20s openclaw-cli: image: ${OPENCLAW_IMAGE:-ghcr.io/openclaw/openclaw:latest} container_name: openclaw-cli user: "0:0" env_file: - .env # 官方 Compose 就是让 CLI 与 Gateway 共用 network namespace network_mode: "service:openclaw-gateway" environment: TZ: ${OPENCLAW_TZ:-Asia/Shanghai} HOME: /root OPENCLAW_HOME: /root TERM: xterm-256color BROWSER: echo OPENCLAW_STATE_DIR: /root/.openclaw OPENCLAW_CONFIG_PATH: /root/.openclaw/openclaw.json OPENCLAW_CONFIG_DIR: /root/.openclaw OPENCLAW_WORKSPACE_DIR: /root/.openclaw/workspace OPENCLAW_GATEWAY_PORT: "18789" OPENCLAW_GATEWAY_BIND: ${OPENCLAW_GATEWAY_BIND:-lan} OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN} volumes: - /volume2/docker/docker_projects/openclaw/data:/root/.openclaw stdin_open: true tty: true init: true entrypoint: - node - dist/index.js depends_on: - openclaw-gateway