告别配置焦虑:10 分钟完成原生 OpenClaw + DeepSeek 飞书端完美接入

:lobster: OpenClaw + DeepSeek + 飞书 机器人完整部署指南(避坑实录)

适合:

  • 喜欢折腾的佬,喜欢原生部署的佬
  • 有 VPS / 云服务器(Ubuntu / Debian / Alibaba Cloud ECS) - 配置需要大于2h2g
  • 想把原生 DeepSeek 接入飞书
  • 希望 OpenClaw 后台长期运行
  • 不想再被 Cloudflare Tunnel / WebUI token 折磨的人

一、环境说明(本文基于真实部署)

  • 云服务器:Alibaba Cloud ECS
  • 系统:Ubuntu / Debian(root 用户)
  • Node.js:v22.x
  • 包管理器:pnpm
  • OpenClaw 版本:2026.2.9
  • 模型:DeepSeek API
  • 通道:飞书(WebSocket 模式)

二、基础环境准备

1. Node.js(必须 ≥ 20,推荐 22)

node -v

如果没有或版本过低,建议直接用官方方式装 22.x(略)。


2. 启用 Corepack + pnpm

corepack enable
1. corepack prepare pnpm@latest --activate
2. npm install -g pnpm(推荐)
# 1 - 2 选择一个进行运行即可
pnpm -v

重要提醒
OpenClaw 是 pnpm workspace 项目,
用 npm 会直接炸(workspace:* unsupported)


三、获取并构建 OpenClaw(源码方式)

1.创建项目目录并部署官方 OpenClaw

mkdir OpenClaw-Zens
cd ~/OpenClaw-Zens

我们直接从 GitHub 克隆官方代码,这样最纯净:

# 克隆官方项目
git clone https://github.com/openclaw/openclaw.git
cd openclaw

# 安装依赖(国内服务器建议使用淘宝镜像加速)
pnpm install --registry=https://registry.npmmirror.com

常见现象:

  • 下载 1000+ 包(正常)
  • 时间 3~5 分钟
  • 出现 Ignored build scripts: core-js → 可忽略

卡在 @matrix-org/matrix-sdk-crypto-nodejs 是非常典型的“国产服务器”部署痛点。

这个包是 OpenClaw 用来处理加密消息的(比如 Matrix 协议),它的安装脚本通常会尝试从 GitHub 下载预编译的二进制文件(Rust 编译的 .node 文件),或者在本地进行编译。

大概率是因为:

  1. 网络问题:服务器访问 GitHub Releases 太慢,下载超时。
  2. 内存不足:如果是 1核2G 或 2核2G 的服务器,编译这种 Rust 模块时容易把内存撑爆(OOM),导致系统假死。

ps: 一般都是内存不足的问题,多试几次可以成功,或者提升内存到2h4g,一定要耐心等待安装完成

增加 Swap 虚拟内存(推荐,解决内存不足)

很多国内轻量云服务器默认没有 Swap,编译大项目必死。我们先给服务器加 4G 虚拟内存:

# 1. 创建一个 4GB 的文件用于交换
sudo fallocate -l 4G /swapfile
# 2. 设置权限
sudo chmod 600 /swapfile
# 3. 设置交换区
sudo mkswap /swapfile
# 4. 启用交换区
sudo swapon /swapfile
# 5. 确认是否生效(看到 Swap 有值即可)
free -h

2. 构建 OpenClaw

# 在当前目录下
pnpm run build

成功标志:

  • 无 error
  • 最后看到大量 dist/*.js
  • 出现 Build complete

3. 进入你的项目目录

cd ~/OpenClaw-Zens/openclaw

确认你能看到:

openclaw.mjs
pnpm-workspace.yaml
packages/
apps/
ui/

四、OpenClaw 配置文件(核心)

1. 创建配置目录

mkdir -p ~/.openclaw

推荐最终稳定配置(DeepSeek + 飞书)

飞书开放平台创建机器人

  1. 创建应用:
  1. 获取凭证(Credentials):
  1. 启用机器人能力:
  • 点击 “添加应用能力” → “机器人”。
  • 点击“启用机器人”按钮。
  1. 配置事件权限:
  • 点击 “权限管理”。
  • 搜索并开通以下权限:
    • im:message.p2p_msg:readonly(读取用户发给机器人的单聊消息)
    • im:message.group_msg:readonly(读取群组中 @ 机器人的消息)

2. 编辑配置文件

nano ~/.openclaw/openclaw.json

!按照我的模板填入自己的信息即可

"env": {
    # 这个是要填写的
    "DEEPSEEK_API_KEY": "你的API Key"
  },
  "models": {
    "providers": {
      "deepseek": {
        "baseUrl": "https://api.deepseek.com",
        # 这个是要填写的
        "apiKey": "你的API Key",
        "api": "openai-completions",
        "models": [
          {
            "id": "deepseek-chat",
            "name": "DeepSeek Chat",
            "reasoning": false,
            "input": [
              "text"
            ],
            "cost": {
              "input": 0,
              "output": 0,
              "cacheRead": 0,
              "cacheWrite": 0
            },
            "contextWindow": 64000,
            "maxTokens": 8192
          },
          {
            "id": "deepseek-reasoner",
            "name": "DeepSeek Reasoner",
            "reasoning": false,
            "input": [
              "text"
            ],
            "cost": {
              "input": 0,
              "output": 0,
              "cacheRead": 0,
              "cacheWrite": 0
            },
            "contextWindow": 64000,
            "maxTokens": 8192
          }
        ]
      }
    }
  },
  "agents": {
    "defaults": {
      "model": {
        "primary": "deepseek/deepseek-chat"
      },
      "models": {
        "deepseek/deepseek-chat": {},
        "deepseek/deepseek-reasoner": {}
      },
      "maxConcurrent": 4,
      "subagents": {
        "maxConcurrent": 8
      },
      "workspace": "/root/.openclaw/workspace"
    }
  },
  "commands": {
    "native": "auto",
    "nativeSkills": "auto"
  },
  "channels": {
    "feishu": {
      "enabled": true,
      "appId": "你的飞书App ID",
      "appSecret": "你的飞书 App Secret",
      "verificationToken": "你的飞书 Verification Token"
    }
  },
  "gateway": {
    "mode": "local",
    "auth": {
      "mode": "token",
      "token": "你自己可以随便写一个(这个是登录 WebUI 的凭证)"
    },
    "trustedProxies": [
      "127.0.0.1",
      "::1"
    ],
    "port": 18789,
    "bind": "loopback",
    "tailscale": {
      "mode": "off",
      "resetOnExit": false
    }
  },
  "plugins": {
    "entries": {
      "feishu": {
        "enabled": true
      }
    }
  },
  "messages": {
    "ackReactionScope": "group-mentions"
  }
}

操作如下

#清空全部文件
ctrl + k 快速剪切掉文件(全部删除)
#复制你填写好的信息
ctrl + shift + v
#保存
ctrl + O(英文字母‘O’)
#退出
ctrl + x
#启动你的Openclaw(当前工作目录)
cd ~/OpenClaw-Song/openclaw
node openclaw.mjs gateway
  1. 开启长连接(关键步骤):
  • 确保你的OpenClaw正在运行
  • 点击 “事件与回调” → “事件配置”。
  • 将订阅方式设置为“使用长连接接收事件”。
  • 这样你就不需要配置那个容易报错的 Webhook URL 了,机器人会主动连你的服务器。
  1. 发布应用:
  • 点击 “版本管理与发布” → “创建版本”。
  • 版本号填 1.0.0,详情随便写,保存并申请发布。

踩坑记录(非常重要)

提示配置文件不正确

如果你和我的配置相同,可以先关掉服务,运行

node openclaw.mjs doctor --fix

等待修复完成,再重新进行启动服务

node openclaw.mjs gateway

五、验证 DeepSeek API(关键一步)

1. 测试模型列表

curl -s https://api.deepseek.com/v1/models \
  -H "Authorization: Bearer sk-你的key"

正确返回:

{
  "data": [
    { "id": "deepseek-chat" },
    { "id": "deepseek-reasoner" }
  ]
}

如果这里 401 / 无返回 → key 或 base_url 有问题


正确启动标志

你应该看到类似:

[gateway] agent model: deepseek/deepseek-chat
[gateway] listening on ws://127.0.0.1:18789
[feishu] starting feishu[default] (mode: websocket)
[feishu] WebSocket client started

此时:

  • 飞书机器人已经在线
  • 给机器人发消息会有回复

六、飞书侧必要配置(否则会假在线)

飞书开发者后台 → 你的应用

1. 事件订阅

  • 订阅方式:
    使用长连接接收事件(WebSocket)

2. 权限(最少)

  • im:message
  • im:message:send
  • contact:user.base(否则会报 99991672)

七、让 OpenClaw 后台长期运行(systemd)

1. 创建 systemd 服务

sudo nano /etc/systemd/system/openclaw.service

内容(亲测稳定):

[Unit]
Description=OpenClaw Gateway
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/OpenClaw-Song/openclaw
ExecStart=/usr/bin/node openclaw.mjs gateway
Restart=always
RestartSec=5
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target

2. 启用并启动

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable openclaw
sudo systemctl start openclaw

3. 查看状态

sudo systemctl status openclaw

查看日志(排错必备)

journalctl -u openclaw -f

八、你遇到过的几个经典报错解释

Gateway start blocked: gateway.mode=local

原因:
你用了 token / auth,但没显式指定 gateway.mode

解决:
配置里必须有:

"gateway": {
  "mode": "local"
}

pairing required

原因:

  • WebUI / WS 没带 token
  • 或你在公网(Cloudflare Tunnel)访问

本教程解决方式:

  • 不用 Cloudflare Tunnel
  • 只通过飞书通道交互
  • WebUI 不作为核心入口

可以通过本机SSH进行远程连接,代理服务器,来实现本机访问WebUI


输入密码即可,如果密码正确不会有任何显示,直接打开浏览器访问即可

http://127.0.0.1:18789/

Unknown model: openai/deepseek-chat

DeepSeek 不是 OpenAI provider
模型名必须是:

deepseek/deepseek-chat

九、最终结论

你现在可以:

  • 不用管 外网WebUI
  • 不用 Cloudflare Tunnel
  • OpenClaw 常驻 systemd
  • 飞书里直接用 AI

不推荐你做:

  • 公网暴露 WebUI的(我还没搞明白Cloud Flare Tunnel ws传输协议)
  • 纠结 token + Cloudflare WS
  • 再折腾 pairing

总结一句话

OpenClaw + DeepSeek + 飞书 = 一个“纯后端 + 消息通道”的 AI Agent
不要强行当 Web 产品用,稳定性会直线上升。

100 个赞

感谢大佬!

2 个赞

感谢分享

学习了,谢谢佬的分享

感谢佬分享

感谢佬的分享

1 个赞

感谢佬友

大佬就是大佬 谢谢

不客气,看到没人接deepseek自己没事瞎折腾哈哈哈

小白使用im:message.group_msg:readonly搜索不到
这个才行im:message.group_at_msg:readonly

感谢分享,晚上就试试

感谢分享,太详细了!

2 个赞

谢谢,能帮助到佬就好哈哈哈

1 个赞

飞书连接成功,会在后台日志弹出权限不足,需要点击赋予权限,谢谢佬的提醒

这里也没有报错,但是飞书发过去之后,看着是已读,没有回复是怎么回事啊?

1 个赞

这个是我正常回复了的效果

root@iZbp12penav8zvwojgjf3eZ:~/OpenClaw-Song/openclaw# node openclaw.mjs gateway
09:35:43 [plugins] feishu_doc: Registered feishu_doc, feishu_app_scopes
09:35:43 [plugins] feishu_wiki: Registered feishu_wiki tool
09:35:43 [plugins] feishu_drive: Registered feishu_drive tool
09:35:43 [plugins] feishu_bitable: Registered 6 bitable tools

🦞 OpenClaw 2026.2.9 (fb84e18) — I can run local, remote, or purely on vibes—results may vary with DNS.

09:35:44 [canvas] host mounted at http://127.0.0.1:18789/__openclaw__/canvas/ (root /root/.openclaw/canvas)
09:35:44 [heartbeat] started
09:35:44 [gateway] agent model: deepseek/deepseek-chat
09:35:44 [gateway] listening on ws://127.0.0.1:18789 (PID 775726)
09:35:44 [gateway] listening on ws://[::1]:18789
09:35:44 [gateway] log file: /tmp/openclaw/openclaw-2026-02-16.log
09:35:44 [info]: [ 'client ready' ]
09:35:44 [browser/service] Browser control service ready (profiles=2)
09:35:44 [feishu] starting feishu[default] (mode: websocket)
09:35:44 [feishu] feishu[default]: bot open_id resolved: ou_ae84ac36496c39d1874226d3d3e0b8ab
09:35:44 [info]: [ 'event-dispatch is ready' ]
09:35:44 [feishu] feishu[default]: starting WebSocket connection...
09:35:45 [info]: [
  '[ws]',
  'receive events or callbacks through persistent connection only available in self-build & Feishu app, Configured in:\n' +
    '        Developer Console(开发者后台) \n' +
    '          ->\n' +
    '        Events and Callbacks(事件与回调)\n' +
    '          -> \n' +
    '        Mode of event/callback subscription(订阅方式)\n' +
    '          -> \n' +
    '        Receive events/callbacks through persistent connection(使用 长连接 接收事件/回调)'
]
09:35:45 [feishu] feishu[default]: WebSocket client started
09:35:45 [info]: [ '[ws]', 'ws client ready' ]
09:36:17 [feishu] feishu[default]: received message from ou_4f492beafc979c57ff843f5c4dfc3e0a in oc_0c538c666e344016e1dc5fb1ff7f8cb7 (p2p)
09:36:17 [feishu] feishu[default]: dispatching to agent (session=agent:main:main)
09:36:19 [feishu] feishu[default]: added typing indicator reaction
09:36:24 [feishu] feishu[default] deliver called: text=你好!👋 很高兴再次见到你!

今天有什么需要我帮忙的吗?我可以帮你:

1. **检查服务器状态** - 查看Heimdall导航网站运行情况
2. **监控DeepSeek API使用量** -
09:36:24 [feishu] feishu[default] deliver: sending 1 text chunks to oc_0c538c666e344016e1dc5fb1ff7f8cb7
09:36:25 [feishu] feishu[default]: dispatch complete (queuedFinal=true, replies=1)
09:36:25 [feishu] feishu[default]: added typing indicator reaction
09:36:25 [feishu] feishu[default]: removed typing indicator reaction
09:36:25 [feishu] feishu[default]: removed typing indicator reaction

佬看你的貌似没有响应呀,

  • 第一次启动有 SIGINT(Ctrl+C)关掉 → 可能没完全清理。

  • 第二次启动就自动加了 (2),然后正常继续(WebSocket client started、feishu connected、gateway listening on ws://127.0.0.1:18789 等都成功了)。

  • 后面还有 feishu WebSocket 连接成功、agent started、心跳等 → gateway 其实是正常跑起来了,只是名字被改成了 “OpenClaw (2)” 以避免冲突。

  • OpenClaw 的 Feishu 插件(尤其是 @openclaw/feishu 或 fork 版)支持 agent 输出 [NO_RESPONSE] 来静默不回复(比如 agent 判断消息不需要回应、或 prompt 里设置了某些规则)。

  • 如果 agent 思考后决定不回(e.g. 空回复、只输出 “U” / no output、或工具调用失败后 silent),飞书会标记“已读”(因为收到 event,但 bot 没 call reply API),用户看到的就是已读无回复。

排查:

  • 跑 openclaw logs --follow 或查看日志文件(/tmp/openclaw/… 或 ~/.openclaw/logs),发消息后看有没有:
    • [agent] received message from feishu:…
    • [agent] generating response…
    • [agent] output: [NO_RESPONSE] 或 empty / “U” / truncated
    • tool call error / model error
  • 如果看到 agent 收到消息但输出为空/NO_RESPONSE → 问题在这里。
1 个赞

大佬为什么要编译呢?直接安装官方的不行吗?有什么不一样呢

我这边之前没开飞书的回调,

现在开了,但是收到消息没有进一步动作,newapi后台也没有收到消息:

哈哈哈,自己没事瞎折腾原生安装的

佬我这个是官方Deepseek的Api key,

第三方API接入

{

  "env": {

    "DUCKCODING_API_KEY": "sk-你的 第三方 API Key"   // 推荐放 env,避免明文

  },

  "models": {

    "mode": "merge",   // 合并模式,避免覆盖默认配置

    "providers": {

      "duckcoding": {   // provider id,随便起,但唯一

        "baseUrl": "代理API的地址",   // 加 /v1 如果代理要求,否则试不加 /v1

        "apiKey": "第三方API_KEY",             // 直接 sk-xxx

        "api": "openai-completions",                   // Claude 代理通常兼容 OpenAI chat/completions 接口

        "authHeader": true,                            // 默认 true,用 Bearer token

        "models": [

          {

            "id": "claude-3.5-sonnet",                 // 代理实际支持的模型 id,去 第三方模型面板 dashboard 抄准确名字

            "name": "Claude 3.5 Sonnet",

            "reasoning": false,

            "input": ["text"],

            "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },  // 免费代理填 0

            "contextWindow": 200000,                   // Claude 3.5 大概 200k,代理可能限更小,查文档

            "maxTokens": 8192

          },

          {

            "id": "claude-3-opus-20240229",            // 或其他 Claude 版本,根据代理支持列表

            "name": "Claude 3 Opus ",

            "reasoning": false,

            "input": ["text"],

            "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },

            "contextWindow": 200000,

            "maxTokens": 4096

          }

          // 加更多模型,按代理 dashboard 列表

        ]

      }

    }

  },

  "agents": {

    "defaults": {

      "model": {

        "primary": "第三方/claude-3.5-sonnet"   // ← 这里指定使用你的新 provider + 模型

      },

      "models": {

        "duckcoding/claude-3.5-sonnet": {},         // 启用这个模型

        "duckcoding/claude-3-opus-20240229": {}     // 可加多个

      }

    }

  }

}

或者看看这个大佬的项目,可以直接生成配置文件的

1 个赞