☰
部署OpenClaw(ClawdBot、MoltBot)后访问localhost:18789报1008错误怎么办?
2026/10/17 22:18:34 网站建设 项目流程

1. 先搞清楚 1008 到底卡在哪一层

访问http://localhost:18789直接弹红字disconnected (1008): unauthorized: gateway token missing,这个报错在 OpenClaw(也就是早期的 ClawdBot、MoltBot)本地部署里出现频率极高。它的字面意思是:WebSocket 握手阶段被网关拒绝,原因是请求里没有携带有效的 gateway token。换句话说,端口是通的、服务是活的,但鉴权这一关没过。

很多人第一反应是去翻配置文件,其实没必要。OpenClaw 的网关默认开启 Token 授权,这是设计上的安全机制,不是 bug。你直接在浏览器地址栏敲localhost:18789,浏览器不会自动带上任何凭证,网关自然拒绝。真正要做的,是拿到一个带 token 的访问链接,或者把 token 填进 Control UI 的设置里。

这个错误之所以让人头疼,是因为它把三类问题混在同一个提示里:端口没监听、鉴权缺失、反向代理链路断掉。如果你只盯着 token 看,可能会忽略掉服务根本没起来的情况。所以排查顺序应该是从底层往上走——先确认 18789 有没有进程在听,再确认 token 机制,最后看反向代理有没有把 WebSocket 的 upgrade 头吃掉。

我试过在一台 Ubuntu 22.04 上部署最新版,Python 3.11.8,一键命令装完,浏览器一开就是 1008。当时也懵了几分钟,后来按下面这套顺序逐层定位,五分钟就恢复了。下面把每一步的命令和判断标准都写清楚,你可以直接照着敲。

先明确一点:OpenClaw、ClawdBot、MoltBot 是同一个项目在不同时期的叫法,命令主体可能从clawdbot变成moltbot再变成openclaw,但网关端口 18789 和 token 授权逻辑是一致的。你遇到 1008 时,先确认自己装的是哪个版本,后面命令里的可执行文件名要对上。

2. 端口监听与进程状态自查:localhost:18789 到底有没有人听

排查 1008 的第一步不是看 token,而是确认 18789 端口有没有被监听。因为如果服务压根没起来,浏览器同样会报连接失败,只是错误码可能不同。但在某些封装下,网关会先返回 1008 再断开,容易误导你以为是鉴权问题。

Linux 和 macOS 下用这条命令:

ss -tlnp | grep 18789

或者用lsof:

lsof -iTCP:18789 -sTCP:LISTEN

正常输出应该类似:

LISTEN 0 128 127.0.0.1:18789 0.0.0.0:* users:(("openclaw",pid=12345,fd=7))

这里有几个关键点要看。第一,监听地址是127.0.0.1还是0.0.0.0。如果只监听127.0.0.1,那你只能本机访问,远程访问会失败,但这不会导致 1008。第二,进程名是不是 openclaw 或对应的可执行文件。第三,如果这条命令没有任何输出,说明服务没起来,先去看日志,别急着找 token。

Windows 下用 PowerShell:

Get-NetTCPConnection -LocalPort 18789 -State Listen

如果端口没监听,先启动服务。一键安装的版本通常有 systemd 服务:

systemctl status openclaw systemctl start openclaw journalctl -u openclaw -n 50 --no-pager

看日志里有没有gateway listening on 127.0.0.1:18789这类字样。如果日志里出现address already in use,说明端口被别的进程占了,换端口或者杀掉占用进程。这一步确认完,才能进入 token 环节。

还有一个容易忽略的点:如果你是用 Docker 跑的,端口映射可能只映射了 TCP 而没处理 WebSocket,或者映射到了错误的容器端口。检查docker ps里的端口映射,确认-p 18789:18789存在且容器内服务确实监听在这个端口。

3. 可复制的鉴权配置:生成带 token 的访问链接与统一 Key 接入

确认端口在听之后,1008 的核心就是 token 缺失。OpenClaw 提供了终端命令来生成带 token 的仪表盘链接。不同版本命令名不同,先确认你的可执行文件:

which openclaw || which clawdbot || which moltbot

然后执行:

openclaw dashboard --no-open

如果你的是旧版,把openclaw换成clawdbot或moltbot。执行后终端会输出一行带 token 的 URL,格式类似:

http://127.0.0.1:18789/?token=31943b8c90ea4f28b7a198xxxxxx

把这个链接复制到浏览器打开,1008 就会消失。注意 token 是每个实例随机生成的,不要用别人的 token,也不要把带 token 的截图发到公开仓库。

如果你希望把 OpenClaw 接到统一的模型通道上,而不是每个工具单独配 Key,可以在网关配置里指定 Base URL 和 API Key。OpenClaw 的配置文件通常在~/.openclaw/config.toml或项目目录下的config.toml。下面是一个可复制的片段,把模型通道指向 TaoToken 的统一入口:

[gateway] host = "127.0.0.1" port = 18789 auth_token = "auto" [model] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "sk-你的TaoToken统一Key" model_id = "claude-sonnet-4-20250514"

如果你用的是 JSON 配置(部分版本支持settings.json),对应写法:

{ "gateway": { "host": "127.0.0.1", "port": 18789, "authToken": "auto" }, "model": { "provider": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoToken统一Key", "modelId": "claude-sonnet-4-20250514" } }

这里三件套要写全:Base URL 用https://taotoken.net/api,Key 用你在控制台生成的统一 Key,Model ID 填你实际要调用的模型。改完配置后重启服务:

systemctl restart openclaw

如果你在 Cline、Codex 或 Claude Code 这类工具里也接了同一个通道,记得它们的auth.json或 MCP 配置里的 Base URL 和 Key 保持一致,避免一个工具能通、另一个报 401。TaoToken 的 API Key 可以在控制台创建,接入文档里有各客户端的完整示例,需要的话去 API Keys 页面拿 Key,再对照接入文档改配置。

4. 三步验证:确认 1008 消除且请求真正走通

配置改完不代表就通了,要有明确的验证动作。下面三步按顺序做,每步都有预期结果。

第一步,验证端口和 token 链接。重新执行:

openclaw dashboard --no-open

拿到新链接后在浏览器打开,按 F12 看 Console 和 Network。Network 里应该能看到一条 WebSocket 请求,状态是 101 Switching Protocols,而不是 1008。如果还是 1008,说明 token 没生效,检查配置文件里的auth_token是否被覆盖,或者浏览器缓存了旧链接,用无痕窗口再试。

第二步,用 curl 直接打网关的健康检查接口,确认服务层正常:

curl -i http://127.0.0.1:18789/health

预期返回 200 和一段 JSON。如果返回 401,说明健康检查也需要 token,那就带上 token:

curl -i "http://127.0.0.1:18789/health?token=你的token"

第三步,验证模型通道是否真的能出结果。在 Control UI 里发一条最简单的消息,比如「回复 ok」。如果 UI 里能正常返回,说明网关鉴权和模型通道都通了。如果 UI 通了但模型报错,看日志里有没有reading choices或401字样,那说明是模型侧的 Key 或 Base URL 问题,不是 1008 了。

这三步做完,基本可以确认 1008 已经消除。如果第三步卡住,把日志里的具体报错记下来,进入下一节的排查对照。

5. 常见报错对照排查:401、local proxy failed、reading choices、OAuth

1008 解决后,接下来容易撞上的是模型通道层的报错。下面按真实日志对照。

401 unauthorized:网关通了,但模型 API Key 无效或过期。检查配置文件里的api_key是否和 TaoToken 控制台里的一致,注意不要有多余空格。如果你用的是环境变量,确认OPENAI_API_KEY或对应变量已经 export 且被服务读到。systemd 服务不会自动继承你 shell 里的环境变量,要在 service 文件里用Environment=显式声明。

local proxy failed:通常出现在你配了本地代理但代理没起来,或者代理地址写错。检查配置里的 proxy 字段,如果不需要代理就删掉。注意这里说的是本地转发配置,不是网络层面的东西,别混为一谈。

reading choices或cannot read property choices of undefined:这是模型返回体不符合预期格式。常见原因是 Base URL 指向了错误的路径,比如少写了/v1或多写了/v1。TaoToken 的兼容入口是https://taotoken.net/api,具体到 chat completions 的路径要按接入文档来。另一个原因是 Model ID 写错,模型不存在时返回体里没有 choices 字段。

OAuth相关报错:如果你在 Claude Code 或 Codex 里用了 OAuth 登录方式,又同时配了 API Key,可能冲突。统一走 API Key 通道时,把 OAuth 相关的 token 缓存清掉,配置文件里只保留 Base URL + Key + Model ID 三件套。Codex 的auth.json里如果同时有 OAuth 和 API Key 字段,以 API Key 为准,或者直接删掉 OAuth 段。

还有一个隐蔽的坑:反向代理。如果你在 OpenClaw 前面挂了 Nginx 或 Caddy,WebSocket 的 upgrade 头可能被吃掉,表现也是 1008 或连接断开。Nginx 需要显式配置:

location / { proxy_pass http://127.0.0.1:18789; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; }

少了Upgrade和Connection这两行,WebSocket 握手就会失败。Caddy 一般自动处理,但如果你手动改了 header 也可能出问题。

6. 把通道固定下来:长期编码场景的接入建议

1008 这类问题本质上是本地网关鉴权和模型通道配置没对齐。单次修好不难,难的是每次换工具、换项目都要重新配一遍。如果你经常在 OpenClaw、Cline、Claude Code 之间切换,建议把模型通道统一到一个入口,所有工具都指向同一个 Base URL 和 Key,这样排查时只需要看一个地方。

具体做法是:在 TaoToken 控制台创建一个统一 Key,然后在每个工具的配置里都填https://taotoken.net/api作为 Base URL,Model ID 按需选择。OpenClaw 的config.toml、Cline 的 MCP 配置、Codex 的auth.json、Claude Code 的 settings 都保持这三件套一致。这样任何一个工具报 401 或 reading choices,你只需要检查这一个 Key 和这一个 Base URL,不用在多个配置之间来回对照。

如果你主要做长期编码或 Agent 类任务,可以考虑用 Coding Plan 把额度和通道固定下来,避免频繁换 Key 导致配置漂移。需要看模型实际返回效果时,模型对话页面可以直接验证通道是否正常,不用每次都启动 OpenClaw。接入文档里有各客户端的完整配置示例,照着改就行。

最后提醒一句:gateway token 和模型 API Key 是两回事。前者是 OpenClaw 本地控制台的访问凭证,后者是模型通道的鉴权。1008 是前者的问题,401 是后者的问题,别搞混。把这两层分清楚,以后遇到任何报错都能快速定位到是哪一层。

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

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

立即咨询