# 自定义隔离网络,服务间稳定通信
networks:
  openclaw_net:
    driver: bridge

# 全局通用环境变量(统一管理,修改一次即可)
x-env: &global-env
  OLLAMA_MODEL: qwen2.5:14b-instruct-q5_k_m
  OPENCLAW_LOCAL_TOKEN: free_token
  TZ: Asia/Shanghai

services:
  # ==================== Ollama 核心服务 ====================
  ollama:
    image: ollama/ollama:latest
    container_name: ollama-server
    restart: unless-stopped
    networks: [openclaw_net]
    ports:
      - "11434:11434"
    volumes:
      - ./ollama-data:/root/.ollama
    environment:
      <<: *global-env
      OLLAMA_KEEP_ALIVE: "-1"
      OLLAMA_NUM_GPU: 99
      OLLAMA_HOST: 0.0.0.0
      OLLAMA_MAX_LOADED_MODELS: 1
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"]
      interval: 5s
      timeout: 3s
      retries: 15
      start_period: 20s
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
        limits:
          cpus: "8"
          memory: 24G

  # ==================== 模型拉取初始化容器 ====================
  ollama-init:
    image: ollama/ollama:latest
    container_name: ollama-init
    networks: [openclaw_net]
    depends_on:
      ollama: { condition: service_healthy }
    environment:
      <<: *global-env
      OLLAMA_HOST: http://ollama:11434
    entrypoint: ["/bin/sh", "-c"]
    command: |
      echo "==================================="
      echo "Ollama 初始化完成,开始拉取模型"
      echo "模型:${OLLAMA_MODEL}"
      echo "==================================="
      sleep 3
      retry=5
      until [ $retry -le 0 ] || ollama pull ${OLLAMA_MODEL}; do
        echo "拉取失败,剩余重试次数:$((retry-1))"
        sleep 5
        retry=$((retry-1))
      done
      if [ $retry -le 0 ]; then
        echo "模型拉取失败,退出"
        exit 1
      fi
      echo "==================================="
      echo "模型拉取成功!"
      echo "==================================="
    restart: on-failure:3

  # ==================== OpenClaw 配置初始化容器 ====================
  openclaw-init:
    image: ghcr.io/openclaw/openclaw:latest
    container_name: openclaw-init
    networks: [openclaw_net]
    depends_on:
      ollama-init: { condition: service_completed_successfully }
    volumes:
      - ./openclaw-workspace:/home/node/.openclaw
    environment:
      <<: *global-env
    entrypoint: ["/bin/sh", "-c"]
    command: |
      echo "==================================="
      echo "生成 OpenClaw 配置文件"
      echo "==================================="
      mkdir -p /home/node/.openclaw/workspace
      cat > /home/node/.openclaw/openclaw.json << EOF
      {
        "meta": {
          "lastTouchedVersion": "2026.3.24"
        },
        "models": {
          "providers": {
            "ollama": {
              "baseUrl": "http://ollama:11434",
              "apiKey": "ollama",
              "api": "ollama",
              "models": [
                {
                  "id": "${OLLAMA_MODEL}",
                  "name": "${OLLAMA_MODEL}",
                  "contextWindow": 32768,
                  "maxTokens": 8192
                }
              ]
            }
          }
        },
        "agents": {
          "defaults": {
            "model": {
              "primary": "ollama/${OLLAMA_MODEL}"
            }
          }
        },
        "gateway": {
          "mode": "local",
          "bind": "lan",
          "port": 18789,
          "controlUi": {
            "enabled": true,
            "allowInsecureAuth": true,
            "dangerouslyAllowHostHeaderOriginFallback": true,
            "dangerouslyDisableDeviceAuth": true
          },
          "auth": {
            "mode": "token",
            "token": "${OPENCLAW_LOCAL_TOKEN}"
          },
          "trustedProxies": ["172.0.0.0/8","192.168.0.0/16","10.0.0.0/8"]
        }
      }
      EOF
      echo "==================================="
      echo "配置文件生成完成!"
      echo "==================================="

  # ==================== OpenClaw 网关主服务 ====================
  openclaw-gateway:
    image: ghcr.io/openclaw/openclaw:latest
    container_name: openclaw-gateway
    restart: unless-stopped
    networks: [openclaw_net]
    ports:
      - "18789:18789"
    volumes:
      - ./openclaw-workspace:/home/node/.openclaw
    environment:
      <<: *global-env
      OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_LOCAL_TOKEN}
      OPENCLAW_ALLOW_INSECURE_PRIVATE_WS: "true"
    depends_on:
      openclaw-init: { condition: service_completed_successfully }
    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
    command: >
      openclaw gateway run
      --port 18789
      --bind lan
      --token ${OPENCLAW_LOCAL_TOKEN}

  # ==================== OpenClaw CLI 服务 ====================
  openclaw-cli:
    image: ghcr.io/openclaw/openclaw:latest
    container_name: openclaw-cli
    networks: [openclaw_net]
    environment:
      <<: *global-env
      OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_LOCAL_TOKEN}
      OPENCLAW_ALLOW_INSECURE_PRIVATE_WS: "true"
      BROWSER: echo
      CLAUDE_AI_SESSION_KEY: ""
      CLAUDE_WEB_SESSION_KEY: ""
      CLAUDE_WEB_COOKIE: ""
    volumes:
      - ./openclaw-workspace:/home/node/.openclaw
      - ./openclaw-workspace/workspace:/home/node/.openclaw/workspace
    stdin_open: true
    tty: true
    init: true
    entrypoint: ["node", "dist/index.js"]
    depends_on:
      openclaw-gateway:
        condition: service_healthy

Logo

免费领 150 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐