夜雨聆风学习资料网

ARTICLE · 1184380

我一个不懂代码的人,把 AI 助手搬进了服务器,让它 24 小时替我干活

我一个不懂代码的人,把 AI 助手搬进了服务器,让它 24 小时替我干活

0. 先说这套东西是什么

一句话

你有一个住在服务器上的助手。你在手机上发一句话,它替你干活,干完把结果发回你手机。
它 24 小时都在 ——你的电脑关不关,跟它没关系。

三个部件,各是什么(打比方)

打个比方

实际是什么

干啥用

章节

遥控器 + 收结果的地方

飞书(备用:微信)

你发指令、收结果

§3、§4

住在服务器里的佣人

服务器上的 Hermes Agent

听懂你的话、替你干活

§2

它的笔记本(长期记忆)

Obsidian 笔记库

记住你的事,换电脑也带得走

§5、§6

为什么非要把助手"放到服务器上"?

因为放自己电脑上,有三个躲不开的毛病:
你一关机,它就没了—— 电脑睡眠或关机,助手跟着停
你家网一抖,它就断—— 家庭宽带掉线,它也跟着掉
你出门就够不着—— 在手机上想让它干活,它却在客厅那台电脑上
放到服务器上,这三个毛病一次全解决。服务器其实没什么神秘 —— 它就是**"一台永远开着、永远联网的电脑"**,一个月几十块钱。

这套东西能干什么(举几个真事)

定时干活:每天早九点、晚七点,它自己去捞信息,把结果推给你
替你跑腿:查资料、整理文件、写东西,你说一句就行
记住你的事:你说过的、写过的,它存进笔记库,不会忘
学新本事:给它一个"技能包",它就多一门手艺

一句实话(丑话说前头)

这套东西不是零门槛。你要会复制粘贴命令—— 会粘贴就行,不用懂。
本文尽量用大白话 + 打比方讲"为什么";遇到必须敲的命令,照抄就能用。

1. 清单:需要准备什么

这一章在干啥:把"要买什么、要准备什么"列清楚。就三样:一台服务器、一个模型 Key、一个飞书账号。

1.1 一个云服务器

项

本套实测值

云厂商

腾讯云

系统

OpenCloudOS 9.6(兼容 CentOS/RHEL 系)

配置

2 核 / 3.6G 内存 / 60G 磁盘(磁盘已用 74%,建议直接上 80G)

公网 IP

一台固定公网 IP

登录方式

root + 密码/密钥(本套还装了宝塔面板,用网页终端即可操作)

为什么 2 核 3.6G 够用
:Hermes 本体很省,主要吃内存的是网关进程(稳定占用约 1.4G)。定时任务、同步、网站都在这台机器上跑,跑得动。

1.2 账号与密钥

需要的

用途

大模型 API Key

本套用 DeepSeek(api.deepseek.com)。用别的也行,Hermes 支持多家

飞书开放平台 账号

建自建应用(机器人)

一个飞书群 或 私聊

助手把消息发到这里


2. 服务器部署:从裸机到跑起来

这一章在干啥:把助手装到服务器上,并且让它开机自己起来。四步: ① 装程序 → ② 给它一个固定"家" → ③ 给它配"大脑"(AI 模型)→ ④ 设成开机自启。

2.1 装 Hermes

这一步在干啥:把 Hermes 装上。就一条命令的事。

安装(Hermes 官方安装器)

装完会得到:/opt/hermes/venv/bin/hermes

/opt/hermes/venv/bin/hermes --version

✅ 本套实测:Hermes Agent v0.20.4 (2026.8.18),venv Python 3.11.6

2.2 设定 HERMES_HOME

这一步在干啥:给助手一个固定的"家"。它的配置、记忆、技能、日志全住在这个文件夹里 —— 以后要备份或搬家,搬这一个目录就够。、记忆、技能、日志都在这个目录下:
export HERMES_HOME=/root/.hermes

✅ 本套实测

目录结构(✅ 实测):
/root/.hermes/
├── config.yaml

主配置(模型、终端、压缩策略等)

├── .env

密钥与平台开关(不进版本库!)

├── SOUL.md

助手的人格定义

├── memories/

长期记忆(MEMORY.md / USER.md)

├── skills/

技能库

├── sessions/  state.db

会话与状态数据库

├── cron/

定时任务

├── logs/

日志

├── profiles/

多机器人(多套独立配置)

└── mcp-tokens/

MCP 授权令牌

2.3 配模型

这一步在干啥:告诉它用哪个 AI 大模型(本例用 DeepSeek),Key 填哪儿。这是它"会不会说话"的关键。
config.yaml(✅ 本套实测):
model:
default: deepseek-v4-flash
provider: deepseek
base_url: https://api.deepseek.com/v1
~/.hermes/.env 里放 Key:
DEEPSEEK_API_KEY=你的key

2.4 让它开机自己起来(关键一步)

这一步在干啥:让助手开机自动上班,而且半路挂了能自己爬起来。
先打个比方,这一段就懂一半了
服务器上有个"管家"(Linux 里叫systemd)——所有"开机要自动跑的东西"都归它管。
你要做的,就是给这个管家交一份"工作说明书",说明书上就写两句话:
"有个叫 Hermes 的东西:① 开机就让它跑;② 万一它挂了,10 秒后自动把它拉起来。"
好消息:这份说明书不用你写
Hermes 自带一条命令,它会自动生成说明书、登记到"管家"那儿、顺手把它启动起来:
hermes gateway install --system --start-now --start-on-login
这一条命令,替你干了四件事:

参数

说人话

(不带参数的部分)

生成那份"工作说明书"(放到 /etc/systemd/system/ 下)

--system

登记成系统级服务 —— 开机就起,不用等你登录

--start-now

现在就把它跑起来

--start-on-login

设成开机自启

怎么知道成了?(看两个词)
hermes gateway status
看到active (running)→它在跑了✅
再确认"开机自启"也设上了:
systemctl is-enabled hermes-gateway
输出enabled→"开机自动起"已经设好了✅
💡 最保险的验证:重启一次服务器,再敲 hermes gateway status,看它是不是自己起来了。 (服务器重启要你自己在云控制台点,助手不能自己重启,原因见 §8.5)
❌ 不做这一步,会怎样?
你 SSH 一断开、或者服务器一重启,助手就没了 —— 而且你还不知道它没了。
我最早就是这样:看着一切正常,第二天怎么发消息都没人回,查半天才发现"它根本没在跑"。

附:这条命令到底生成了什么(看不懂可以整段跳过)
上面那条命令,本质是生成了下面这个文件。你不用手抄它—— 列出来只是让你知道"系统里多了个什么东西":
[Unit]
Description=Hermes Agent Gateway - Messaging Platform Integration
After=network-online.target
Wants=network-online.target
StartLimitIntervalSec=0
[Service]
Type=simple
User=root
Group=root
ExecStart=/opt/hermes/venv/bin/python -m hermes_cli.main gateway run
WorkingDirectory=/root/.hermes
Environment="HOME=/root"
Environment="USER=root"
Environment="VIRTUAL_ENV=/opt/hermes/venv"
Environment="HERMES_HOME=/root/.hermes"
Restart=always
RestartSec=5
KillMode=mixed
ExecReload=/bin/kill -USR1 $MAINPID
逐行翻译一遍(看懂这几行,systemd 就不神秘了):

那一行

说人话

Description=

这玩意的名字(给"管家"看的标签)

After=network-online.target

等网络通了再启动(不然连不上飞书)

ExecStart=...

具体启动哪条命令

WorkingDirectory=

在哪个目录里启动

Environment="HERMES_HOME=..."

告诉它"家在哪"(就是 §2.2 设的那个)

Restart=always

挂了就自动重启 ← 最值钱的一行

RestartSec=5

挂掉后等 5 秒再重启(留点缓冲)

User=root / Group=root

用哪个身份跑

💡 记住一句话就够:这个文件的作用就是 "开机自动起 + 挂了自动拉"。 具体每行怎么写,交给 hermes gateway install 就行,你永远不用背。

2.5 装一个顺手的命令入口(可选但强烈建议)

默认 hermes 不在 PATH 里,每次敲全路径很烦。加个包装脚本 /usr/local/bin/hermes(✅ 本套实测):
#!/bin/sh
export HERMES_HOME="${HERMES_HOME:-/root/.hermes}"
exec /opt/hermes/venv/bin/hermes "$@"
chmod +x /usr/local/bin/hermes
hermes --version

✅ 之后直接敲 hermes 即可

2.6 日常运维命令

hermes gateway status

看状态

hermes gateway restart

重启(改完平台配置后必须做)

journalctl -u hermes-gateway -l --since '5 min ago'

看日志


3. 接飞书:建 1 个应用就够了

3.1 先说结论:一个就够

飞书「应用」= 机器人的一张「工牌」。你想有几个机器人,就办几张工牌。
只想要一个助手→建 1 个应用(绝大多数人,这样就行)
想要好几个机器人各管一摊→ 那就建几个,步骤一模一样
⚠️ 我这套建了 4 个,但得说实话:那 4 个是我拿来练手的,不是标准做法。你完全可以只建 1 个,效果一模一样。别被"4 个"吓到。
为什么"想多几个就多建几个"?因为 Hermes 支持多套独立人格/用途(术语叫 profile)。一套 profile 配一张"工牌",就等于多一个机器人 —— 而且它们记忆互不串、技能互不扰。
我这套的 4 个(只是给你看看长什么样,不是要求):

profile

干嘛的

群聊策略

default

主助手(日常都找它)

disabled(只私聊)

zhaocai

招采雷达(盯招标公告)

open

gongkaike

公开课交付

open

neirong

内容创作

open

3.2 建应用(1 个或 N 个,步骤完全一样)

打开飞书开放平台→ 创建企业自建应用。然后做三件事:
① 开权限(照着开,一个别漏)

权限

作用

能不能省

im:message

收发消息

必开

im:message:send_as_bot

以机器人身份发消息

必开

im:chat

读群信息

必开

im:resource

读写消息里的文件/图片

必开

im:resource:upload

上传图片(要发图就必须开,不然发图报错)

发图必开

contact:user.base:readonly

读用户基础信息

建议开

② 事件订阅 —— 这里有个"省大事"的选择
订阅方式选「长连接(WebSocket)」⭐为什么?因为它一次省掉三件最烦的事:不用买域名、不用配 HTTPS 证书、不用在服务器上开端口。(另一种做法叫"回调" —— 得让别人能"敲到你的门",门槛高一截,新手基本卡在这。)
要订阅的事件:im.message.receive_v1(收到消息)
细分权限:im:message.p2p_msg:readonly(私聊)、im:message.group_at_msg:readonly(群里被 @)
③ 创建版本并发布⚠️(最容易忘的一步)不发布,前面开的权限一概不生效。本套就在这一步栽过(详见 §8.2)。

3.3 写进配置

~/.hermes/.env:
FEISHU_APP_ID=cli_xxx
FEISHU_APP_SECRET=xxx
FEISHU_CONNECTION_MODE=websocket

用长连接(免域名、免证书)

FEISHU_DOMAIN=feishu

国内版填 feishu;海外版填 lark

FEISHU_GROUP_POLICY=disabled

只想私聊就 disabled

FEISHU_ALLOWED_USERS=ou_xxx

白名单(可选,只让指定的人用)

FEISHU_ALLOW_ALL_USERS=false
上面是本套实际用到的键名(✅ 从 .env 核查得到);具体取值格式以官方文档为准。

3.4 验证(两步就能知道通没通)

hermes gateway restart
hermes gateway status
grep "feishu connected" ~/.hermes/logs/agent.log | tail -1

✅ 应看到 ✓ feishu connected

看到 ✓ feishu connected 之后,在飞书里给机器人发一句「在吗」—— 它回你,就通了。
⚠️ 但要记住:"连上了"和"能用"是两件事。 连上只代表飞书这条线通了;它还得能调得动 AI 模型。 如果能连上、但一句话不回,八成是模型 Key 的事 —— 见 §8.8。

4. 接微信(备用通道)

这一章在干啥:再给助手加一条备用通道。为什么要备?本套真遇到过"飞书那边出问题、投递失败"的情况 —— 多一条腿走路,才不至于失联。(这一章可以跳过,不是必须的)

4.1 原理

Hermes 通过腾讯 iLink 机器人接微信:扫码登录,得到一个形如 xxxx@im.bot 的机器人身份。

4.2 关键认知(先想清楚再装)

事实

说明

扫码得到的是 iLink 机器人身份,不是你的微信号

它是"另一个联系人"

一般不能被拉进普通微信群

群里 @ 也大概率没反应

只有私聊(DM)可靠

手机上把它当联系人用

二维码 = 登录凭证

只自己扫,别外传

4.3 配置

扫码登录成功后凭证会自动落盘到 ~/.hermes/weixin/accounts/。然后在 .env 补:
WEIXIN_ACCOUNT_ID=xxx@im.bot
WEIXIN_TOKEN=xxx
WEIXIN_DM_POLICY=allowlist
WEIXIN_ALLOWED_USERS=你的user_id@im.wechat
⚠️ 这一步有个大坑:WEIXIN_DM_POLICY=open(不设白名单)会导致网关拒绝启动,除非同时设 WEIXIN_ALLOW_ALL_USERS=true。本套实测踩过,连着起不来 5 次。生产环境建议直接用 allowlist。

5. Obsidian 知识库 + Syncthing 双向同步

这一章在干啥:给助手配一本**"笔记本",并且让服务器和你电脑上的笔记自动互相同步** —— 你在电脑上写的,它能看见;它写的,你在电脑上也能看见。

5.1 为什么用 Obsidian

纯 Markdown 文件,数据在你自己手里,不锁在某个云笔记里;
本身就是一个文件夹→ 随便用任何同步工具同步,不依赖官方服务。

5.2 服务器侧

库根目录:/opt/obsidian-sync/Obsidian
目录是按用途分类的(本套实例):
00-总控台 / 00-总纲

索引与导航

01-公众号运营 / 01-内容生产

内容生产线(含"3 待发布""4 已发布")

02-产品服务库 02-企业AI服务
03-个人认知资产 03-素材库
04-第二大脑系统 04-输入箱
05-输入与素材
06-AI落地项目档案
90-归档与待整理
.claude/skills/

⭐ 技能目录(关键,见 §6)

5.3 装 Syncthing(同步软件)

官方源装 syncthing,然后跑成常驻服务

/usr/local/bin/syncthing serve \
--home=/var/lib/obsidian-syncthing \
--no-browser --no-restart --no-upgrade \
--gui-address=127.0.0.1:8384
(✅ 本套实测原文;服务名 syncthing-obsidian.service,用独立用户 obsidiansync 跑)
配置要点(✅ 实测):

项

值

共享文件夹 ID

obsidian-vault

服务器路径

/opt/obsidian-sync/Obsidian

已配对设备

Fengge-PC(本地电脑)+ VM-0-3-opencloudos(服务器)

管理界面

http://127.0.0.1:8384(只监听本机,安全)

安全建议
:GUI 只绑 127.0.0.1,要用网页管理就 SSH 隧道转发,别把 8384 暴露到公网。

6. ⭐ 本地电脑 ↔ 服务器:同步的到底是什么

这一章在干啥:讲清楚到底什么东西在两边同步—— 这是整套设计里最巧的一环。
先说一条消息是怎么走完一圈的(看完这张图,"为什么这么搭"就懂了):

6.1 同步的东西

通过 Syncthing 双向同步的,是那个 Obsidian 库。而库里面藏着两类关键资产:

库里的东西

作用

笔记与知识库

本地写、服务器读;服务器写、本地读

.claude/skills/

⭐ 技能目录 —— 本地 Claude Code 用它,服务器 Hermes 也用它

本套 .claude/skills/ 里同步着的技能(✅ 实测):
fengge(个人人格/口吻)  create-yourself(自我蒸馏)
openclaw  skill-creator
个人资料自动入库skill
公众号AI热点全自动草稿Skill
公众号文章转小红书图文笔记skill
小绿书转换skill
微信公众号草稿发布skill
插画风格配图生成skill

6.2 这样设计的好处

一份技能,两边都能用:在服务器上让 Hermes 蒸馏出的人格技能,自动出现在本地电脑的 Claude Code 里。
本地能"接管":电脑开机、装上 Hermes,就能用同一批技能和知识库。
不锁死在云上:服务器哪天不续费了,库还在本地。

6.3 不同步的东西(重要)

项

说明

服务器上的 ~/.hermes/ 配置与数据库

不同步(session、state.db 等是机器本地的)

密钥文件 .env

绝不同步(安全考虑)

6.4 本地电脑侧:装了什么、怎么起、怎么自启(✅ 2026-10-13 现场核查)

实测机器:Windows,当前用户 Administrator,Syncthing 设备名 Fengge-PC。

① 装了什么

软件

位置

作用

Hermes Agent

C:\Users\Administrator\AppData\Local\hermes\bin\hermes.exe

本地助手

Node.js

C:\Program Files\nodejs\node.exe

Hermes 依赖

Python

…\WindowsApps\python.exe

Hermes 依赖

uv

…\Local\hermes\bin\uv.exe

Hermes 自带的包管理

Git

C:\Program Files\Git\cmd\git.exe

依赖

VS Code

…\Local\Programs\Microsoft VS Code\bin\code.cmd

编辑技能与脚本

Syncthing + SyncTrayzor

进程 syncthing×2 + SyncTrayzor;数据在 AppData\Local\Syncthing

双向同步

Obsidian

AppData\Roaming\obsidian

看知识库

⚠️ 一个必踩的假象:Get-Command syncthing 和 Get-Command obsidian 会显示"没装" —— 因为它俩是带界面的程序,不在 PATH 里。别信这个,要看进程和安装目录(附核查命令见 附录 A)。

② 本地 Hermes 的"家"在哪(重要)

不是默认的~/.hermes,而是:
C:\Users\Administrator\AppData\Local\hermes\
里面有:SOUL.md(助手人格)、config.yaml、.env(密钥)、skills/、sessions/、memories/、cron/、profiles/、state.db(会话库)、active_profile。
🔒 和服务器同规矩:.env 里有密钥,绝不同步。

③ 开机自启靠什么

自启项

类型

作用

SyncTrayzor

开机启动(程序自带)

拉起 Syncthing,保证同步常在

HermesHeartbeat

Windows 任务计划

定时 ssh 到服务器 touch /tmp/hermes_heartbeat

Hermes_Heartbeat_Resume / Resume2 / Resume3

Windows 任务计划

把上面那个心跳任务重新启用(守卫任务)

④ ✅ 本地不跑网关(关键,与服务器不冲突)

现场查 gateway 相关进程 ——结果为空:本地没有跑 Hermes 网关。
这是刻意设计
:同一个飞书应用绝不能两个网关同时跑(见 §8.9)。 本套最终口径 = 「服务器常驻 + 本地只当客户端」 —— 本地只跑同步 + 本地助手,不跑网关。

⑤ 遗留物(✅ 2026-10-13 已处置:全部禁用)

✅ 现场处置记录:4 个心跳任务已全部禁用(状态 Disabled),原始定义已备份到本地桌面心跳任务备份-20261013\(4 个 .xml)。需要恢复时把 .xml 导入任务计划即可。
这 4 个任务原本是旧「双机热备」的本地端(本地发心跳 → 服务器接管,见 §8.3)。
热备已弃用,心跳没人消费(服务器侧 takeover.sh 已改名停用)。
⚠️注意:3 个 Resume 任务会自动把心跳任务重新启用—— 所以「只禁用心跳任务」没用,要清就 4 个一起清。
本地还有 active_profile 文件(旧的"活动 profile 切换"机制留下的)。它无害,不要删—— 乱删可能影响本地助手。

7. 让它主动找你:定时任务

这一章在干啥:让它到点自己干活,干完把结果推给你 —— 从"你问它才答"变成"它主动找你"。
装好只是"能用",定时任务才是"它替你干活"。
本套在跑的 4 个(✅ 实测):

任务

时间

投递

每日简报待办

08:45

飞书 + 微信

今日生财

09:00

飞书 + 微信

生财线下聚会盯梢

09:30

飞书 + 微信

每日新帖精选

19:00

飞书 + 微信

两条经验:
关键消息要"两条腿走路"—— 同一份结果同时投递飞书 + 微信。理由:本套实测遇到过"飞书应用被删导致投递失败",多一条通道就等于多一层保险。
每条任务都要能"什么都不说"—— 没新内容时静默,不然天天刷屏,人会烦到关掉它。

8. 踩过的坑(真实清单,比教程值钱)

这一章怎么读:这是**"踩着坑记下来的笔记"。不用一次看完**,卡住了再来查。 说句实话 ——这份清单比前面的教程值钱,因为教程到处都是,坑只有踩过的人知道。

8.1 微信:DM_POLICY=open 会让网关起不来

现象:网关连续启动失败,日志报策略错误。 解法:用 allowlist + WEIXIN_ALLOWED_USERS;或用 open 时必须同时设 WEIXIN_ALLOW_ALL_USERS=true。

8.2 飞书:应用没开"上传图片"权限 → 发不出图

现象:机器人文字正常,发图片失败,日志只有一句Feishu image upload missing image_key(把真实错误吞掉了,很容易误判成软件 bug)。 真因:应用缺im:resource:upload权限。 一步定位(直连飞书 API 复现):

取 tenant_access_token 后:

curl -X POST "https://open.feishu.cn/open-apis/im/v1/images" \
-H "Authorization: Bearer $TOKEN" \
-F "image_type=message" -F "image=@test.png"

若返回 {"code":99991672,"msg":"Access denied...required: [im:resource:upload, im:resource]"}

→ 就是没开权限。官方会顺带给出开通链接。

解法:开放平台开 im:resource:upload →创建版本并发布(不发布不生效)。

8.3 双机热备 —— ⚠️ 已停用(2026-08-29)

设计意图:本地电脑发心跳,服务器监控;本地心跳过期 → 服务器接管全部 profile;本地心跳恢复 → 服务器让位,避免两边抢飞书长连接。
⛔ 为什么要停:2026-08-28 出过一次事故
本地电脑开机 → 心跳变新鲜 → 热备脚本执行 pkill -9 杀掉服务器全部网关 → 但本地网关当时没配开机自启 → 4 个机器人在服务器和本地都没跑起来,全部掉线。用户感知="打开电脑,机器人没反应"。
当前实际状态(2026-10-13 核查):

检查项

结果

脚本

/opt/hermes/takeover.sh**.disabled**(2026-08-29 09:36 改名停用)

接管日志

最后一条 2026-08-30 02:44,之后无更新

心跳文件

不存在

服务器上的 profile

只有 default 在跑,zhaocai / gongkaike / neirong均未运行

两个可选修复方向(来自 2026-08-29 的修复记录):
服务器常驻(推荐):改脚本让"心跳新鲜"分支不 kill——服务器 24h 一直跑,本地只用 CLI,不抢飞书连接。
本地优先:本地必须配 hermes gateway install 开机自启(否则又会重现 8-28 的掉线)。
⚠️ 要重新启用热备,必须先把上面第 1 或第 2 条落实,否则一定会再出一次"全部掉线"。 本文档如实记录"已停用"状态 —— 不要照抄一份"正在用双机热备"的描述。 ✅ 2026-10-13 定案:放弃「双机热备」,改用「服务器常驻」 —— 4 个网关全部装在服务器上、systemctl enable 开机自启。 ⚠️ 前提:本地电脑必须不再跑网关(关掉本地的自启 / Watchdog / 计划任务),否则又变成两边抢连接。 📄 另记:服务器上曾遗留一个重复的 hermes-gw-default.service(enabled 但启动失败),它与 hermes-gateway.service 跑同一个 default profile —— 重启后会互相抢连接,已 systemctl disable 消除。

8.4 改平台配置后,必须从"网关外"重启

在网关进程里重启网关会被拦住(出于安全:助手不能把自己关掉)。 正确做法:在服务器的独立终端(如宝塔的网页终端)里执行:
hermes gateway restart

8.5 关机/重启:助手不能自己关自己

shutdown / reboot 属于硬性黑名单,助手执行不了,必须人工在云控制台或终端操作。
好消息:只要服务都 systemctl enable 过,开机后 Hermes / 飞书 / 微信 / 网站会自动恢复。

8.6 飞书的"富文本消息"会吃掉附件

现象:通过飞书发的文件/压缩包,助手可能收不到(日志里显示成 [Rich text message])。 原因:消息类型是 post(富文本),适配器解析不出附件列表。 变通:用 GET /open-apis/im/v1/messages/{message_id} 读原始消息,从 files 字段拿到 file_key 再下载;大文件还要用 HTTP Range 分段下载绕过单次大小限制。

8.7 一条运维心得

别把所有东西都堆在根目录。本套把项目放在 /opt/(如 /opt/hermes、/opt/obsidian-sync),文档和记忆放 ~/.hermes 与 Obsidian 库里 —— 出问题好排查,重装也好搬。

8.8 ⭐ 多 profile 的隐藏杀手:模型 Key 各自独立

现象:机器人在飞书里连得上(日志有 ✓ feishu connected),但发消息没人回。
真因:每个 profile 有自己独立的.env。换了模型 API Key 只改了主 profile,另外 3 个 profile 里还是旧 key → 调模型报401 Authentication Fails。
本套实测:zhaocai 68 次 401、neirong 25 次、gongkaike331 次(它从上线起就没工作过)。
一步定位:逐个 profile 取 key,打 GET https://api.deepseek.com/v1/models,看返回 200 还是 401。
修法:把有效 key 同步进每个 profile 的 .env(改前先备份),再 systemctl restart hermes-gw-。
教训:「飞书连上了」不等于「机器人能用」—— 这是两条独立链路(① 飞书长连接 ② 模型 API 鉴权),排查时必须分开看。

8.9 ⭐ 铁律:同一个飞书应用,不能有两个网关同时抢连接

飞书的事件(长连接)只会投递给其中一个连接。两台机器都跑同一个 app 的网关时:
消息可能随机落到其中一台 → 表现是「机器人时好时坏」
极端情况两边互相「让位 / 接管」 →全部掉线
本套踩过的坑(2026-08-28):本地电脑开机 + 热备脚本的「让位」逻辑 + 本地网关未配自启 =4 个机器人全部掉线,用户感知=「打开电脑,机器人没反应」。
结论(二选一,别两头都要):
固定一台跑(推荐:服务器常驻)—— 服务器 24h 跑,本地只当客户端
真正的交接—— 心跳 + 让位,且两边都要配开机自启
最怕的是第三种:两边都配了自启、却没有协调机制—— 那不是高可用,是互相打架。
另注:服务器上还留着 takeover.sh.disabled(旧热备脚本)和 hermes-gw-default.service(重复的 default 单元,已 disable)。只要不去启用它们就不会出事。

9. 换新电脑时的复刻清单

这一章在干啥:换电脑、或者要在新服务器上重建时,照着打勾走一遍就行。

9.1 服务器侧

买服务器(建议 4 核 8G / 80G 起)
装 Hermes → 记下 HERMES_HOME
配模型 API Key
写 config.yaml(模型段)
让它开机自启 → hermes gateway install --system --start-now --start-on-login(见 §2.4)
(可选)加 /usr/local/bin/hermes 包装脚本
建飞书自建应用(每个 bot 一个)→ 开全权限(含 im:resource:upload)→ 事件订阅选长连接 → 发布版本
.env 填飞书配置 → hermes gateway restart → 验证 ✓ feishu connected
(可选)接微信(iLink 扫码)→ 配 WEIXIN_DM_POLICY=allowlist + 白名单
装 Syncthing → 建 obsidian-vault 共享 → 与本地配对
建定时任务(从"别人的"变成"你的")

9.2 本地电脑侧(Windows)

装 Obsidian(看知识库)
装 SyncTrayzor + Syncthing → 与服务器配对 → 同步 obsidian-vault (确认 .claude/skills/ 也在同步范围内)
装 Node.js / Git / Python(Hermes 的依赖)
装 Hermes Agent —— 家目录在 %LOCALAPPDATA%\hermes,不是 ~/.hermes
设 SyncTrayzor 开机自启(同步常在)
❌ 不要起本地网关 —— 网关只跑在服务器(见 §8.9)
❌ 不要配心跳 / 热备计划任务 —— 已弃用(见 §8.3)

9.3 验收(三件事都能做到,就算成了)

飞书里发消息→ 机器人能回
微信里发消息→ 机器人能回
在本地 Obsidian 写一条笔记→ 服务器上能看到(同步通了)

相关学习资料