Hermes WebUI Docker 启动报 ".env permission denied" 怎么配置权限修复开关
【免费下载链接】hermes-webuiHermes WebUI: The best way to use Hermes Agent from the web or from your phone!项目地址: https://gitcode.com/GitHub_Trending/he/hermes-webui
用 Docker 部署 Hermes WebUI 时,如果你的.env文件带有 group 权限位(比如 0640),容器启动后会先打印一行权限修正日志,紧接着报.env读取失败、无法启动。本文对应 docs/docker.md "What goes wrong" 一节中记录的 #1389 问题,说明如何通过HERMES_SKIP_CHMOD和HERMES_HOME_MODE两个权限修复开关关闭或放宽启动时的强制 chmod 行为,让容器正常启动。
先确认是这个问题的现象
docs/docker.md 给出的判定条件是:宿主机上.env文件被设置成 0640 这类 group 可读模式(例如 bind-mount 一个已存在的~/.hermes,.env故意保持 group 可读),容器启动后日志出现:
[security] fixed permissions on .env (0o640 -> 0600) failed to load .env: open .env: permission denied如果日志是其他路径的PermissionError(如/home/hermeswebui/.hermes/...读不到),那是 bind mount 的 UID/GID 不匹配问题,对应同一文档中的第 1 条,需要设置UID/GID,不是本文的开关能解决的。
原因:启动钩子默认强制 0600
WebUI 每次进程启动都会执行 api/startup.py 中的fix_credential_permissions()。它扫描HERMES_HOME下的敏感文件——.env、google_token.json、google_client_secret.json、.signing_key、auth.json——对带 group/other 位的文件强制改回0600,并打印上面那行[security] fixed permissions ...日志。文档指出,这对干净安装是正确行为,但会覆盖运维者刻意设置的 group 位,导致.env加载失败。
在 .env 里配置权限修复开关
修复方式是设置下面两个环境变量之一,写进你的.env文件(也就是 compose 读取的环境文件):
HERMES_SKIP_CHMOD=1— 完全绕过这个修正钩子HERMES_HOME_MODE=0640— 允许 group 位,只剥掉 world 可读位
HERMES_SKIP_CHMOD=1或者
HERMES_HOME_MODE=0640.env.docker.example的 "Permission handling for bind-mounted .hermes" 一节对这两个开关有同样的说明,三个 compose 文件(docker-compose.yml、docker-compose.two-container.yml、docker-compose.three-container.yml)的 WebUI service 块里也留了对应的注释行,可以按需取消注释。
改完后重启容器。单容器(docker-compose.yml)按 docs/docker.md 给出的命令:
docker compose down && docker compose up -d两容器或三容器布局带上-f指定 compose 文件:
docker compose -f docker-compose.two-container.yml down docker compose -f docker-compose.two-container.yml up -d三容器把文件名换成docker-compose.three-container.yml。
多容器布局下 HERMES_HOME_MODE 的语义差异
如果你在跑docker-compose.two-container.yml/docker-compose.three-container.yml,注意HERMES_HOME_MODE在 WebUI 和 agent 镜像里含义不同:
- WebUI:credential 文件(
.env、.signing_key等)的 mode 阈值,0640表示允许 group 位 - Agent:
HERMES_HOME目录的 mode,默认0700
0640用在目录上没有 owner 执行位,agent 无法进入自己的 home 目录,容器直接起不来。多容器场景如果要给 agent 侧设置,应使用HERMES_HOME_MODE=0750(group 可穿越)或0701(x-only)。两个 compose 文件的 agent 与 WebUI service 块内的注释分别标注了各自的正确取值,不要互相照抄数值。
另外,agent 容器自身检测到/.dockerenv后会自动跳过 credential chmod,所以 agent 侧的HERMES_SKIP_CHMOD是多余的,不用配置。
验证结果
按 docs/docker.md 末尾给出的诊断方式,查看容器日志:
docker logs hermes-webui确认不再出现[security] fixed permissions on .env和failed to load .env: open .env: permission denied两行,然后按快速启动一节的步骤打开http://localhost:8787,页面能加载即说明.env已被正常读取。
相关背景
- #1389:
HERMES_HOME_MODE覆盖行为,v0.50.254 起 agent 侧也遵循HERMES_SKIP_CHMOD与HERMES_HOME_MODE(见 docs/docker.md 的 Related issues 一节) - 实现细节见 api/startup.py 的
fix_credential_permissions():HERMES_SKIP_CHMOD取1或true时直接返回;设置了HERMES_HOME_MODE时只清除 other 位(0o007),否则整体改到0o600 - 如果你是在 bind-mount 迁移既有
~/.hermes,同一文档的 "Bind-mount migration" 一节的第 4 条要求同样设置HERMES_SKIP_CHMOD=1或HERMES_HOME_MODE=0640,避免启动钩子再去强制 0600
【免费下载链接】hermes-webuiHermes WebUI: The best way to use Hermes Agent from the web or from your phone!项目地址: https://gitcode.com/GitHub_Trending/he/hermes-webui
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考