背景说明: OpenClaw(又名 ClawdBot)是一个极其强大的私人 AI 助手,具有持久记忆并能无缝接入 Telegram 等聊天软件。 官方推荐使用“源码编译 + CLI交互向导”进行部署,但这会污染宿主机环境。因此,我们选择了更硬核、更干净的 Docker 容器化 + 纯手工配置 路线。但由于跳过了向导,我们直面了其底层极其苛刻的校验机制和潜藏的代码 Bug。
本文记录了在 VPS(如 RackNerd)上使用 Docker 部署 OpenClaw 并接入 DeepSeek 模型时,遇到的所有“致命暗坑”及终极解法。
💡 TL;DR:先上终极完美配置代码
如果你不想看排错过程,只想一次性点火成功,请直接清空你现有的配置,使用以下这套经过无数次试错得出的“终极防御版配置”。
1. docker-compose.yml (纯净版)
核心原则:千万不要在这里写任何关于 OPENAI_BASE_URL 或 MODEL 的环境变量!全部交给 JSON 处理,避免双重注入冲突。
services:
openclaw-core:
image: ghcr.io/openclaw/openclaw:latest
container_name: openclaw_kernel
restart: unless-stopped
volumes:
# 必须挂载当前目录到容器内,不要随意新建 data 文件夹
- ./:/home/node/.openclaw
environment:
# --- 只保留 Telegram 机器人的 Token 和你的 ID ---
- TELEGRAM_BOT_TOKEN=8688xxxx:xxxx你的真实Tokenxxxx
- ALLOWED_USER_IDS=8408082812
- LOG_LEVEL=info
networks:
- openclaw-net
networks:
openclaw-net:
driver: bridge
2. openclaw.json (主脑自立门户版)
核心原则:绕过系统自带的 openai 驱动 Bug,强行自创一个名为 deepseek 的提供商,并指定基础通信协议。
{
"models": {
"providers": {
"deepseek": {
"baseUrl": "https://api.deepseek.com",
"apiKey": "sk-这里填入你真实有效的DeepSeek密钥",
"api": "openai-completions",
"models": [
{
"id": "deepseek-chat",
"name": "deepseek-chat"
}
]
}
}
},
"agents": {
"defaults": {
"model": "deepseek/deepseek-chat"
}
},
"gateway": {
"auth": {
"mode": "token"
}
}
}
在执行启动前,必须清理掉旧的记忆文件,否则它会固执地读取旧配置!
# 彻底停机并清除旧特工记忆
docker compose down
rm -rf agents/
# 重新点火并查看日志
docker compose up -d
docker compose logs -f openclaw-core
只要日志出现 [gateway] listening on ws://...,去 Telegram 发一句“你好”,你的私人管家就彻底活了!
🕵️♂️ 万字排坑记录:我们到底踩了哪些雷?
坑一:幽灵般的“顽固记忆” (Config overwrite)
- 现象:修改了
docker-compose.yml里的环境变量,甚至改了openclaw.json,但每次重启,日志里读取的模型名字依然是旧的(比如退回默认的 Claude)。
现象:修改了 docker-compose.yml 里的环境变量,甚至改了 openclaw.json,但每次重启,日志里读取的模型名字依然是旧的(比如退回默认的 Claude)。
- 原理:OpenClaw 内部有一个强悍的状态保护机制。只要
agents/文件夹或旧的openclaw.json存在,它启动时就会优先读取“历史记忆”,直接覆盖并无视你新写的配置。
原理:OpenClaw 内部有一个强悍的状态保护机制。只要 agents/ 文件夹或旧的 openclaw.json 存在,它启动时就会优先读取“历史记忆”,直接覆盖并无视你新写的配置。
- 解法:每次做重大配置修改时,必须执行
rm -rf agents/和rm -f openclaw.json,逼迫它重新认主。
解法:每次做重大配置修改时,必须执行 rm -rf agents/ 和 rm -f openclaw.json,逼迫它重新认主。
坑二:极其变态的 JSON 质检员 (Config invalid)
- 现象:在
openclaw.json里添加自定义模型白名单时,疯狂报错:Invalid input: expected string, received undefined或expected object, received string。
现象:在 openclaw.json 里添加自定义模型白名单时,疯狂报错:Invalid input: expected string, received undefined 或 expected object, received string。
- 原理:如果你跳过向导手工写 JSON,它的底层校验器一板一眼到了发指的地步。模型列表不能只是一个字符串
["deepseek-chat"],必须是一个完整的对象,并且强制要求同时包含id、name以及baseUrl,缺一不可。
原理:如果你跳过向导手工写 JSON,它的底层校验器一板一眼到了发指的地步。模型列表不能只是一个字符串 ["deepseek-chat"],必须是一个完整的对象,并且强制要求同时包含
🔗 原文链接: 点击阅读原文
文章评论