☰
WSL+Docker+OpenClaw+飞书+Qwen:AI Agent本地部署全攻略
2026/10/21 3:30:40 网站建设 项目流程

如果你也有这样的需求:在Windows上折腾WSL+Docker部署一套OpenClaw,把它接进飞书机器人,再用Qwen大模型当“大脑”,那这篇保姆级教程就是为你准备的。我在这个组合上踩了不少坑,从WSL版本不对导致容器起不来、Docker网络配置混乱,到飞书事件订阅回调地址死活不通,再到Qwen接口配置字段大小写导致Agent直接报错……连着折腾了几天,最后总算跑通。这篇踩坑实录的价值在于,不只是告诉你“怎么装”,还会把每一步背后的原理和最容易卡住的环节都讲清楚,省得你再走一遍弯路。

如果你只是想让AI在网页端陪你聊天,那其实不用这么麻烦。但如果你希望它变成一个可以随时在飞书里指挥、能自主执行任务、还能基于中文场景设计工作流的AI Agent,那这套组合就非常值得折腾。保姆级的意思是:我假定你有一定的命令行基础,知道cd、vim大致是什么,但完全没到Linux专家的程度。整个过程我会拆成清晰的小步骤,每一步都告诉你预期看到什么、如果出错了从哪里查。

1. 部署前的架构认知:WSL+Docker+OpenClaw这套组合为什么要这样搭

1.1 OpenClaw到底解决什么问题:从“对话机器人”到“自主执行Agent”

很多人第一次接触OpenClaw,都会误以为它只是一个“接入了飞书的聊天机器人”。实际上它做的事情要多得多。它本质上是把一个具备工具调用能力的AI Agent(智能体)接到IM平台上,你可以通过飞书对话直接给它下发指令,它能自己去调用浏览器、查资料、操作文件,甚至编写和运行代码,然后把任务结果回传给你。

举个直观的例子:你在飞书里给它发一句“帮我查一下最近三天某个方向的论文动态,整理成中文摘要发过来”,如果只是普通聊天机器人,它最多给你一段通用的回复;但接入了OpenClaw的Agent,会先拆解任务,选择需要使用的工具,然后依次执行,最后把整理好的结果带回来。这种差异,就是“对话”和“干活”的区别。

这也是为什么我最终选择了这条链路:飞书负责“人和Agent之间的通道”,OpenClaw负责“把大模型的能力落地成能实际操作的动作”,Qwen负责“理解和生成内容”。三者各司其职,缺一个都不完整。对于个人开发者、小团队、想快速验证AI Agent场景的技术爱好者来说,这套组合是目前能低成本跑通整个闭环的经典方案。

1.2 为什么用WSL而不是直接在Windows上跑

OpenClaw这个项目本身对Linux环境支持最好,依赖项多、涉及容器和网络配置。虽然在Windows上也能通过一些方式硬跑,但坑非常多。最省心的做法,其实是借助WSL(Windows Subsystem for Linux)在Windows里跑一个轻量Linux环境。

选WSL而不是虚拟机,关键就是两个字:轻量和集成。它比VMware这类虚拟机开销小得多,而且和Windows的文件系统互操作做得很好。WSL2基于真正的Linux内核,几乎可以认为是Windows下运行Docker的“标准答案”。

有一个细节值得注意:WSL有WSL1和WSL2两种版本,两者差别非常大。WSL1是一个翻译层,兼容性有限,Docker跑起来会出现很多奇怪问题;WSL2是真正的轻量虚拟机,兼容性大幅提升。所以第一步就要确保你用的是WSL2,这一点我后面会专门说怎么检查、怎么切换。

1.3 为什么用Docker而不是裸机安装

OpenClaw的依赖项相当多,如果直接在WSL里裸装,很容易把系统环境搞得一团糟。比如Python版本冲突、Node.js版本不对、某些系统库缺失,光是解决依赖问题就要消耗不少时间。用Docker就是为了把整个环境“装进箱子”:依赖关系在镜像里就固定好了,拉下来一个镜像就能直接跑。

Docker给你带来的直接收益是“可重复”:换一台机器,几条命令就能恢复同样的环境;升级或回滚也很方便,只要切换镜像版本就行。对于博客教程场景来说,这也是最适合复现的方式。

不过,Docker本身也是这套方案里的一个坑点。它和WSL的协作关系、网络模式、文件挂载方式,都需要正确配置,否则就会出现“容器起来了但飞书回调不到”“容器日志刷了一堆连接错误”之类的问题。所以下面这些前置步骤,请耐心跟完。

2. WSL环境准备:最容易翻车的两个前置细节

2.1 安装WSL时版本不对,后面全白搭

如果你是从零开始配WSL,在Windows 10较新版本或Windows 11上,管理员权限的PowerShell里执行wsl --install就能自动装好。装完默认是WSL2,这点现在基本靠谱。但如果你以前装过旧版WSL,很可能还停留在WSL1,Docker会无法正常工作。

检查方法很简单,在Windows终端执行:

wsl --list --verbose

如果VERSION那一列不是2,就需要升级。先设置默认版本:

wsl --set-default-version 2

然后对指定发行版执行:

wsl --set-version <你的发行版名称,比如Ubuntu-22.04> 2

这一步可能会耗时几分钟,期间会有转换进度提示。在转换完成后,重新进WSL,用uname -a看看内核版本,如果显示的是以microsoft-standard-WSL2结尾的内核字符串,就说明已经是WSL2了。

提示:不要跳过这个检查。我见过太多人后面容器起不来,回头一查,最根本的原因就是WSL停留在1.0。这个错误藏得很深,因为表面上WSL能用,命令也能执行,但Docker底层网络根本起不来。

2.2 Docker实例连接:用Docker Desktop还是WSL内直接装docker

接入Docker有两种主流方式,很多人在这里懵了。

第一种是安装Docker Desktop,然后在它的设置里打开WSL集成,让WSL里可以直接使用Docker命令。这种方式图形化程度高,适合不太想碰命令行的人。我个人的体验是,Docker Desktop对Windows用户确实友好,但资源占用偏高,而且偶尔会出现和WSL版本不太匹配的情况。

第二种是直接在WSL发行版内部安装docker引擎。这种方式更“原生”,不依赖Docker Desktop,资源占用也小一些。但是需要手动处理一些细节,比如把当前用户加入docker用户组、配置docker服务开机自启等。

我最终用的是第二种方案,因为整体更干净,也更贴近Linux服务器的真实部署方式。安装docker引擎的步骤,在官方文档里都有标准命令,核心就是把apt源更新一下,然后安装docker.io或docker-ce。装完以后,记得把当前用户加入docker组,否则每次都要用sudo:

sudo usermod -aG docker $USER

然后注销重新登录,或者执行newgrp docker让组权限生效。

2.3 网络与文件系统:让容器端口真正暴露出来

WSL2的网络机制是NAT模式,相当于WSL内部是一个独立小局域网,Windows通过虚拟网卡访问它。大多数情况下,Windows本地程序访问WSL中的服务可以直接用localhost,因为WSL2有自动端口转发。但如果你把Docker容器端口映射到WSL的某个端口,Docker默认绑定的是127.0.0.1,外部就没法访问了。

我的经验是:在docker-compose.yml里,端口映射写成"3000:3000"是常见的标准写法,但这通常只映射到了WSL内部的localhost。如果更稳妥一些,建议写成"0.0.0.0:3000:3000",明确绑定到所有网卡,然后再在Windows防火墙里面放行。这块配置在飞书回调测试时非常关键,后面会反复踩到。

另一个很容易被忽略的问题是文件性能。WSL2里,Linux文件系统本身运行在ext4虚拟磁盘中,性能很好。但如果你把项目目录放到/mnt/c/(Windows磁盘挂载点)下面,再挂载进容器,磁盘IO性能会明显下降,容器构建时经常卡很久。所以请把项目目录放在WSL内部,比如~/openclaw,尽量避免放到/mnt/c下面。

3. 飞书机器人的“入口”打通:OpenClaw容器配置过程

3.1 飞书开放平台上申请应用的完整流程

飞书机器人的接入并不是“拿个webhook填进去”这么简单。要在飞书开放平台后台创建一个企业自建应用,然后在这个应用里启用机器人能力,最后配置事件订阅。整个流程是:创建应用、启用机器人、添加权限、配置事件订阅。

进入飞书开放平台后台后,选择“企业自建应用”,创建一个新应用。创建完进入应用详情,在“添加应用能力”里勾选“机器人”。然后去“权限管理”里添加机器人相关的权限,至少要包含“读取用户发给机器人的单聊消息”“获取群信息”“发送消息”这几项。

这里要特别提醒一点:飞书的权限模块是分版本管理的,不同的权限版本可能需要审核。个人开发环境一般是自己用,直接发布版本就行。但如果你是在企业内部正式使用,最好提前了解清楚审批流程。

3.2 OpenClaw容器配置:环境变量与配置文件两种方式

OpenClaw的配置,在不同版本里略有差异,但思路是统一的:你需要在启动容器之前,把飞书机器人的凭证和要使用的模型服务告诉它。我当时使用的是环境变量加配置文件的组合方式,下面是一个基于docker-compose的参考写法:

services: openclaw: image: openclaw/openclaw:latest container_name: openclaw restart: unless-stopped ports: - "0.0.0.0:3000:3000" environment: - CLAW_SERVER_URL=http://localhost:3000 - FEISHU_APP_ID=<你的飞书应用App ID> - FEISHU_APP_SECRET=<你的飞书应用App Secret> - FEISHU_MODE=websocket - OPENAI_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 - OPENAI_API_KEY=<你的DashScope API Key> - MODEL_NAME=qwen-plus - TZ=Asia/Shanghai volumes: - openclaw_data:/root/.claw volumes: openclaw_data:

提示:这是参考写法,不同版本的OpenClaw对环境变量的命名可能有差异。部署前请务必打开你下载版本的官方文档,确认变量名是FEISHU_APP_ID还是其他写法。整体结构是通用的,但细节一定要和文档对齐。

用docker-compose的好处是配置一目了然,而且可以随时改环境变量并docker compose up -d重新创建容器。数据目录通过volume挂载出来,后面升级容器时不会丢记忆和配置。

3.3 长连接模式:没有公网IP也能用飞书机器人

很多人卡在这一步是因为:飞书传统的事件订阅需要提供一个公网可访问的回调地址。也就是说,在飞书服务器看来,你本地跑的服务它在公网上访问不到。如果你没有云服务器或者公网IP,传统模式基本跑不通。

解决办法,是使用飞书的长连接模式(WebSocket模式)。这个模式的特点是:不是飞书服务器回调你的服务,而是你的服务主动连接到飞书服务端建立一个长连接,消息实时推送到这个连接上。这样你完全不需要公网IP,也不需要任何内网穿透工具。

在飞书开放平台后台,进入“事件订阅”页面,订阅方式选择“使用长连接接收事件”。然后添加需要订阅的事件,单聊消息事件是一定要的。需要注意,事件订阅里填的那些回调URL在长连接模式下不需要填写,但有些权限校验还是需要用到“Encrypt Key”和“Verification Token”,这两个值要拷贝到配置里,具体对应OpenClaw的环境变量名同样以官方文档为准。

这一步是整套方案里最关键的一个分水岭:懂了这个原理,你就明白为什么本地部署飞书机器人不需要公网服务器了。这也是我觉得这套组合最吸引人的地方——一台普通Windows电脑就能跑。

3.4 首次联调:从日志验证到消息回传

配置完成后,启动容器并实时查看日志:

docker-compose up -d docker logs -f openclaw

日志中出现websocket connected或者类似的成功连接信息,就说明长连接已经建立。这时候打开飞书,找到你这个应用的机器人,给它发一条私聊消息,哪怕只是“你好”。

如果你在日志里能看到消息的接收记录,比如received message: hello,说明飞书到OpenClaw这条路通了。接着它会触发大模型处理,处理完成后你会在飞书里收到回复。这个过程看似简单,但日志是唯一的真相来源。一旦没反应,第一件事就是看日志,而不是到处猜配置是不是写错。

4. Qwen大模型的接入:把“大脑”装进Agent

4.1 为什么选Qwen而不是其他模型

模型选型这件事,我没有用最流行的海外闭源模型,而是选了通义千问Qwen系列。原因有三点:中文表达能力好,尤其适合处理中文文档和指令理解;API价格相对友好,日常调试和跑实验不会心疼;更重要的是它提供OpenAI兼容格式的接口,这意味着OpenClaw这种为OpenAI接口设计的框架几乎零成本就能接入。

Qwen系列里有多个具体模型,比如qwen-plus、qwen-max、qwen-long等。我的建议是不要一上来就追最强的,先用性价比更高的模型把链路跑通,之后再按需切换。链路通了,换模型就是改一个变量名的事。

4.2 OpenAI兼容接口的配置方法与验证

Qwen的接口地址是DashScope平台提供的兼容模式,基础地址形如https://dashscope.aliyuncs.com/compatible-mode/v1。你在OpenClaw里把它配置为OPENAI_BASE_URL,同时用DashScope的API Key作为OPENAI_API_KEY,模型名填qwen-plus或qwen-max,就可以了。

配置前,我强烈建议先用最简单的curl验证一下这个接口有没有通,而不是直接依赖OpenClaw。如果curl都返回错误,那问题大概率出在API Key或接口地址上,免得锅甩给OpenClaw:

curl https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \ -H "Authorization: Bearer $DASHSCOPE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "qwen-plus", "messages": [{"role": "user", "content": "你好"}] }'

返回里包含content字段就是通了。这一步做完,你对接口的信任度就有了,后面排查问题时的范围就缩小到OpenClaw侧的配置。

4.3 模型参数调优:从能响应到答得准

接入成功只是第一步。你会发现,如果直接以默认参数使用,Agent的回答往往过于冗长,或者工具调用的逻辑不稳定。这些都需要通过调整模型参数来改善。

比较关键的参数是temperature、max_tokens和system prompt。temperature控制随机性,Agent执行任务时,我建议设置得偏低一些,比如0.3左右,这样回答更稳定、工具调用更果断;日常闲聊可以适当调高到0.7让回答更生动。max_tokens要结合任务长度设置,跑长文档总结时太短会被截断。

另一个容易忽略的是system prompt。OpenClaw默认定制的prompt适合通用场景,但如果你希望它更像一个“飞书里的智能助理”,可以根据自己的需求改一下角色定义、回复风格和行为约束。这个调整对最终体验的影响,有时的确是决定性的。

4.4 多模型搭配与自动回退

模型服务偶尔会有限流和波动,线上Agent如果直接暴露这种不稳定性,体验会很糟糕。OpenClaw支持配置多个模型,可以实现主模型和备用模型的切换。比如主qwen-max处理复杂任务,日常对话用qwen-plus;一旦主模型接口超时或报错,自动切到备用模型。

我当时的配置思路是,把qwen-max作为复杂任务和工具调用的主力,qwen-plus兜底。你可以根据实际调用量和成本需求灵活调整。这种小细节,平时看不出差别,但真正连续用几天就会发现稳定性的重要性。

5. 从零到一的完整部署实录:操作步骤与踩坑对照

5.1 部署总览:一张表看清完整链路

完整的部署链路可以归纳为下面这张表,建议你先通读一遍,再动手操作:

阶段核心任务预期结果
1WSL2环境安装与确认WSL版本显示为2
2Docker引擎安装与用户权限配置docker命令免sudo可执行
3获取飞书应用凭证并启用机器人拿到App ID、App Secret
4配置长连接事件订阅飞书后台无回调地址即可订阅事件
5编写docker-compose配置配置中包含飞书凭证和Qwen接口
6启动容器并查看日志日志显示长连接已建立
7飞书私聊机器人测试收到Agent回复

这张表是我在强推的“先画地图再出发”思路。很多部署失败,是因为边装边想、顺序颠倒。把链路先画出来,你会很清楚当前卡在哪一环,排查时也不会病急乱投医。

5.2 逐步操作详解

第一步,在管理员PowerShell里执行wsl --install,装完重启,进入发行版系统,用wsl --list --verbose确认是2。第二步,安装docker引擎,更新apt源后安装docker,然后加入docker用户组并验证docker run hello-world能跑通。第三步,到飞书开放平台创建应用、启用机器人、保存App ID和App Secret。第四步,在事件订阅里切换为长连接模式,把Encrypt Key等字段记录下来。第五步,创建项目目录,比如~/openclaw,在里面写docker-compose.yml。第六步,docker compose up -d启动。第七步,看日志验证连接状态。

每一步之间都有依赖关系。比如第三步的凭证,是第五步配置文件的输入。我建议每一步完成之后都做一个“确认动作”——比如跑一个最简单的命令、在后台看到一个明确的成功状态——再进入下一步。这能避免最后出错时无从下手。

5.3 部署后验收清单

跑通之后,不要急着关终端。我建议做一轮验收,确保的不是“恰好能用”,而是“稳定可用”。

  • 重启容器后,飞书机器人仍能正常工作,不需要重新配置。
  • 断网重连后,长连接能自动恢复。
  • 连续发多条指令,Agent都能正常处理,没有明显的错误率。
  • 在群聊中@机器人,它能正常响应(前提是你在权限里开了群聊权限)。
  • 容器日志里没有频繁的报错重试记录。

另外,把docker的restart: unless-stopped打开,万一Windows重启了,WSL会自动跟着起来,容器也会自动起。这能让你几乎感觉不到底层还有一套Linux环境。

5.4 踩坑对照表:报错信息与解决方案

下面这些是我实际遇到过的报错,以及对应的处理方式。如果你也撞上了,照着核对就行:

报错/现象根本原因解决方案
Docker Engine stopped或无法启动WSL未设置默认版本2执行wsl版本切换命令,确认VERSION为2
容器端口无法从Windows访问docker端口绑定到了127.0.0.1端口映射改为0.0.0.0:3000:3000
飞书机器人长时间不回复事件订阅未开启长连接模式后台切换长连接,重新启动容器
日志出现鉴权失败App Secret复制多了空格检查环境变量值前后是否有不可见字符
Qwen接口返回404dashboard接口地址不对确认基础地址带compatible-mode/v1完整路径
模型返回空内容max_tokens设置太小调大生成上限,或改用更大模型
容器启动后立即退出配置文件语法错误用docker compose config校验配置文件格式

这张表建议收藏。你实际部署时不一定全遇到,但遇到的时候,踩坑实录的价值就体现出来了。

6. 上线之后的体验优化:让Agent从“能用”到“好用”

6.1 会话持久化:容器重启不丢记忆

容器最大的一个特性是“无状态”。默认情况下,容器一旦删除,里面的数据就全部丢失。对用户来说,这就意味着Agent好不容易积累的上下文、自定义配置、对话历史,全都清零了。

因此,在docker-compose里通过volume把数据目录挂载出来至关重要。我在前面的参考配置里写了openclaw_data:/root/.claw,正是这个作用。你可以自己测试一下:和Agent聊一些能改变后续行为的内容,然后docker compose restart,再问它是否记得之前的内容。如果配置正确,它是记得的。

这个细节直接影响Agent的实用性。没有持久化,它就永远只会“失忆式”地跟你对话,每个任务都从零开始,体验大打折扣。

6.2 权限控制:谁可以在飞书群里使唤Agent

把Agent拉进群里之后,如果群成员都能@它执行任务,效率是高了,但风险也随之而来。尤其当Agent具备执行系统命令、操作文件等能力时,权限控制真的是安全底线。

我的做法是在OpenClaw里配置允许访问的用户或群组白名单,只放行可信的账号。飞书后台也可以对应用可见范围做限制,双重保险。这样一来,即使别人发现了你的机器人,也没法直接指挥它执行敏感操作。这一点,个人使用和团队使用都必须重视。

6.3 定时任务、主动推送与常用扩展

OpenClaw的价值不止于“你问它答”。它支持一定程度的工作流配置,可以把一些日常重复性任务做成定时触发。比如每天定时让Agent汇总项目进展、监控某个数据源的变动、定时把日报推送到群里。

这些配置我在实际使用时花了不少时间研究,但收益非常直观。当Agent不是等你开口才干活,而是按计划主动工作的时候,它才真正像一个“数字同事”。定时任务的基础前提仍然是长连接保持在线,所以前面那些稳定性配置都是地基。

6.4 性能与资源占用优化

WSL2加Docker的组合,在Windows上跑起来之后,内存占用通常比想象中高。如果电脑配置一般,建议给WSL设置一个内存上限,避免它吃满所有可用内存。

在Windows用户目录下新建.wslconfig文件,写入:

[wsl2] memory=4GB processors=4 swap=2GB

然后重启WSL即可生效。容器内部也可以限制模型请求的并发数,避免多个任务同时触发时卡死。这里我不建议你一口气把所有能力都开启,先把核心链路稳定跑起来,再逐步加功能扩展,是比较稳妥的节奏。

如果后续想让Agent能力更强,可以考虑接入更多外部工具、扩展知识库、连接其他IM平台、甚至把配置同步到多台机器上。WSL+Docker这套底座的好处就是改起来快,你完全可以按自己的需要持续迭代。

我在实际使用中最深刻的体会是:这套部署方案真正的分水岭,不在Docker命令有没有敲对,而在于你是否理解了飞书长连接、Docker端口映射、OpenAI兼容接口这三大核心概念。概念通了,后面所有配置都是水到渠成的事。最后再分享一个小技巧:所有环境变量值,我都习惯先存到一个env.txt文件里,复制到docker-compose之前用vim打开确认一遍前后有没有多余空格或隐藏字符。好几次排了半天查不出来的问题,最后都是这种低级错误导致的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询