NAS上Docker部署的Hermes与用户目录权限协作完全指南——Hermes不会再提示没有读写权限了

Hi,我是执着于持续分享NAS、AI、数码、家电、软件技巧相关知识,坚持创作有深度、高质量作品的博主 设计虱聊科技。期待您的关注。
在 NAS 上通过 Docker 自己部署 Hermes 的朋友,都会遇到这个问题:在 NAS 上直接编辑 Hermes 的配置文件、文稿后,这个文件的所有者会发生变化,Hermes 想再读写这个文件,就会提示没有权限。
这样会给我们的操作带来极大的不便,因为这就意味着协作链断了,对于 AI 助手来说,是个致命的问题。

我们都知道,Hermes 的容器内用户是 hermes:hermes。假设我在 NAS 上的用户是 shejishi:1013,那么问题的本质就变成, Hermes 容器内的用户(hermes:hermes)和 NAS 上的宿主用户(shejishi:1004)不在同一个世界,不能互相产生关联。
最优雅的解决方案是:把 Hermes 容器内的 hermes 用户,加入到宿主机的用户组里。这样 hermes 和 shejishi 属于同一组,就可以共享组内文件的读写权限。

✿ 查询自己的用户信息
假如我的用户名是 shejishi,需要用 SSH 连接 NAS 查询自己的用户名 ID 和所属的用户组 ID 。
绿联 NAS 的 SSH 需要在 控制面板-终端机 开启,其他 NAS 同理。

然后找个终端,比如 Windows 的 PowerShell。在窗口 ssh 连接 NAS 的 IP 地址,比如我的登录名是 shejishi,NAS IP 是 192.168. 31.116,就输入:
ssh shejishi@192.168.31.116窗口会要求输入密码,直接输入我们的 NAS 登录密码,出于隐私保护考虑,输密码时不会显示字符,输入后直接回车,然后输入id。
我们就会看到类似这样的输出:

意思是,shejishi 这个账号的 id 是 1013,所属的普通用户组 id 是 100。那我们直接把 Hermes 的用户也加入 100 这个普通用户组,他们就是可以协作的队友了。
关键点: 用户组:100(users)
注意: 每个人的用户 ID 和用户组 ID 不一样,要实际查一下,下面过程中代换进去,不能直接抄我的。
✿ 修改 Hermes 的 docker-compose.yaml
我们可以在 Hermes 的 docker-compose.yaml 中添加 user 和 group_add 参数,让容器内的 hermes 用户加入宿主机的用户组。
这里注意,不能为了省事直接指定 user: "1013:100",让容器内所有操作都以 shejishi 用户执行,因为这样的话,容器自己的初始化脚本会出问题,会无法启动。
更好的做法是保留容器内的 hermes 用户,但额外加入宿主机的用户组:
services:
hermes:
image: ghcr.io/nousresearch/hermes-agent:latest
container_name: hermes
# 以上保持不变↓下面是增加的:
user: "10000:100"
group_add:
- "100"
# 以下保持不变……这里省略的具体yaml配置,可以在我之前文章中完整yaml的基础上,增加上面的三行就可以了。注意把100换成你查到的自己的用户组。
✿ 在SSH把docker内的Hermes用户加入普通用户组
只是改 Compose 可能还不够,我们在 SSH 把容器内的 hermes 用户也加入 100 组。
我们需要先找到 Hermes 的容器名称,有两种方法:
方法一:去部署 Hermes 时的 Compose 文件里找

可以看到我的 Hermes 容器名是 hermesopt,这是我自己起的名字,你的很可能不同,以你查到的为准。
方法二:在 SSH 中查询
在 SSH 输入:
sudo docker ps | grep hermes同样的输入密码,回车,就会看到输出结果了,先找到 Hermes 的镜像名,然后在它后面找到容器名。

把 Hermes 用户加入 100 用户组:
在 SSH 输入以下命令,
docker exec -u root hermesopt sed -i 's/^users:x:100:/users:x:100:hermes/' /etc/group★ 这条命令里,hermesopt 就是刚才查到的我的 Hermes 的容器名,你要替换成自己的。
输入后,回车,不显示任何结果是正常的,不用管它,直接让Hermes帮你验证是否成功加入100组,或者在Hermes的终端中输入id查询。
这样,容器里的 Hermes 用户就成为 100 用户组的一员啦。

✿ 把Hermes目录下的所有文件权限还给Hermes
如果之前你已经动了 Hermes 的文件,导致他失去了这些文件和目录的权限,我们就需要把文件所有权还给 Hermes。
一个 省事但也许★不那么安全★的方法 供参考(后面也有提供安全但费事的方法,请自己权衡):
(1)把这个目录+文件权限全部设为755(这一步有一定风险)
(2)把这个目录+文件所有权还给 Hermes(10000:10000)
(3)让Hermes自己修复敏感文件的权限
比如我要修复的目录是:/volume1/docker/hermesopt/opt/data
我就在 SSH 终端输入:
sudo chmod -R 755 /volume1/docker/hermesopt/opt/data
sudo chown -R 10000:10000 /volume1/docker/hermesopt/opt/data-
-R: 意思是递归,就是把目录和子目录、目录内文件全部这样修改。
-
755: 意思是所有者可读写、其他用户可读
-
sudo: 意思是临时提升到 root 权限,因为是敏感操作,普通用户权限不足。
因为我们没有以 root 权限登录,所以敏感操作需要用 sudo 命令临时提权,提示输密码就输密码。
★风险提示: 这样操作虽然方便,但是也存在很大的风险,敏感信息,比如对话记录、记忆文件、. env 文件中的各种 key,现在短暂暴露在所有用户的眼皮底下了。所以,我说这是 方便但危险 的操作。

这个风险大家自己权衡,如果觉得不放心,也可以直接问 Hermes,按他的指引分步骤分别给每批目录和文件授予 755、700、600 等权限。

如果你和我一样,选择方便但有风险的操作,那现在是让 Hermes 出力的时候了,他已经拥有了所有文件的所有权,现在让他自己修复这些敏感信息的权限。
先让他查看目录,排查权限风险。可能你的 Hermes 会列出更多。

然后,让 Hermes 自动修复。

到这里,权限问题就全部搞定。所有 Hermes 协作目录的文件归 Hermes 所有,但我们同时也可以随时修改它。完美。
✿ 下期预告
大家有遇到过 Hermes 工作时间长了以后,Memory 经常满、失忆的情况吗,下篇咱们聊聊本地部署 Hermes 的第二大脑——大名鼎鼎的 Hindsight,但是本地版。不花钱。

坚持创作有深度、高质量的作品、致力于分享干货、抵制标题党和网络垃圾,是我的座右铭。
关注我,蹲后续。您的支持对我真的很重要O(∩_∩)O)。让我们共同打造互联网内容创作和知识分享的一股清流!ヾ(◍°∇°◍)ノ゙