☰
OpenClaw本地部署全攻略:从源码到Docker,避开会话锁与飞书截断坑
2026/9/28 5:33:10 网站建设 项目流程

最近因为工作流里需要统一管理多个 AI 工具,我开始折腾 OpenClaw 的本地部署。这个过程比想象中曲折:网上关于 OpenClaw 安装教程的内容不少,但大多只贴命令不解释原理,照抄也经常翻车。折腾了一周,踩遍了环境变量、Channel 选择、会话锁冲突的坑之后,我决定把源码安装和 Docker 安装两条路线的完整过程都整理出来,顺便把 "agent failed before reply: session file locked" 这类高频报错的排查思路写清楚。这篇教程适合 Windows 和 Ubuntu 用户,无论你是第一次接触 Agent 框架,还是已经跑过其他类似项目,都应该能从中获得一份可以直接照着做的清单。

1. 动手之前:先搞清楚这装的是什么,再决定装在哪

1.1 一个本地优先的 Agent 大管家

OpenClaw 本质上是把“大语言模型、消息渠道、工具调用”这三样东西串起来的一个本地 Agent 框架。你可以把它理解成一个住在你电脑里的“调度员”:它能接入像千问这样的模型服务,也能接到飞书、Teams、终端这些不同的对话入口,还能自己去读取本地文件、调用脚本、检索笔记。

最常见的玩法是:你把飞书机器人配好,然后像聊微信一样给机器人发任务,OpenClaw 自己去调模型、查资料、执行工具,最后把结果回给你。数据默认存在本地,不会强制走某个云端厂商,隐私方面比直接用网页版聊天工具要安心得多。

这个项目最吸引我的地方是它的“本地优先 + 多渠道接入”。市面上很多 Agent 产品只能在网页里玩,或者只能绑定某一个聊天软件,OpenClaw 却可以把所有入口统一到一个会话体系里。你在飞书上聊到一半,切到终端继续同一个话题,上下文是连着的。

1.2 源码安装和容器安装怎么选

先别急着敲命令,安装方式必须先定下来。OpenClaw 官方主推两种方式:源码安装和 Docker 安装。

源码安装适合需要二次开发、调试插件、或者想看清楚每个依赖细节的人。它的优点是完全透明,你可以随时改代码跑调试;缺点是环境容易“养脏”,今天装一个包,明天升级一个库,后天真机环境就废了。

Docker 安装适合“我只想让它赶紧跑起来”的大多数人。容器把运行时依赖全部隔离在一个镜像里,不会污染宿主机,升级就是切换镜像标签,回滚也很方便。缺点是调试起来隔了一层,想看日志得用 docker logs,想改启动参数得进容器。

我的建议是:如果你属于第一次接触,时间又紧,直接走 Docker Compose;如果你打算长期使用并且想深度定制,源码更适合。后面的内容两条路都会走一遍,你可以都过一眼再决定先用哪条。

1.3 安装前的硬性条件

开装之前先做一个硬件和软件检查,免得后面排查的时候搞不清楚是环境问题还是项目问题。

  • 操作系统:Windows 10/11 或 Ubuntu 20.04 及以上。Windows 下需要能正常启用 WSL2。
  • 内存:4GB 是底线,8GB 以上会舒服很多。OpenClaw 本身不算太吃内存,但如果同时跑多个模型连接和本地工具,内存不够会频繁 OOM。
  • 磁盘:预留 10GB 以上。源码、依赖、模型缓存、会话数据都会占空间。
  • 基础工具:Git,Python 3.10+(源码模式),Docker(容器模式)。如果你是 Windows,还有 Docker Desktop 和 WSL2 要装。
  • 一个大模型服务的 API Key:比如阿里云百炼的千问服务。不用 GPU,因为默认是调云端模型;想跑本地模型另说。

我第一次装的时候就是没注意 Python 版本,系统里的 Python 3.8 跑起来直接报语法错误。所以请务必先确认python3 --version的输出是 3.10 以上,再进入下一步。

2. 环境准备:Windows 和 Ubuntu 的最少必要配置

2.1 Windows:Docker Desktop 千万别装完就完事

Windows 上最容易卡住的不是 OpenClaw 本身,而是 Docker Desktop。很多教程只提一句“下载安装 Docker Desktop”,结果不少人装完发现拉镜像超时、容器起不来,大部分原因是没启用 Hyper-V 或 WSL2。

顺序应该是这样的:

  1. 打开“控制面板”启用 Windows 的虚拟化功能。你的 CPU 必须支持虚拟化,正常情况下 BIOS 里已经开了,如果没开,建议先检查主板设置。
  2. 在管理员 PowerShell 里安装 WSL2 内核并设置默认版本:
wsl --install wsl --set-default-version 2
  1. 安装 Docker Desktop,安装时勾选使用 WSL2 而不是 Hyper-V。
  2. 安装完把系统重启一遍,再打开 Docker Desktop 等引擎状态变绿。

验证 Docker 是否可用,跑一下最小测试:

docker --version docker run hello-world

能看到 “Hello from Docker!” 才算通过。如果docker run hello-world一直卡在等待响应,先检查 WSL2 是否正常:

wsl --status

一个很常见的坑:之前电脑上装过老掉牙的 Docker Toolbox,导致新旧 Docker 程序冲突,命令行指向的对象是旧的。遇到这种情况,先把旧的卸载干净,再重新执行上面第三步。

2.2 Ubuntu:docker 引擎别用太老的教程

Ubuntu 用户相对简单,但也要注意不要照搬几年前的老教程。现在 Ubuntu 软件源里的 Docker 包已经能直接用了,不过我更推荐用官方仓库把版本锁到近期的稳定版。

如果你不介意用软件源版本,最简洁的方式是:

sudo apt update sudo apt install docker.io docker-compose-plugin git python3 python3-venv python3-pip

注意包名是docker-compose-plugin,不是docker-compose,后者是老式的独立二进制,很多教程还在用,但官方已经在逐步淘汰了。

把当前用户加入 docker 组,避免每次敲 sudo:

sudo usermod -aG docker $USER

执行完这行命令后必须注销重新登录,否则组权限不会立刻生效。接着开启开机自启:

sudo systemctl enable --now docker

验证 Git 和 Python:

git --version python3 --version

在 Ubuntu 20.04 上,系统默认 Python 可能是 3.8,OpenClaw 源码要求 3.10+,那你就需要自己装新版本,常见方式是使用 deadsnakes PPA 或者自己编译,这里建议直接用 Docker 方式绕开。

2.3 关于“一键部署脚本”的正确姿势

网上经常会搜到“openclaw 本地一键部署”,很多人看到这句话就觉得省事。实际上一键部署脚本确实存在,本质上是官方把环境检查和容器启动流程打包成了一个 shell 脚本。它的用法通常是下载后执行,但我建议执行前先打开看一眼里面做了什么,尤其注意它有没有把数据目录放到奇怪的位置。

我的原则是:能用官方仓库里明确提供的脚本才用,从某个博客复制下来的脚本要谨慎。你可以把它下载下来,先head -80看看开头的变量定义和目录规划,确认了再跑。

如果你最终决定用源码手动安装,那这个脚本轮不到你;但如果你只是为了快速验证,用脚本在测试环境里跑一下完全没问题。

3. 实战一:源码方式安装,适合新手理解结构

3.1 获取源码和分支选择

源码安装的第一步是克隆仓库。如果你是在 Windows 上用源码,建议在 PowerShell 或者 VS Code 终端里操作,别用老旧的 CMD,因为路径编码问题很容易让你怀疑人生。

git clone <官方仓库地址> openclaw cd openclaw git checkout main git pull --tags

这里要强调分支选择。公开发布的大版本通常会有稳定分支或 release tag,比如v0.x.y。不要在生产环境里用dev分支,因为开发分支经常处于“能用但并不保证稳定”的状态。我第一次就是图新鲜切了 dev,结果两天内因为上游改动重启了三次服务,后来老实切回 release 分支。

进入目录后建议先花几分钟熟悉结构。你不需要立刻看懂全部代码,但要至少认识这几个关键位置:

  • config/:配置文件模板目录
  • data/:运行时产生的会话数据、日志、锁文件
  • plugins/:插件目录
  • docs/:文档和示例

data/这个目录尤其重要,后面所有的会话锁问题都跟它有关。

3.2 创建虚拟环境和安装依赖

Python 项目最怕的就是把依赖装到全局环境里,等哪天系统升级了,一个包版本不兼容,整个项目就崩了。所以虚拟环境这一步不能省。

python3 -m venv .venv source .venv/bin/activate

Windows 下的激活命令是:

.venv\Scripts\activate

激活成功后,命令行前面会出现(.venv)标志。这时候再安装依赖:

pip install --upgrade pip pip install -r requirements.txt

如果项目有可选依赖(比如要启用某些工具插件),通常还会有requirements-dev.txt或requirements-plugins.txt,按需安装即可。安装过程中如果网络频繁中断,可以考虑切换到离你较近的 PyPI 镜像源,但不建议因此跳过虚拟环境。

依赖装完后,先确认python -c "import openclaw"不报错,再继续下面步骤。

3.3 初始化配置文件和第一次启动

项目一般会提供一个.env.example模板,你要复制成.env再编辑:

cp .env.example .env nano .env

最少需要填三样:模型服务地址、API Key、模型名称。以千问为例:

OPENCLAW_MODEL_PROVIDER=openai-compatible OPENCLAW_MODEL_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 OPENCLAW_MODEL_API_KEY=sk-你的key OPENCLAW_MODEL_NAME=qwen-plus

填完先别设置 Channel,保持默认的 cli 或者留空。启动服务:

python -m openclaw serve

看到日志输出表示启动成功。接着开另一个终端,进入同一个虚拟环境,运行:

python -m openclaw chat

输入一句“你好”,如果模型通道配置正确,OpenClaw 会回复。这一步通过,说明基础链路已经打通了。

4. 实战二:Docker Compose 方式,最快跑通

4.1 准备目录和 compose 文件

Docker 路线才是大多数人应该选的路。你不需要在宿主机装 Python,不需要担心依赖冲突,只需要一个 Docker 环境。

先在某个工作目录里建项目文件夹:

mkdir -p ~/openclaw-docker/{config,data} cd ~/openclaw-docker

再写一个docker-compose.yml。下面这个示例是走千问的 OpenAI 兼容接口:

services: openclaw: image: openclaw/openclaw:latest container_name: openclaw restart: unless-stopped env_file: - .env environment: - OPENCLAW_CHANNEL=cli volumes: - ./config:/app/config - ./data:/app/data ports: - "3000:3000"

注意这里把环境变量放在.env文件里,避免密钥明晃晃地写在 compose 文件里。.env的内容和上面源码模式几乎一致,只是格式上不需要export前缀。

4.2 数据卷和 env_file

第一次启动前,务必确认./data目录已经挂载。容器本身是“一次性”的,如果数据写到容器内部,下次docker compose up -d重新创建容器时,会话数据、配置、日志全部丢失。这个坑,我见过太多人踩过。

启动命令:

docker compose up -d

看实时日志:

docker compose logs -f

如果日志里出现“model provider not configured”之类的提示,说明.env里的模型配置没被容器读到。检查一下.env文件名是否拼写对了,以及 env_file 的路径是否正确。

容器模式下查看运行状态:

docker compose ps

只要STATUS是Up,就说明服务在跑。接着用终端工具接入:

docker exec -it openclaw python -m openclaw chat

这样可以在容器内部启动一个 chat 客户端,验证服务是否正常。

4.3 镜像升级流程

用容器最大的红利就是升级不用重装系统。OpenClaw 更新频率不算低,但我的升级流程一直很固定:

  1. 先备份数据目录:
cp -r data>
  • 拉新镜像:
  • docker compose pull
    1. 重建并启动:
    docker compose down docker compose up -d

    绝对不要直接在容器运行的时候去删容器或者docker system prune,否则很容易连数据卷一起清掉。升级前备份 data 目录,这应该是肌肉记忆。

    5. 核心配置:让 OpenClaw 连上模型和 Channel

    5.1 选择模型 Provider:以千问为例

    OpenClaw 本身不内置模型,它做的事情是把你的消息包装成请求,发给某个模型服务,再把返回结果解析出来。所以选择 Provider 非常关键。

    为什么我推荐用千问作为第一个接入对象?因为它提供了 OpenAI 兼容接口,OpenClaw 对这种协议的适配最稳定,而且申请 API Key 的流程很顺畅。配置的时候 Provider 写成openai-compatible,然后把地址指向 DashScope 兼容模式的地址:

    OPENCLAW_MODEL_PROVIDER=openai-compatible OPENCLAW_MODEL_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 OPENCLAW_MODEL_API_KEY=sk-xxx OPENCLAW_MODEL_NAME=qwen-plus

    模型名称qwen-plus是通用的均衡型号,如果你想跑更轻量的任务可以填qwen-turbo,如果上下文要求更高可以填qwen-max。名称写错是最常见的“看起来安装失败”的原因——服务能启动,但一问就报model not found。

    补充一个细节:OPENCLAW_MODEL_NAME和OPENCLAW_MODEL_PROVIDER之间是有联动关系的。如果你之前跑过其他模型并留下了旧的环境变量,务必清理干净,否则新配置不生效。

    5.2 Channel 怎么选:别一上来就 All in

    Channel 是 OpenClaw 里特别重要的概念。我理解它就是一个通信入口:CLI、飞书、Teams、Obsidian 都是不同的 Channel。

    启动后第一次选择,我的建议是只选一个,就是 CLI。原因是 CLI 不需要回调地址、不需要配应用鉴权、不需要处理消息格式,纯本地就可以跑通。很多人一上来就想接飞书,结果飞书侧的三四个配置项没配齐,根本分不清是模型问题还是渠道问题,排错成本极高。

    当你确认 CLI 通道能正常对话后,再考虑启用第二个通道。配置方式是在环境变量里加一个列表:

    OPENCLAW_CHANNEL=cli,feishu

    多个 Channel 会同时监听,但要注意:不要两个服务实例指向同一个 data 目录去分别监听不同的 Channel。这会导致会话文件锁竞争,后面会说。

    5.3 验证连通性:第一次对话怎么算成功

    验证不是简单问一句“你好”收到回复就完了。我建议做三层验证:

    1. 普通问答:确认模型连接没问题。
    2. 工具调用:问“现在几点”,如果 OpenClaw 能调用时间工具来回答,说明 Agent 的工具链路是通的。
    3. 多轮上下文:问一个问题后再追问一句“我刚才说了什么”,如果能记住,说明会话持久化正常。

    这三个都通过,基础部署才算真正成功。如果第二步没有触发工具调用,先别急着怪 OpenClaw,很多模型在温度参数调得太高时,会直接“猜测答案”而不是调用工具。你可以在配置里把温度调到 0.2 左右,再试一次。

    下面这张表是我在验证阶段整理的高频故障对照:

    现象直接原因解决动作
    启动后一问就报 401API Key 错误或带空格重贴 Key,检查前后空格
    提示model not found模型名写错去模型服务商控制台确认型号全名
    回复一直是空白温度参数过高或上下文过长调低温度,缩小 context
    对话没有时间概念工具调用被禁用检查是否关闭了 tools 相关开关

    6. 把 Agent 接入真实办公渠道:飞书、Teams 与 Obsidian

    6.1 飞书:机器人创建与权限配置

    当 CLI 验证通过,你可以尝试把 Agent 接到飞书。

    第一步,在飞书开放平台创建一个企业自建应用。创建后你会拿到 App ID 和 App Secret,这两个值后续要填到配置文件。

    第二步,在“添加能力”里开通机器人。然后进入“事件订阅”,订阅im.message.receive_v1事件,并设置请求地址。请求地址必须是公网可以访问的 HTTPS URL,OpenClaw 会提供一个回调端点,你在反向代理层把外网请求转给本地端口即可。

    第三步,权限管理里至少要开启“获取与发送单聊、群组消息”的权限,并发布应用版本。这一步很多人会漏,权限没发布,机器人能收到事件但发不出消息。

    配置示例:

    OPENCLAW_CHANNEL=feishu OPENCLAW_FEISHU_APP_ID=cli_xxx OPENCLAW_FEISHU_APP_SECRET=xxxx OPENCLAW_FEISHU_ENCRYPT_KEY=xxxx OPENCLAW_FEISHU_VERIFICATION_TOKEN=xxxx

    跑起来后先在飞书里私聊你的机器人一句“你好”,观察 OpenClaw 日志。如果日志显示事件收到但没有回复,优先检查回调地址是否真的能被飞书访问。

    6.2 飞书输出截断:不是 Agent 的问题

    飞书接入后遇到的第一个高频麻烦就是“输出容易被截断”。这个热搜词几乎和安装教程绑定在一起,原因不是 OpenClaw 没把消息发完,而是飞书单条消息有长度上限,当回复文本太长时,超出的部分会被平台直接丢弃。

    解决办法有三种,按优先级排列:

    1. 限制单条回复长度:在配置里把消息分段逻辑打开,设置一个合理阈值,比如 2000 字。
    2. 改用消息卡片发送:卡片模式支持更复杂的排版和更长的内容,不会轻易被截断。
    3. 在系统提示词里让模型“先给结论,再列细节”,让回答天然更紧凑。

    我自己的配置是同时做了 1 和 3。分段能保证内容不丢,提示词约束能让模型少输出废话,体验会好很多。

    6.3 Teams 接入要点与 Obsidian 的玩法

    Teams 接入的原理和飞书类似,但鉴权用的是 Azure Bot Service 那套体系。你需要注册一个 Bot,拿到 App ID 和 Password,然后配置:

    OPENCLAW_CHANNEL=teams OPENCLAW_TEAMS_APP_ID=xxxx OPENCLAW_TEAMS_APP_PASSWORD=xxxx

    Teams 对消息频率有限制,短时间高频轮询容易触发限流,如果你只是个人助理场景,问题不大;如果要做群机器人,建议控制消息频次。

    Obsidian 方向则不太一样。OpenClaw 社区里很多人提到openclaw obsidian,其实玩的是“把笔记变成 Agent 记忆”。最简单的做法:在容器模式里把本机的 Obsidian 仓库目录挂载进去:

    volumes: - /your/obsidian/vault:/app/vault:ro

    然后告诉 OpenClaw 它可以在/app/vault目录下检索笔记。这样你的 Agent 相当于有了一个长期知识库,比每次贴上下文要高效得多。这个思路适合本地知识管理重度用户,不需要额外装复杂插件,效果却非常明显。

    7. 安装后遇到高频问题时,我的排查顺序

    7.1 先读日志,而不是瞎猜

    安装完之后遇到问题很正常,但排查的顺序很重要。我的一条铁律是:不先看日志,绝不乱改配置。

    源码模式下日志默认在data/logs/下,容器模式下直接:

    docker compose logs -f openclaw

    很多初学者在日志里看到一堆 ERROR 就慌了,其实大部分 ERROR 是伴随警告一起出现的,不影响主流程。正确的读法是:按时间线从头看,找到第一个 ERROR,那才是问题的起点。后面跟着的异常堆栈往往只是连锁反应。

    如果默认日志级别不够细,可以临时调整:

    OPENCLAW_LOG_LEVEL=DEBUG

    DEBUG 日志会输出每一次模型请求的完整链路,对排查“为什么回复是空”特别有用。排查完记得改回 INFO,否则日志文件增长会很快。

    7.2 session file locked (timeout 60000ms) 是怎么产生的

    这个报错值得单独拿出来说,因为它在热搜词里出现频率太高了,完整信息是agent failed before reply: session file locked (timeout 60000ms)。

    看到这个报错,我先解释一下背景:OpenClaw 用本地文件来维护会话状态,每一条会话都会对应一个 session 文件。为了保证多线程安全,对这个文件的写入要加锁。如果某个进程持有锁超过时间限制,其他进程就会拿到这个超时错误。

    常见产生原因有三个:

    • 同一个 data 目录被启动了多个 OpenClaw 实例。
    • 上次服务是被暴力杀掉(比如直接关闭终端窗口),锁没有正常释放。
    • 容器模式和源码本地模式混用了同一个 data 目录。

    完整排查链路如下:

    第一步,确认现在有几个 OpenClaw 进程在跑:

    ps aux | grep openclaw

    Windows 下用:

    tasklist | findstr openclaw

    第二步,把所有 OpenClaw 进程全部结束。这一步不要手软,只要不是你正在用的,杀干净。

    第三步,检查 Docker 侧是否还有残留容器:

    docker compose ps

    如果有多个同名服务在跑,直接docker compose down停掉。

    第四步,确认没有进程占用后,去 data 目录下的 session 文件夹找.lock后缀文件。注意:不要一上来就给这些文件做删除操作,先ls -la看看文件修改时间。如果时间非常老,大概率就是残留锁,可以备份后删除。

    第五步,清理完成后重启服务。正常情况下session file locked不会再出现。

    如果你用的是容器模式,最后还要检查一下容器内外的文件权限。特别是 Windows 挂载目录到 WSL2 时,权限模型比较奇怪,偶尔会出现文件明明没被占用,但锁一直拿不到的情况。这种情况最简单有效的办法是给挂载目录加权限,或者把数据卷换成 Docker 命名卷。

    7.3 几个“看起来像 bug”其实是配置问题的场景

    除了会话锁,还有很多问题看起来像是软件坏了,实则是配置细节没到位。

    比如“飞书收不到任何消息”,很多人会怀疑是 OpenClaw 的问题,但实际排查后发现:飞书开放平台上配置的 Encrypt Key 和 Verification Token 跟本地.env不一致。飞书的事件订阅会做签名校验,只要有一个值对不上,消息就会被丢在平台侧,日志里根本不会有任何报错。

    又比如“服务起来了,但无论发什么都是静默”,这种基本是 Channel 配了多个,但其中某个 Channel 的鉴权失败,OpenClaw 等外部回调超时后放弃了回复。排查方式就是看日志里有没有channel auth failed,有的话单独把那个 Channel 先禁掉。

    还有“千问返回空内容但没报错”,通常不是网络问题,而是模型服务端做了内容安全过滤,触发了静默丢弃。这种情况只能换一个更基础的问题复述一遍,或者调整系统提示词。

    下面这个表是我后来排查时一直对照的:

    报错/现象优先级第一时间检查
    session file locked高是否有多个实例、锁文件残留
    飞书收不到消息高verification token / encrypt key
    模型返回空中日志是否有过滤记录、temperature
    消息有去无回中Channel 鉴权、回调地址
    docker pull 超时低网络稳定性、镜像源

    最后分享我自己的一点习惯

    折腾这么多天,最深的感触是:OpenClaw 本身不难装,难的是装完之后能不能跑稳定。我现在的习惯是,升级前永远先备份 data 目录,改任何配置前先看一眼日志,任何新 Channel 都先在 CLI 通道验证完再启用。如果用一个词总结,就是“克制”——一次只改一个变量,出了问题才知道是哪个环节造成的。这套流程撑住了我把 OpenClaw 从测试机迁到常驻服务的全过程,也希望能给正在配置的你省下几个小时的排查时间。

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

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

    立即咨询