☰
零基础部署OpenClaw:打造本地自托管AI智能助理全指南
2026/10/17 9:37:44 网站建设 项目流程

1. 项目概览与实际用途

先说说“小龙虾”到底是个什么东西。你如果常逛开源社区,应该见过一类自托管智能助理项目:它们把原本依赖云端服务的对话、任务编排、文件处理能力全部搬到本地,用一套配置文件把不同模型厂商的接口统一收拾干净,再通过一个本地网关暴露给各种客户端使用。OpenClaw(小龙虾)就是这类项目里比较有辨识度的一个,名字取了“爪”的谐音,Logo就是一只张牙舞爪的小龙虾,寓意是:本地抓取数据、本地调度任务、本地保护隐私,所有核心逻辑都攥在自己的“钳子”里。

我当初盯上它,主要因为三个痛点。第一,云端助手服务经常遇到网络抖动、限流、数据留存政策不透明的问题,我不想把日常日程、笔记、自动化脚本全交给某个封闭平台。第二,我的使用场景里有很多敏感度高的小任务,比如内网服务器的状态汇总、家庭 NAS 上的文件整理、本地开发环境的告警判断,这些不该过公网。第三,我手头有多个模型服务的 API Key,有免费的、有付费的、有自建的,想让它们统一在一个界面里被调度,而不是每个客户端配一遍。

小龙虾解决的就是这件事:它像一个本地“总调度台”,把所有模型服务接入、账号体系、会话历史、工具调用逻辑集中管理,对外提供统一的 API 和 Web 界面。你可以在浏览器里跟它连续对话,也可以给它绑上定时任务,让它每天早晨自动汇总天气、股票、待办清单,再推送到你的微信或钉钉机器人。它还能调用外部工具链,比如让模型去操作你的日历、读写指定目录、执行预设的 Shell 脚本。

适合谁来部署?三类人。一是自托管爱好者,喜欢把所有服务都用 Docker 跑在家里小主机上的那批人;二是做 AI 中间层开发的工程师,需要一个可控的、支持自定义工具的本地网关来调试 Prompt 和模型路由;三是隐私敏感型用户,希望对话数据只留在自己的机器上,不经过任何第三方服务器。

这篇流程我按自己的真实部署经验整理,从零开始,覆盖环境选型、依赖安装、配置文件编写、首次启动、常见报错排查,以及几个提升日常使用体验的调优技巧。我用的是最常见的小主机方案,如果你手头只有一台普通笔记本或者云服务器,步骤基本一样,只是性能和端口暴露策略要区别对待。

注意:小龙虾这个项目本身迭代很快,不同版本的配置项可能会有差异。我在文中会标注我实际验证过的版本范围,如果你拿到新版本发现字段对不上,优先看官方仓库里的示例配置,再回来对照排错。

2. 环境准备与依赖选型

2.1 硬件配置与系统要求

先聊硬件。小龙虾本身是个托管进程,真正消耗算力的是你对接的大语言模型推理服务。如果你用的是云端模型 API,本地只跑调度网关和 Web 服务,那 2 核 CPU、4GB 内存的小主机完全够用。我实际部署在一台退役的办公小主机上,常规配置:双核四线程、8GB 内存、一块 SATA 固态,跑着 Ubuntu 22.04 LTS,日常空闲内存占用不到 1.5GB,负载很低。

如果你打算让小龙虾对接本地运行的模型推理服务(比如通过 Ollama 这类工具跑量化模型),那硬件就要按推理需求来算。7B 量级的量化模型通常要 8GB 以上内存或显存,13B 到 70B 则需要 16GB 到 64GB。我建议优先把模型推理和小龙虾本体分开部署:一边是 GPU 服务器专门跑推理,一边是低功耗小主机跑小龙虾调度。这样调试互不干扰,升级任一侧都不需要同时重启两个服务。

系统方面,Linux 是首选,Windows 和 macOS 也能跑,但配置文件的路径写法、服务和开机自启的方式都有差异,排错时要留个心眼。我强烈建议你用 Linux,最好是 Debian 系的 Ubuntu 或 Debian,因为后面涉及的依赖包通过 apt 安装最省事。

2.2 软件依赖清单

部署小龙虾主要依赖以下几个关键组件:

  • Python 3.10 以上:主程序是用 Python 写的,我用的 3.11 版本,3.12 也没问题。系统自带的 Python 版本太低的话,建议用 pyenv 装一个独立版本,避免污染系统环境。
  • Node.js 18 以上:Web 前端构建和部分工具链依赖,反正直接装 Node 20 LTS 版本最稳。
  • Git:拉取源码和后续更新用。
  • Docker(可选但强烈推荐):小龙虾官方提供了 Docker 镜像,用容器方式部署能省掉绝大多数依赖冲突问题。如果你不想装 Docker,也可以直接跑源码,但你得有心理准备去手动安装一堆系统级依赖库。
  • Redis:用于会话缓存和任务队列,我在一个较新的版本里看到它把 Redis 列为必装组件。版本别太老,5.0 以上都能用。

还有几个间接依赖在第一次启动时会自动下载,比如 Python 的 requirements 列表、前端的 npm 包,需要你提前确认网络环境能访问官方源。如果你在无法直连外网的机器上部署,预先配置好 pip 和 npm 的镜像源能救大命。

2.3 安装步骤逐项说明

我以 Ubuntu 22.04 为例,给出依赖安装的完整命令。先更新系统软件源,然后一次性装上基础工具:

sudo apt update && sudo apt upgrade -y sudo apt install -y curl wget git build-essential \ python3 python3-pip python3-venv \ redis-server nginx certbot

这里我顺手把 nginx 和 certbot 也装上了,因为后面如果要把小龙虾暴露到公网访问,要么用反代加 HTTPS,要么用 Docker 映射端口。别急着跳过去,反代这步挺关键,尤其你打算在手机或同事电脑上访问的时候。

然后装 Node.js。用 NodeSource 官方源安装 LTS 版本:

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt install -y nodejs

装完检查版本,node -v 能在 v20.x,npm -v 能在 10.x 附近就对了。

Python 这边,Ubuntu 22.04 自带的是 Python 3.10,够用,但建议只把它当作系统 Python 保留,不要直接在系统层面 pip install 项目依赖。创建一个独立虚拟环境更安全。先把 venv 模块准备好,后面创建项目环境时直接复用。

Redis 装上后先启动并设为开机自启:

sudo systemctl enable redis-server sudo systemctl start redis-server redis-cli ping

如果返回 PONG,说明 Redis 正常。这一步很多人会漏,导致小龙虾启动时报连接不上 Redis 的错误。实际上报错信息也挺典型,后面排查章节我会再提。

2.4 为什么建议用 Docker 方式部署

我知道有人看到“源码部署”四个字就头大。如果你只是想在本地快速跑起来看效果,不想折腾一堆依赖版本,直接走 Docker 是最省心的路径。小龙虾官方提供的镜像已经内置了 Python 运行时、Redis 客户端和所有 Python 依赖,你只需要装一个 Docker Engine 和 Docker Compose 插件。

sudo apt install -y docker.io docker-compose-v2 sudo systemctl enable --now docker

然后找一个目录,比如 ~/openclaw,写一个 docker-compose.yml 配置。其实我第一次部署就是用的 Docker 方式,后来为了调试自定义工具链才切换到源码方式。给个建议:先跑通 Docker 版本,确认项目本身符合你的预期,再考虑要不要源码二开。千万别一上来就源码部署,遇到问题你会怀疑是自己的操作有问题还是项目本身有问题。

下面的配置是一个典型的单体部署模板:

version: "3.8" services: redis: image: redis:7-alpine container_name: openclaw-redis restart: unless-stopped volumes: - redis-data:/data openclaw: image: openclaw/openclaw:latest container_name: openclaw restart: unless-stopped ports: - "127.0.0.1:8765:8765" environment: - TZ=Asia/Shanghai - OPENCLAW_CONFIG_DIR=/etc/openclaw volumes: - ./config:/etc/openclaw - ./data:/var/lib/openclaw - openclaw-ssh:/root/.ssh depends_on: - redis volumes: redis-data: openclaw-ssh:

注意两个细节。第一,我把端口绑定写成了 127.0.0.1:8765:8765,这是只允许本机访问,配合 nginx 反代对外提供服务,避免你还没配认证就把管理界面裸奔到公网。第二,我挂载了一个 ssh 目录,这是给小龙虾调用外部的 SSH 工具链用的,比如通过 SSH 操作其他服务器。没有这个需求可以删掉,但留着不碍事。

Docker 方式还有个潜在好处:升级方便。只要拉新镜像、重启容器,就完成一次更新。源码方式升级要 git pull、重装依赖、重启服务,麻烦不少。

3. 核心配置与首次启动流程

3.1 配置文件结构认知

小龙虾的配置目录是整个项目的心脏。默认情况下,它会在指定目录下创建一份名为 config.toml 的主配置,以及一个存放自定义指令和工具脚本的目录。我见过不少新手上来就改主配置,结果把缩进写错、字段名拼错,进程起不来,然后一头雾水。其实配置文件不复杂,关键在于理解它的分层逻辑。

顶层是运行参数:服务端口、时区、日志级别、数据目录。再往下一层是模型提供方配置:你要接哪家的 API,Key 是什么,默认模型叫什么。再往下是工具链配置:哪些工具允许自动执行、哪些需要人工确认、白名单目录范围、命令黑名单。最后一层是会话与权限配置。

我用文字把你需要关注的配置项都拆开讲一讲。下面是我部署时用的一个简化示例,摘掉了 Key 等敏感信息:

[server] host = "127.0.0.1" port = 8765 log_level = "info" [storage] data_dir = "/var/lib/openclaw" redis_url = "redis://localhost:6379/0" [[models]] name = "local-main" type = "openai-compatible" base_url = "http://localhost:8000/v1" api_key = "EMPTY" model_id = "qwen2.5-14b-instruct" [[models]] name = "cloud-fallback" type = "openai-compatible" base_url = "https://api.example.com/v1" api_key = "sk-xxxxxxxxxxxxxxxxxx" model_id = "default-model" [routing] primary = "local-main" fallback = ["cloud-fallback"] [tools] enabled = ["shell", "web", "file", "calendar"] approval_mode = "ask" allowed_paths = ["/home/user/openclaw-workdir"] blocked_commands = ["rm -rf", "mkfs", "dd"] [web] enabled = true enable_upload = true

这里有几个坑,我一个个说明,避免你踩了才发现。

3.2 模型配置是重中之重

小龙虾本身没有推理能力,它只是一个调度网关。它需要两个东西才能跑出对话效果:一个符合 OpenAI 接口规范的模型服务,以及一个能稳定访问该服务的配置块。

第一种情况,你本地已经有 Ollama、vLLM 或其他推理服务在跑。比如你用 vLLM 拉起了一个 Qwen 模型,地址是 localhost:8000,那么配置里的 base_url 就填 http://localhost:8000/v1,api_key 随便填一个非空字符串(很多本地推理服务不校验 Key),model_id 要和推理服务里注册的模型名完全一致。不一致时,模型服务会直接返回 404。这是我第一次部署时卡最久的地方,还以为是小龙虾的问题,换了好几个配置模板,最后才发现是模型名写错了。

第二种情况,你用的是云端模型服务,那就更简单,base_url 填官方兼容接口地址,model_id 填模型标识,api_key 用自己的密钥。唯一要小心的是,密钥不要写进 config.toml 后不小心提交到 Git 仓库里,建议在环境变量里引用。

小龙虾支持配置多个模型提供方,然后设置路由策略。我的配置里把本地模型设为主力,云端模型设为备胎。这么设计的好处是:本地推理服务一旦挂了,小龙虾自动切换到云端模型,不影响业务连续性。如果两个都不通,它才会报错给你。这部分在古早版本里是写死在代码里的,现在通过配置就能改,灵活了不少。

3.3 工具链权限配置的思路

工具链是这项目真正的亮点。小龙虾不只是聊天,它还能调用 Shell、读写文件、发起 Web 请求、操作日历。但这些能力如果不受约束,就是一颗定时炸弹。我强烈建议你按照最小权限原则来配:

  • 工具的 enabled 列表只打开你真正要用的,别全部打开。比如你主要用来自动整理文档,那就只开 file 和 shell;不需要访问外部网页,就把 web 关掉。
  • approval_mode 建议设为 ask,也就是每次执行高风险操作前,先弹确认或者等你在 Web 界面里点一下允许。对于完全信任的自动化场景,你可以改成 auto,但我个人只在受控环境里才这么干。
  • allowed_paths 严格限制文件工具的读写范围。不要写 /root 或 /,否则它可能把整个系统都给你翻个底朝天。我只给它一个专门的工作目录。
  • blocked_commands 里放一些无论如何都不允许执行的危险命令,比如删除命令、格式化命令、磁盘操作命令。注意这里是按前缀匹配的,所以写 rm -rf 能拦住 rm -rf /,但拦不住 rm / -rf,真要防御得配合白名单或容器隔离。

我见过有人图省事,把 all 开头的危险操作全部关掉,结果隔天起来发现整个数据目录被自己的 Agent 脚本清空了。那些命令行工具默认不会帮你做破坏性决策,但如果你的 Prompt 本身写得模糊,模型就会基于自己的“理解”去执行,出事的概率并不低。

3.4 首次启动与初始化引导

一切配置就绪后,可以启动小龙虾。Docker 方式直接 docker compose up -d,等几秒后 docker compose logs -f 看输出。源码方式则是先激活虚拟环境,再安装依赖,最后启动:

cd ~/openclaw python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt python main.py --config /etc/openclaw/config.toml

首次启动时,程序会在命令行里输出一个初始化提示,比如让你访问某个本地地址去创建管理员账号。这时你打开浏览器,访问 http://127.0.0.1:8765 应该能看到一个欢迎页面,里面要求设置账号密码、选择工作模式、确认模型连接状态。

我实际测试发现,首次初始化逻辑在不同版本里变化挺大的。有的版本会要求你在页面上填模型服务信息;有的版本则完全信任 config.toml,页面只做登录和会话展示。如果你打开页面发现显示异常,多半是前端资源还没构建完。源码方式需要先执行 npm 构建前端,Docker 镜像则已内置。

初始化完成后,建议先在页面上发一条测试消息:“你好,介绍一下你的功能。”如果你的模型服务正常,小龙虾会返回一段自我介绍,并且页面上能看到本次请求调用了哪个模型。如果报错,打开日志文件。

3.5 反代与外网访问配置

本地访问没问题之后,很多人下一步就是想在任何地方访问小龙虾。这时我不建议直接开放 8765 端口,而是用 nginx 反代加 HTTPS。小龙虾本身的 Web 界面不带用户量很大的账号体系和访问控制,暴露到公网会让你面临暴力破解和漏洞扫描的双重压力。

我的做法是写一个 nginx 站点配置,核心部分如下:

server { listen 80; server_name assistant.example.com; location /.well-known/acme-challenge/ { root /var/www/challenges; } location / { proxy_pass http://127.0.0.1:8765; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 300s; } }

然后通过 certbot 自动申请证书,再把 80 端口重定向到 HTTPS。整个过程约五分钟,比直接把端口暴露出去安全得多。如果你部署在家庭带宽后面,还要在路由器上做端口映射,但我不建议你把 Web 管理界面暴露到公网,除非你真的需要,而且要加一层反代限流和 fail2ban 之类的东西。

4. 实操过程与核心环节实现

4.1 从克隆到启动的完整操作实录

我按源码部署方式走一遍完整流程,因为这最能暴露问题,也最能帮你理解系统各组件之间的关系。先拉取代码:

git clone https://github.com/your-repo/openclaw.git ~/openclaw cd ~/openclaw git checkout v0.4.2

我这里特意切到一个我验证过的版本,避免最新版配置结构有变动。如果你是第一次玩,也建议先固定版本,等跑通后再更新。

接着创建虚拟环境并安装依赖。源码安装的依赖分两大部分:Python 后端依赖和 Node 前端依赖。Python 依赖通常包含 dozens 个包,安装时间取决于网络环境,两分钟到十几分钟不等。前端依赖更多,npm install 有时候让人等到崩溃。

python3 -m venv venv source venv/bin/activate pip install -U pip wheel pip install -r requirements.txt

如果有某个包编译失败,最常见的原因是缺系统级的开发头文件。比如某个依赖需要 libffi-dev、libssl-dev、zlib1g-dev,apt 装上再重新 pip install 就好。我排障时习惯先装一套完整的常用的编译依赖包,省得每次缺啥补啥。

然后是构建前端:

cd frontend npm install npm run build cd ..

构建成功后,会在 frontend/dist 目录下生成一堆静态文件。后端启动时会自动托管这些文件。如果跳过构建直接启动,你会看到登录页能开,但是样式全丢,控制台报资源 404。

创建配置目录并放入我们前面写的 config.toml:

mkdir -p /etc/openclaw cp config.example.toml /etc/openclaw/config.toml nano /etc/openclaw/config.toml

改配置时,我只调整了模型区和你前面看到的工具权限部分,其余保持默认。用 nano 编辑完,Ctrl+O 保存,Ctrl+X 退出。

启动前先跑一次自检命令。我看到较新的版本提供了一个不错的健康检查命令:

python main.py --config /etc/openclaw/config.toml --self-check

它会检查配置文件里的关键字段是否能解析、依赖组件是否可用、存储目录是否可写,并在最后给出通过或不通过的提示。这个功能非常适合在正式启动前确认环境没问题。

自检通过后,用 systemd 将小龙虾注册成系统服务最稳妥。建一个服务文件:

[Unit] Description=OpenClaw Service After=network.target redis-server.service [Service] Type=simple User=openclaw Group=openclaw WorkingDirectory=/home/openclaw/openclaw ExecStart=/home/openclaw/openclaw/venv/bin/python main.py --config /etc/openclaw/config.toml Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target

注意,我特意建了一个名叫 openclaw 的系统用户来运行服务,而不是用 root。用普通用户跑能降低安全风险,目录权限至少要保证这个用户对配置目录是只读、对数据目录是可写。添加用户和授权:

sudo useradd -r -s /usr/sbin/nologin openclaw sudo mkdir -p /var/lib/openclaw sudo chown -R openclaw:openclaw /var/lib/openclaw /etc/openclaw

之后用 systemctl enable --now openclaw 启动并设置开机自启。到这里,一个完整的源码部署就算跑通了。

4.2 多模型路由与自动故障切换

很多人并不知道小龙虾最值得玩的是多模型路由能力。它可以把一个请求按规则分发到不同模型,再根据返回质量决定是否重新调用其他模型。

举个例子。我配置了三个模型提供方:一个本地快速模型用于简单问答,一个高精度云端模型用于复杂推理,一个廉价模型用于批量总结。我可以在配置里写路由规则,让小龙虾根据提问长度和关键词自动选择模型。比如:

[routing] strategy = "first-match" [[routing.rules]] name = "complex-reasoning" model = "cloud-fallback" keyword = ["分析", "推理", "总结报告", "规划"] [[routing.rules]] name = "quick-chat" model = "local-main" max_tokens = 1024

这配置的意图是:包含“分析、推理、总结报告、规划”等关键词的请求自动打到云端高精度模型,其他请求走本地快速模型。如果你不想搞规则,也可以把 strategy 改成 round-robin 或 latency-based,让系统自动选择延迟最低的模型。

故障切换就更有用了。我在一个自动化脚本里让小龙虾每天调用云端模型生成摘要,结果某天云端 API 临时维护,返回 503。如果没有 fallback 配置,任务直接失败;有了 fallback,小龙虾自动把请求转到备用模型,当天任务顺利完成,只是返回速度慢了几秒。这个功能在生产环境里属于“用不到最好,用到能救命”的级别。

4.3 定时任务与自动化工作流

小龙虾内置了调度器,可以定义定时触发的工作流。这个功能让“本地助手”真正变成“自动管家”。我实际配置过几个典型的定时任务,分享给你参考。

第一个是每日晨报。每天早上 8 点,小龙虾抓取天气、日历、待办事项,然后用模型生成一段简报,推送到钉钉机器人。配置文件大致是:

[[schedules]] name = "morning-briefing" cron = "0 8 * * *" task = "briefing" params = { include_weather = true, include_calendar = true } notify = ["dingtalk"]

第二个是每周知识库整理。每周日晚 10 点,扫描指定目录下新增的笔记文件,让模型提取每个文件的核心摘要,更新到本地知识库索引里。

[[schedules]] name = "weekly-notes-index" cron = "0 22 * * 0" task = "index_files" params = { dir = "/home/user/notes", output = "/var/lib/openclaw/knowledge.db" }

配置好之后,任务不是立即生效的。你需要在小龙虾管理界面里手动同步一次任务状态,或者重启服务让它重新加载配置。我一开始以为改配置就自动生效,结果等了一整天任务都没跑,重启后才正常。

定时任务里最容易被忽略的是时区。如果你的服务器时区不是 Asia/Shanghai,cron 表达式里的 0 8 * * * 就会按 UTC 时间执行,等于实际运行时间是北京时间下午 4 点。我用 docker 部署时踩过这个坑,第一次看日志才发现执行时间完全不对。

4.4 Web 界面与移动端体验

小龙虾自带的 Web 界面没有我之前担心的那么简陋,它实际上是一个完整的聊天工作台。左侧是会话列表,中间是对话窗口,右侧可以切换工具面板,查看当前会话调用过哪些工具、每个工具返回了什么结果。首次登录后,我建议先把界面上的偏好设置改好,比如默认模型、响应语言、音量开关(新版有个 TTS 朗读功能,我觉得还不错)。

手机端方面,不需要额外装 App,直接用浏览器访问反代地址,界面会自动响应。我日常在手机上查看定时任务的执行结果,回个消息、让它查点资料,响应速度和桌面端没差别。

不过移动端的会话连续性有个小问题:如果你中途关掉浏览器,再次打开可能被要求重新登录,会话记录还在,但需要手动从列表里点开。这个体验还能接受,至少数据没丢。

5. 常见问题与排查技巧实录

5.1 服务启动失败的几种典型情况

我帮你把部署中最高频的启动失败场景都列一下,很多是我自己或朋友踩过的。对照症状排查,会快很多。

第一种,启动后提示配置解析错误。Toml 格式看起来简单,但中文注释里的全角符号或字符串没加引号就会导致解析失败。日志里一般会带行号和列号,直接跳到对应位置检查。有过一次,我把模型名称写成了 abc“大模型”,带了个中文引号,Toml 解析直接报错,改回普通字母就正常了。

第二种,连接 Redis 失败。错误形如 redis.exceptions.ConnectionError。检查 Redis 是否运行、服务地址是否正确。源码方式部署时,如果 Redis 跑在容器里而小龙虾跑在宿主机上,地址就不能写 localhost。记住服务间的网络隔离问题,容器用服务名访问 Redis,宿主机访问容器端口用 127.0.0.1。

第三种,模型请求报 404。日志里显示 HTTP 404 Not Found,多半是 model_id 和模型服务端的不一致。用 curl 直接请求模型服务的 /v1/models 看返回列表,从中复制准确名称。

第四种,前端资源加载失败。界面打开白屏或 404,通常是前端没有构建,或者构建产物目录与后端托管目录不一致。源码方式部署,确认 frontend/dist 是否存在;Docker 方式部署,确认镜像版本是否完整,不要用半截的构建缓存。

第五种,权限不足导致数据写入失败。启动后日志提示 Permission denied 在某个数据目录。创建服务用户后忘了给目录赋权是常见原因。chown 后重启即可。

5.2 模型请求超时与并发限制

小龙虾默认对模型请求的超时时间是 60 秒,本地推理服务如果速度慢,容易出现超时。尤其你跑参数量较大的模型,加上机器没有 GPU 加速,一次推理可能要两三分钟,60 秒根本不够。

遇到这种情况,在配置里的模型块中调整超时参数:

[[models]] name = "local-main" timeout = 300

我实际测试过,本地跑 14B 量化模型,长文本生成超过 3 分钟是常态,把这个参数调到 300 基本就够了。如果你同时开了多个会话,每个请求都排队推理,超时还要再放宽,同时要确保 Redis 的任务队列不会积压太多,否则内存占用会明显上涨。

并发问题还有另一面:云端 API 的速率限制。小龙虾的 Web 界面里允许你开启并发问答,但同一瞬间多个请求打到云端可能触发 429 Too Many Requests。我的建议是把并发数调到 2 以下,或者在配置里加上限流参数,避免被云端服务临时封禁。

5.3 工具链调用失败的排查思路

工具调用失败的表现很多:返回结果为空、报权限错误、超时。从最简单的排查开始。

第一步,看日志里有没有工具执行记录。小龙虾对每次工具调用都会输出结构化日志,里面包含工具名、输入参数、退出码和标准输出。如果日志里没有记录,检查工具的 enabled 列表里是否真的包含该工具,很多用户改了配置但没重启,工具列表还是上一次的。

第二步,Shell 工具执行失败要检查绝对路径。比如你让它执行 docker ps,但小龙虾运行环境里 docker 命令不在 PATH 中,你会看到 command not found。我建议在配置里指定 shell 的可用环境变量,比如:

[tools.shell] env = { PATH = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" }

第三步,文件工具默认的工作目录和 allowed_paths 不匹配。如果 allowed_paths 里没有当前路径,工具会拒绝执行,返回的提示不是“文件不存在”,而是“路径不在允许范围”。这其实是好事,说明权限控制生效了;但如果你确实需要操作那个目录,把路径加到白名单里即可。

5.4 高占用与内存泄漏的定位方法

小龙虾跑久了,内存占用会缓慢上涨。这未必是内存泄漏,更可能是会话历史没有清理。每开一个长会话,历史消息缓存就一直留着,对话轮次多了之后,内存自然涨。小龙虾配置里有一个会话窗口大小的参数,用于控制保留多少条历史消息。调小这个值,内存就降下去了,代价是模型能记住的上下文变短。

如果你怀疑真存在泄漏,可以用 systemd 自带的内存统计命令查看:

systemctl status openclaw

systemd 默认记录服务进程的最大内存占用。如果每次重启后一两天内内存从 300MB 涨到 1.5GB,先看是不是某个工具脚本循环调用没有退出;如果持续缓慢上涨到崩溃,再考虑换一个长期运行的发布版本。

还有一个隐性内存消耗点:前端页面开启的 SSE 长连接。多个浏览器标签页同时打开小龙虾界面,每一个都算服务端的一个活跃连接,都会占用一些内存。我在手机上和管理页面上同时开着,内存会比仅命令行调用时高出一截。

5.5 配置更新后何时需要重启

小龙虾的配置加载机制不是所有字段都支持热更新。我整理了一个经验表,方便你判断改动后要不要重启:

  • 端口、日志级别、存储目录改动:必须重启。
  • 模型提供方配置改动:必须重启。
  • 路由规则改动:必须重启。
  • 工具启用列表改动:必须重启。
  • 会话历史长度、超时时间改动:改完会在新会话中生效,不需要重启。
  • 定时任务改动:最好重启,虽然管理界面有同步按钮,但重启最稳妥。

这个经验表是我自己一遍遍试出来的。早期我为了一个工具开关的热更新问题反复折腾,后来干脆统一:凡是配置文件的改动,一律重启服务。反正服务启动也就几秒钟,比排查“为什么改了没生效”省时间多了。

6. 进阶玩法与性能调优

6.1 自定义工具脚本开发

小龙虾的工具框架允许你用 Python 写自定义工具,注册到系统后就能在对话中调用。我举一个实际例子:我需要让小龙虾定期获取某个内网服务的健康状态,然后生成报告。

在工具目录下新建一个脚本,比如 tools/health_check.py,实现一个函数并用装饰器注册:

# tools/health_check.py from openclaw.tools import register_tool @register_tool(name="health_check", description="检查内网各服务健康状态") def health_check(service: str = "") -> str: """调用内网巡检脚本并返回摘要""" import subprocess if service == "": result = subprocess.run(["bash", "scripts/check_all.sh"], capture_output=True, text=True) else: result = subprocess.run(["bash", "scripts/check_one.sh", service], capture_output=True, text=True) return result.stdout

在配置文件里启用该工具,之后你问“检查一下所有服务状态”,小龙虾就会自动调用这个函数。比起让模型直接执行 Shell 命令,自定义脚本的好处是逻辑完全由你掌控,可以避掉很多危险命令的误判。开发时建议从小工具做起,先让它返回固定字符串,确认链路通了,再逐步加复杂逻辑。

6.2 知识库与长期记忆

小龙虾支持挂载向量知识库,这样你问它内部文档里的内容时,它能先检索再生成,而不是完全靠模型训练数据里的知识。对我来说,这个功能最大的实用价值是:我把家庭设备的使用手册、网络拓扑、常用脚本说明都整理成了 Markdown 文档,灌入知识库后,问“家里的网盘为什么连不上,应该先检查哪里”,它能给出非常符合我环境的指引,而不是网上搜来的通用教程。

知识库的配置不复杂,核心是文档目录和向量化模型地址:

[knowledge] enabled = true source_dirs = ["/home/user/openclaw-workdir/docs"] index_path = "/var/lib/openclaw/vector_index" embedding_model = "local-embed" chunk_size = 512 chunk_overlap = 64

首次构建索引会比较慢,文件较多时可能要等好几分钟。索引完成后,后续新增文档可以触发增量更新。我用下来感觉 chunk_size 在 300 到 500 之间,对中文文档的检索效果最均衡;太小会丢失上下文,太大又容易把不相关内容混在一起。

6.3 日志策略与数据备份

日志默认全量输出,跑得越久文件越大。建议在配置文件里加一个轮转策略,按天或按大小切割。我用的是按 50MB 分割、保留最近 7 份,既有足够的排错信息又不至于占满磁盘。

备份方面,重点备份三个东西:数据目录、配置文件、知识库索引。创建索引后所有内容都在本地,直接打包带走即可。我写了一个简单的 cron 脚本,每天凌晨把这三个目录打包上传到家里的 NAS:

#!/bin/bash BACKUP_DIR=/var/lib/backups/openclaw DATE=$(date +%F) mkdir -p $BACKUP_DIR tar -czf $BACKUP_DIR/config-$DATE.tar.gz /etc/openclaw tar -czf $BACKUP_DIR/data-$DATE.tar.gz /var/lib/openclaw find $BACKUP_DIR -mtime +7 -type f -name "*.tar.gz" -delete

这个脚本不难,但救过我的命。有次我调整配置,误删了一个工作目录,重启后模型还能跑,但之前给小龙虾建的一堆自定义工具配置全没了。多亏有备份,拉回来只损失了当天的改动。

6.4 性能瓶颈识别与硬件升级建议

如果你觉得小龙虾响应变慢了,先别急着加内存。用系统监控工具看一下瓶颈在哪:

htop ss -s iostat -x 1

最常见的瓶颈是 CPU 占用持续在 80% 以上,但内存和 IO 都正常。这种情况通常是模型推理占了主要耗时,小龙虾本体在等待模型返回。解决办法是换更强的推理硬件,或者把模型切换成更小的量化版本。如果内存长期占满、swap 持续读写,那是给你送货上门内存升级的信号。如果 Redis 的命中率很低、磁盘 IO 居高不下,考虑换一块 NVMe 固态,体验提升非常明显。

我自己的部署环境从机械硬盘换到 NVMe 后,小龙虾的冷启动时间从 40 多秒降到了 10 秒内,前端页面加载也从 2 秒降到 0.6 秒。模型推理速度没变化,因为瓶颈不在这台机器上,但日常使用的“跟手感”完全不一样了。

7. 写在最后的几点体会

部署小龙虾这件事,真正花时间的不是敲命令,而是理解它的设计思路。它不是一个像普通聊天软件那样开箱即用的单程序,而是一个需要你持续配置、调教、维护的本地服务。我第一次部署全程花了大概一个下午,其中一半时间在排模型名不匹配和前端构建的问题。跑通之后,它带来的自动化收益是实打实的:每天早晨的简报、文档自动整理、服务器状态巡检,再也不用手动去一个个输命令查了。

如果你也想上手,我建议第一周先把它当作普通聊天助手用,熟悉配置里的每个字段;第二周再逐步打开工具权限,配一两个简单定时任务;等一切稳定了,再考虑知识库、自定义脚本这些进阶玩法。别一上来就把工具权限全部放开,别让它在你的生产环境里随意执行 Shell 命令,这两句话是我最想对每个新玩家说的。

最后分享一个小技巧:配置文件的注释里用中文写下每条改动的日期和原因。你未来升级版本、排查问题时会感激当初这个习惯。一个项目跑久了,最怕的不是功能复杂,而是当初的决策已经没人记得为什么。

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

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

立即咨询