从零部署OpenClaw AI智能体:本地化、模块化与飞书集成实战
1. 项目概述为什么选择OpenClaw最近在AI智能体这个圈子里OpenClaw大家戏称“小龙虾”的热度是肉眼可见地高。作为一个开源、可本地部署的AI智能体框架它最大的吸引力在于能把那些动辄需要API调用、按token付费的复杂AI能力真正“搬”到你自己的电脑或服务器上。这意味着什么意味着数据隐私、意味着成本可控、更意味着你可以根据自己的业务逻辑深度定制一个24小时在线的AI助手。我最初接触OpenClaw是因为厌倦了在各种云服务商之间切换也受够了敏感数据上传云端带来的不安。我需要一个能处理内部文档、自动回复客户常见问题、甚至能联动公司内部系统比如CRM、飞书的“数字员工”。OpenClaw的架构设计正好切中了这个痛点它通过一个核心的“网关”Gateway来协调任务利用“技能”Skill来扩展能力再通过“连接器”Connector对接各种通讯平台如微信、飞书。整个体系清晰、模块化而且社区生态正在快速丰富。所以这篇内容不是一份官方的安装手册而是我花了几天时间在一台Ubuntu服务器和一台MacBook Pro上从零开始踩坑、调试最终成功部署并接入飞书的完整实录。我会把每一步的原理、遇到的坑以及怎么填上的都掰开揉碎了讲清楚。无论你是想在自己的开发机上尝鲜还是为公司部署一套内部AI助手希望这份经验能让你少走弯路。2. 环境准备与核心组件解析在动手安装之前我们必须先理解OpenClaw的“五脏六腑”。盲目安装只会导致后面问题频出连排查都无从下手。2.1 核心组件与它们的关系你可以把OpenClaw想象成一个现代化的餐厅OpenClaw Gateway网关这是餐厅的“总调度台”或“经理”。它接收所有来自客户微信、飞书的订单消息理解订单意图然后分派给后厨不同的“技能”去处理。它自己不炒菜只负责协调和路由。Skill技能这就是后厨的各位“大厨”。每个技能专精一道菜或一类菜。比如ChatSkill通用对话大厨负责闲聊和基础问答。DocQASkill文档问答大厨你上传的PDF、Word它都能读懂并回答相关问题。CodingSkill编程大厨能写代码、解释代码。你也可以自己培养开发新的大厨教他做特别的菜自定义业务逻辑。Connector连接器这是餐厅的“前台”和“送餐员”。它负责与外部世界沟通。微信连接器负责接收微信消息并送回回复飞书连接器同理。Gateway通过连接器与用户对话。Model Provider模型提供商这是餐厅的“食材供应商”。大厨们技能要做出好菜离不开优质的食材AI模型。OpenClaw本身不提供模型它支持对接多种“供应商”Ollama本地首选相当于你自己的“家庭农场”在本地机器上部署开源大模型如Llama 3、Qwen、DeepSeek等。免费、数据完全私有但对硬件有要求。OpenAI API / 智谱AI / 月之暗面等相当于从“大型超市”采购。方便、模型能力强但需要付费且数据需经第三方。MCPModel Context Protocol服务这是一个高级功能可以理解为给大厨配的“智能厨具”或“外部助手”。比如一个MCP服务可以连接数据库让技能在回答时能查询实时数据另一个可以操作Git让技能能帮你管理代码仓库。对于本机安装我们的核心目标就是在自己的电脑上搭建起这个完整的餐厅运营体系。2.2 硬件与基础软件要求安装方式主要有两种Docker容器化部署和本地Python环境部署。Docker方式更干净、隔离性好适合大多数生产环境和快速体验。Python原生方式则更灵活便于深度调试和开发。本文将以Docker方式为主线因为这是最推荐、最不易出错的方式。最低配置建议CPU支持AVX2指令集的现代CPU近5-6年的Intel/AMD处理器基本都支持。内存至少16GB。如果你打算在本地用Ollama跑一个7B参数量的模型这是底线。要更流畅地运行13B或更大模型建议32GB或以上。存储至少20GB可用空间用于存放Docker镜像、模型文件和项目数据。操作系统LinuxUbuntu 20.04/22.04, CentOS 7等、macOSIntel或Apple Silicon、Windows需通过WSL2运行Linux环境。本文示例将基于Ubuntu 22.04 LTS和macOS (Apple Silicon)进行。基础环境准备安装Docker与Docker Compose这是容器化部署的基石。Ubuntu上可以通过官方脚本一键安装curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker $USER # 将当前用户加入docker组避免每次用sudo newgrp docker # 刷新组权限或重新登录macOS上直接下载并安装 Docker Desktop 即可。安装后在终端运行docker --version和docker compose version验证。可选但推荐安装Ollama如果你想使用本地模型。访问 Ollama官网 下载对应系统的安装包或使用命令行安装Linuxcurl -fsSL https://ollama.com/install.sh | sh安装后拉取一个模型试试水比如轻量的llama3.2:1bollama pull llama3.2:1b ollama run llama3.2:1b # 交互式测试注意首次拉取模型可能需要较长时间取决于你的网络和模型大小。从7B模型开始尝试是更稳妥的选择。3. 基于Docker-Compose的一键部署实战这是最优雅的部署方式通过一个配置文件docker-compose.yml定义所有服务Gateway、Skill、Connector及其关系一键启动整个生态。3.1 获取部署配置文件与目录准备OpenClaw团队提供了标准的Docker-Compose模板我们需要稍作修改以适应本机环境。创建项目目录并进入mkdir -p ~/projects/openclaw cd ~/projects/openclaw这个目录将作为我们所有配置和数据的“工作空间”。下载官方docker-compose.yml模板 你可以从OpenClaw的GitHub仓库获取最新的配置文件。这里我直接给出一个针对本地Ollama优化的版本保存为docker-compose.yml。cat docker-compose.yml EOF version: 3.8 services: # OpenClaw 网关服务 - 大脑和调度中心 gateway: image: openclaw/openclaw-gateway:latest container_name: openclaw-gateway restart: unless-stopped ports: - 7890:7890 # 网关管理后台端口 environment: - OPENCLAW_LOG_LEVELINFO - OPENCLAW_GATEWAY_PORT7890 # 关键配置指定模型服务提供商为本地Ollama - OPENCLAW_MODEL_PROVIDERollama - OPENCLAW_OLLAMA_BASE_URLhttp://host.docker.internal:11434 # Mac/Docker Desktop的特殊主机名 # - OPENCLAW_OLLAMA_BASE_URLhttp://172.17.0.1:11434 # Linux下通常的Docker网关IP - OPENCLAW_DEFAULT_MODELllama3.2:3b # 指定默认使用的模型 volumes: - ./data/gateway:/app/data # 挂载数据卷持久化配置和会话 networks: - openclaw-network # 示例技能服务基础对话技能 skill-chat: image: openclaw/skill-chat:latest container_name: openclaw-skill-chat restart: unless-stopped environment: - OPENCLAW_SKILL_NAMEchat - OPENCLAW_GATEWAY_URLhttp://gateway:7890 # 内部网络访问网关 depends_on: - gateway networks: - openclaw-network # 示例连接器服务WebSocket连接器可用于测试或自定义前端 connector-ws: image: openclaw/connector-ws:latest container_name: openclaw-connector-ws restart: unless-stopped ports: - 7891:7891 environment: - OPENCLAW_CONNECTOR_NAMEwebsocket - OPENCLAW_GATEWAY_URLhttp://gateway:7890 - OPENCLAW_WS_PORT7891 depends_on: - gateway networks: - openclaw-network networks: openclaw-network: driver: bridge EOF3.2 配置文件关键参数详解与调整上面这个配置文件定义了三个服务我们需要重点关注几个关键环境变量OPENCLAW_OLLAMA_BASE_URL这是Gateway容器内访问你主机上Ollama服务的地址。macOS (Docker Desktop)使用http://host.docker.internal:11434。这是Docker Desktop提供的一个特殊域名指向宿主机。Linux情况稍复杂。如果Ollama安装在宿主机上Docker容器默认无法通过localhost访问宿主机服务。通常需要改用宿主机的Docker网关IP一般是172.17.0.1。你可以通过ip addr show docker0命令查看。更稳妥的方式是在启动Ollama时将其服务绑定到所有网络接口OLLAMA_HOST0.0.0.0 ollama serve然后在配置中使用宿主机的实际IP如http://192.168.1.100:11434。实操心得在Linux下我强烈建议将Ollama也容器化并与OpenClaw服务放在同一个Docker自定义网络中这样可以直接通过服务名如http://ollama:11434访问更稳定。下文会给出这种方案的配置。OPENCLAW_DEFAULT_MODEL指定Gateway默认调用的模型名称。这个名称必须与你在Ollama中拉取pull的模型名称完全一致。例如你运行了ollama pull qwen2.5:7b那么这里就应设置为qwen2.5:7b。端口映射7890:7890将容器的7890端口映射到宿主机的7890端口。这是OpenClaw Gateway的管理后台端口用于技能管理、连接器配置等。7891:7891WebSocket连接器的端口可用于测试消息收发。3.3 启动服务与验证在后台启动所有服务cd ~/projects/openclaw docker compose up -d命令执行后Docker会拉取所需的镜像并启动容器。使用docker compose ps查看所有容器状态确保都是Up。验证Gateway健康状态 打开浏览器访问http://localhost:7890。如果看到OpenClaw Gateway的欢迎页面或API文档如Swagger UI说明Gateway启动成功。测试技能注册 Gateway启动后skill-chat容器会主动向Gateway注册自己。你可以通过Gateway的API查看已注册的技能curl http://localhost:7890/api/v1/skills应该会返回一个JSON数组其中包含名为chat的技能信息。通过WebSocket进行简易对话测试 我们可以用简单的Python脚本或在线WebSocket测试工具连接ws://localhost:7891进行测试。这里用一个快速的Python脚本示例# test_ws.py import asyncio import websockets async def test(): uri ws://localhost:7891 async with websockets.connect(uri) as websocket: # 发送一条消息 message {text: 你好你是谁} await websocket.send(message) print(f {message}) # 接收回复 response await websocket.recv() print(f {response}) asyncio.run(test())运行前需安装websockets库 (pip install websockets)。如果收到包含模型回复的JSON响应恭喜你核心链路通了4. 进阶配置集成本地Ollama与飞书连接器基础框架跑通了但现在的“餐厅”只有一位大厨Chat Skill而且食材供应商Ollama还在外面。我们需要把它整合进来并开一个“飞书外卖窗口”。4.1 将Ollama容器化并接入同一网络为了更好的可移植性和管理我们把Ollama也放进Docker。修改docker-compose.yml在services部分添加Ollama服务并更新Gateway的配置。version: 3.8 services: # Ollama 服务 - 本地模型提供商 ollama: image: ollama/ollama:latest container_name: openclaw-ollama restart: unless-stopped ports: - 11434:11434 # 将Ollama的API端口暴露给宿主机方便管理 volumes: - ./data/ollama:/root/.ollama # 挂载卷持久化模型数据 networks: - openclaw-network # 可选容器启动后自动拉取一个常用模型 # command: # sh -c ollama pull llama3.2:3b ollama serve # OpenClaw 网关服务 gateway: image: openclaw/openclaw-gateway:latest container_name: openclaw-gateway restart: unless-stopped ports: - 7890:7890 environment: - OPENCLAW_LOG_LEVELINFO - OPENCLAW_GATEWAY_PORT7890 # 现在Ollama在同一个Docker网络内直接通过服务名访问 - OPENCLAW_MODEL_PROVIDERollama - OPENCLAW_OLLAMA_BASE_URLhttp://ollama:11434 # 关键修改点 - OPENCLAW_DEFAULT_MODELllama3.2:3b volumes: - ./data/gateway:/app/data depends_on: - ollama # 声明依赖确保ollama先启动 networks: - openclaw-network # ... skill-chat 和 connector-ws 配置保持不变 ... networks: openclaw-network: driver: bridge修改后操作停止旧服务docker compose down重新启动docker compose up -d进入Ollama容器拉取模型docker exec -it openclaw-ollama ollama pull llama3.2:3b你也可以在宿主机上通过curl http://localhost:11434/api/tags查看已拉取的模型列表。4.2 部署飞书连接器Connector飞书连接器需要额外的配置因为它需要与飞书开放平台交互。我们需要获取飞书应用的凭证。在飞书开放平台创建应用登录 飞书开放平台 进入“开发者后台”。创建“企业自建应用”记录下App ID和App Secret。在“事件订阅”中设置请求网址 URL。由于我们本地开发需要使用内网穿透工具如ngrok、localtunnel或frp将本地的某个端口如8090暴露到一个公网可访问的地址。假设你得到的地址是https://your-domain.ngrok.io那么请求网址就填https://your-domain.ngrok.io/feishu/events。在“事件订阅”中添加需要订阅的事件权限如im:message接收用户发给机器人的单聊消息、im:message.group_at_msg接收群聊中机器人的消息。在“权限管理”中为机器人添加im:message等接口的权限。生成并保存“校验令牌”Verification Token和“加密密钥”Encrypt Key这两个在配置连接器时会用到。在docker-compose.yml中添加飞书连接器服务services: # ... 其他服务 (ollama, gateway, skill-chat) ... # 飞书连接器 connector-feishu: image: openclaw/connector-feishu:latest # 确认镜像名称可能为 openclaw/connector-feishu container_name: openclaw-connector-feishu restart: unless-stopped ports: - 8090:8080 # 连接器监听8080端口映射到宿主机的8090 environment: - OPENCLAW_CONNECTOR_NAMEfeishu - OPENCLAW_GATEWAY_URLhttp://gateway:7890 # 飞书应用配置 - FEISHU_APP_ID你的App ID - FEISHU_APP_SECRET你的App Secret - FEISHU_VERIFICATION_TOKEN你的校验令牌 - FEISHU_ENCRYPT_KEY你的加密密钥 # 如果启用了加密则必须 - FEISHU_PORT8080 # 连接器内部监听端口 depends_on: - gateway networks: - openclaw-network配置与启动将上面的你的App ID等替换为实际值。运行docker compose up -d启动飞书连接器。确保你的内网穿透工具将宿主机的8090端口映射到了公网地址如https://your-domain.ngrok.io并且该地址已正确配置到飞书开放平台的“请求网址”中。在飞书开放平台“事件订阅”页面点击“保存”或“重新加载”平台会向你配置的URL发送一个带有challenge参数的验证请求。如果连接器配置正确它会自动响应并完成验证。你可以在连接器日志中查看docker logs -f openclaw-connector-feishu。在飞书中启用机器人在开放平台应用详情页找到“版本管理与发布”创建一个新版本并申请发布。审核通过后在飞书客户端中找到该机器人并添加到群聊或开始单聊。现在在群聊中机器人或私聊发送消息消息会通过飞书服务器 - 你的公网地址 - 飞书连接器 - Gateway - Chat Skill - Ollama模型 - 原路返回最终在飞书中收到机器人的回复。4.3 配置技能路由与模型选择默认情况下Gateway会将所有消息路由到ChatSkill。但OpenClaw的强大之处在于可以根据消息内容或上下文路由到不同的技能。这需要在Gateway中配置技能路由规则。访问Gateway管理界面http://localhost:7890。通常会有简单的管理UI或详细的API端点。配置路由规则例如你可以设置规则当消息包含“文档”关键词时路由到DocQASkill当消息以“/code”开头时路由到CodingSkill。具体的配置方式取决于Gateway的版本和UI设计可能需要通过API (/api/v1/rules) 或配置文件进行。动态切换模型除了默认模型你还可以在对话中通过特定指令如/model qwen2.5:14b来临时切换本次会话使用的模型。这需要技能或Gateway支持相应的指令解析功能。5. 常见问题排查与性能优化实录部署过程中几乎一定会遇到各种问题。下面是我踩过的一些坑和解决方案。5.1 启动与连接类问题问题1Gateway启动失败日志显示Failed to connect to Ollama排查检查Gateway容器中OPENCLAW_OLLAMA_BASE_URL环境变量设置是否正确。在容器内执行docker exec openclaw-gateway curl -v http://ollama:11434/api/tags看是否能通。如果Ollama在宿主机确保宿主机防火墙放行了11434端口并且Gateway容器使用了正确的宿主机IP非127.0.0.1。解决最推荐将Ollama容器化并与Gateway置于同一Docker网络使用服务名通信。问题2飞书连接器验证失败飞书平台提示“请求网址超时或返回错误”排查检查飞书连接器容器日志docker logs -f openclaw-connector-feishu看是否有启动错误。确认内网穿透工具工作正常公网地址能访问到宿主机的8090端口。可以在本地用curl http://localhost:8090/health测试连接器健康状态。检查飞书应用的环境变量配置是否正确特别是FEISHU_VERIFICATION_TOKEN。解决确保飞书连接器暴露的端口宿主机8090与内网穿透配置的端口一致且所有凭证无误。验证时查看连接器日志它应该会打印出飞书发来的验证请求并成功响应。问题3技能服务启动后在Gateway的/skillsAPI中看不到排查检查技能容器的日志看它是否在尝试向OPENCLAW_GATEWAY_URL注册时出错。常见原因是Gateway的地址不对容器内应用http://gateway:7890而非http://localhost:7890。解决确保技能服务的OPENCLAW_GATEWAY_URL配置为Gateway在Docker网络内的服务名和端口。5.2 模型与响应类问题问题4模型响应速度极慢或提示“超时”原因本地模型推理本身需要消耗大量计算资源。7B模型在CPU上推理可能需数秒甚至更久。优化硬件加速如果有NVIDIA GPU确保安装正确的Docker运行时nvidia-container-toolkit并在Ollama容器配置中启用GPU。在docker-compose.yml的ollama服务下添加deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu]同时在Ollama容器内使用ollama run llama3.2:7b时它会自动尝试使用GPU。模型量化使用量化版本的模型如llama3.2:3b-instruct-q4_K_M能在几乎不损失精度的情况下大幅降低内存占用和提升推理速度。调整Ollama参数通过Ollama的Modelfile或运行参数限制并发、调整上下文长度等避免资源耗尽。问题5模型回答质量不高或胡言乱语原因可能是模型本身能力有限或Prompt提示词设计不佳。优化升级模型尝试更大的模型如从7B升级到14B、70B或更换不同系列的模型如从Llama换到Qwen、DeepSeek。优化系统提示词System Prompt在Gateway或Skill层面可以配置一个更明确的系统提示词来约束模型行为。例如为ChatSkill添加提示词“你是一个专业的助理回答要简洁、准确。如果不知道就如实告知。”调整推理参数通过Ollama的API可以调整temperature创造性越低越确定、top_p核采样等参数使输出更稳定。5.3 数据持久化与备份所有容器的数据都应通过volumes映射到宿主机如上面配置中的./data/目录。定期备份这个./data目录即可。./data/ollama存放所有拉取的模型文件体积最大。./data/gateway存放Gateway的配置、会话历史等。未来添加的数据库如用于DocQASkill的向量数据库也应配置数据卷。5.4 监控与日志查看所有容器日志docker compose logs -f可以实时跟踪所有服务的日志输出对排查交互问题非常有用。查看单个容器日志docker logs -f container_name如docker logs -f openclaw-gateway。监控资源使用使用docker stats命令查看各容器的CPU、内存占用情况帮助判断性能瓶颈。6. 技能扩展与自定义开发入门OpenClaw的生态核心在于“技能”。除了使用官方和社区提供的技能自己开发技能才能最大化其价值。6.1 技能开发的基本概念一个Skill本质上是一个独立的HTTP服务它需要实现两个核心端点/describe(GET)返回技能的元数据包括技能名称、描述、支持的输入输出格式等。Gateway通过这个端点发现技能。/invoke(POST)执行技能的核心逻辑。接收来自Gateway的标准化请求包含用户输入、会话上下文等处理后返回结果。6.2 快速创建一个“天气查询”技能示例下面是一个极简的Python Flask技能示例创建技能项目目录mkdir -p ~/projects/my-weather-skill cd ~/projects/my-weather-skill编写技能代码app.pyfrom flask import Flask, request, jsonify import requests app Flask(__name__) # 1. 描述端点 app.route(/describe, methods[GET]) def describe(): return jsonify({ name: weather, description: 查询指定城市的实时天气, input_schema: { type: object, properties: { city: {type: string, description: 城市名称如北京} }, required: [city] } }) # 2. 调用端点 app.route(/invoke, methods[POST]) def invoke(): data request.json # 从Gateway的请求中提取参数 user_input data.get(input, {}) city user_input.get(city, 北京) # 默认城市 # 这里是你的业务逻辑调用一个天气API # 假设我们使用一个免费的天气API此处需替换为真实API api_key YOUR_API_KEY url fhttp://api.weatherapi.com/v1/current.json?key{api_key}q{city} try: resp requests.get(url, timeout5) weather_data resp.json() # 简化处理提取温度等信息 temp_c weather_data[current][temp_c] condition weather_data[current][condition][text] result_text f{city}的当前天气{condition}温度 {temp_c}°C。 except Exception as e: result_text f查询{city}天气失败{str(e)} # 返回标准格式的响应给Gateway return jsonify({ output: { type: text, content: result_text } }) if __name__ __main__: app.run(host0.0.0.0, port8080)创建DockerfileFROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [python, app.py]创建requirements.txtflask2.3.3 requests2.31.0构建并运行技能容器docker build -t my-weather-skill . docker run -d --name weather-skill --network openclaw_openclaw-network -p 8082:8080 my-weather-skill注意openclaw_openclaw-network是Docker Compose创建的默认网络名项目名_网络名。可以通过docker network ls查看并确认。在OpenClaw Gateway中注册技能 技能启动后需要让Gateway知道它的存在。这通常通过环境变量或Gateway的管理API完成。假设技能运行在weather-skill:8080容器名:端口。方式一推荐通过Gateway API动态注册如果Gateway支持curl -X POST http://localhost:7890/api/v1/skills/register \ -H Content-Type: application/json \ -d {name: weather, url: http://weather-skill:8080}方式二在Gateway配置文件中静态配置需修改Gateway配置并重启。测试技能 现在当你向机器人发送“查询北京天气”时Gateway应该能识别意图可能需要配置意图识别或关键词路由并将请求转发给你的weather技能最终将天气结果返回给用户。6.3 技能开发注意事项错误处理技能代码必须有健壮的错误处理并返回Gateway能理解的错误格式避免整个链路因一个技能失败而中断。性能技能应尽量快速响应超时设置要合理。长时间任务应考虑异步处理。配置化将API密钥、服务地址等敏感信息通过环境变量注入不要硬编码在代码中。日志在技能中输出结构化日志便于排查问题。通过以上步骤你不仅成功在本地部署了一个功能完整的OpenClaw智能体还了解了其核心架构、掌握了故障排查方法甚至迈出了自定义技能开发的第一步。这套系统就像乐高积木网关、连接器、技能、模型都是可插拔的模块。你可以根据需求替换更强的模型、开发更专业的技能、接入更多的办公平台构建出真正适合自己业务场景的AI助手。