docker 的启动参数可以加这几个:

Groovy
#启用 Dashboard(Web UI),你之前就有在跑(端口 9119)。保留,方便你管理。
HERMES_DASHBOARD=1
#允许 root 用户启动网关。有用,容器里 main-wrapper.sh 默认用 s6-setuidgid hermes 降权限启动 hermes,但网关需要 root 来写入 venv。有了这个变量,网关可以直接以 root 运行,省掉权限问题。建议保留。
HERMES_ALLOW_ROOT_GATEWAY=1
#Dashboard 不检查认证。保留,不然你访问 Web UI 要登录。
HERMES_DASHBOARD_INSECURE=1
#设置 hermes 用户的家目录。保留,确保 hermes 用户能正确读写配置。
HOME=/opt/data
#权限控制,避免他获得 root 权限
HERMES_UID=1026
HERMES_GID=100
因为每次启动 lark-oapi 都会没有,导致 gateway 一直起不来
可以形成一个 skills,这样每次启动后可以通过对话修复
真正需要的就一条命令:
uv pip install --python /opt/hermes/.venv/bin/python3 lark-oapi
uv 能直接写入 hermes venv,不需要先 chmod。我试过了,lark-oapi 已经装好了,飞书也连上了。
所以每次重启后你只需要跑:
Groovy
uv pip install --python /opt/hermes/.venv/bin/python3 lark-oapi && pkill -f "hermes gateway run" 2>/dev/null; sleep 2; /opt/hermes/.venv/bin/hermes gateway run
skills 原文:
--- name: gateway-boot-fix description: "Docker 容器重启后 Hermes 网关修复。当网关进程挂了、飞书/Discord/Telegram 等消息平台无法连接、或 gateway status 显示 not running 时自动启用。修复 venv 权限、安装缺失依赖、重启网关并验证连接。" version: 2.0.0 author: Hermes Agent license: MIT --- # Hermes 网关开机修复技能 v2.0 ## 适用场景 Docker 容器重启后,Hermes 网关可能出现以下问题: - 网关进程没启动 - 飞书等平台 WebSocket 连接失败 - 日志显示 `lark-oapi not installed` 等依赖缺失错误 - `hermes gateway status` 显示 `Gateway is not running` ## 根因(3个,按顺序) ### 1. venv 权限问题 `/opt/hermes/.venv/lib/python3.13/site-packages/` 由镜像构建时创建,文件所有者是 hermes 用户(uid 10000)。root 用户执行 `chmod -R` 会报 `Operation not permitted`(btrfs 子卷权限限制)。 **但** `uv pip install` 可以写入(Python 级别文件操作,绕过 OS 权限检查)。所以不需要 chmod,直接用 uv 安装即可。 ### 2. lark-oapi 未安装到 hermes venv Hermes 使用独立 venv(`/opt/hermes/.venv`),系统 Python 上安装的包它读不到。网关启动时懒安装会因权限不足失败。 ### 3. 网关进程未启动 容器重启后网关进程不会自动拉起(s6 的 main-hermes 服务是 `exec sleep infinity` 空壳)。 ## 修复步骤(按顺序执行,不要跳步) ### Step 1:安装 lark-oapi ```bash uv pip install --python /opt/hermes/.venv/bin/python3 lark-oapi ``` 这是唯一需要装的包。uv 会自动解决依赖(pycryptodome、websockets 等)。 ### Step 2:启动网关 ```bash # 先杀掉残留进程(如果有) pkill -f "hermes gateway run" 2>/dev/null sleep 2 # 启动网关 /opt/hermes/.venv/bin/hermes gateway run ``` 网关启动后会进入 s6 监督模式(自动重启)。 ### Step 3:验证连接 等 15-30 秒后检查: ```bash tail -10 /opt/data/logs/gateways/default/current ``` 飞书连接成功会看到: ``` [Lark] [...] [INFO] connected to wss://msg-frontier.feishu.cn/ws/v2?... ``` ## 一键修复命令 ```bash uv pip install --python /opt/hermes/.venv/bin/python3 lark-oapi && pkill -f "hermes gateway run" 2>/dev/null; sleep 2; /opt/hermes/.venv/bin/hermes gateway run ``` ## 踩坑记录(不要再走这些弯路) ### 坑1:不要尝试 chmod site-packages - `chmod -R g+rw /opt/hermes/.venv/lib/python3.13/site-packages/` 会报 `Operation not permitted` - 即使先 `chmod 644` 单个文件再递归也不行,部分目录改不了 - **原因**:btrfs 子卷的权限限制,root 无法修改 uid 10000 的文件 - **正确做法**:不需要 chmod,`uv pip install` 可以直接写入 ### 坑2:lark-oapi 装到系统 Python 没用 - `uv pip install lark-oapi`(不带 `--python`)装到系统 Python 或 hermes 用户的 `.local` - Hermes 网关用的是 `/opt/hermes/.venv`,完全隔离 - **必须用** `uv pip install --python /opt/hermes/.venv/bin/python3 lark-oapi` ### 坑3:pip 不存在 - hermes venv 用 `uv` 管理,没有 pip - `python3 -m pip` 也没有 - **只用** `uv pip install --python /opt/hermes/.venv/bin/python3 <package>` ### 坑4:/etc/s6-overlay/ 是只读的 - 无法修改 s6 服务定义文件 - 无法在 main-hermes/run 里加启动脚本 - 不要尝试改 s6 服务配置 ### 坑5:container_environment 无法从用户层面写入 - S6_STAGE2_HOOK 需要写入 /run/s6/container_environment/ - 这个目录由 s6 初始化,用户无法预置 - 不要尝试用 S6_STAGE2_HOOK 机制 ### 坑6:容器里没有 cron 服务 - 无法用 crontab 做定时检查 - 不要尝试用 cron 方案 ## 一劳永逸方案(需要改镜像) 在 Dockerfile 中创建 venv 之后加一行: ```dockerfile RUN chmod -R g+rw /opt/hermes/.venv/lib/python3.13/site-packages/ ``` 然后重新构建镜像。这样每次容器启动权限都对,uv 安装也不会有权限问题。 如果不想改镜像,每次容器重启后执行一键修复命令即可。