实用笔记:为Hermes Agent提供具备独立Chrome浏览器的安全网页访问功能。
实用笔记的操作指南:为使用该模式的团队提供具备独立Chrome浏览器的Hermes Agent安全网页访问功能,包括合同、支票以及代码插入栏。
以下说明围绕“为 Hermes Agent 提供独立的 Chrome Podman 容器以保障安全的网络访问”这一目标,梳理出一条可行的实现路径。重点在于各种契约、检查项以及可插入的代码占位符,而非激励性表述。 在完成概览阶段时,首先明确相关契约:所需的输入参数、成功标志,以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 需同时记录正常流程与异常恢复流程。重试机制、人工审核环节以及死信处理都属于产品功能的一部分,而非后续需要补充的内容。
INTERNET
▲
│
outbound only
│
┌────────────────────────┐
│ Chrome Browser Pod │
│ │
│ Chrome Headless │
│ CDP :9222 │
└───────────┬────────────┘
│
private CDP network
│
┌───────────▼────────────┐
│ Hermes / Ollama Pod │
│ │
│ Hermes ─────► Ollama │
│ localhost:11434
│ │
└────────────────────────┘
│
▼
AMD GPU
Chrome → Internet YES
Hermes → Chrome YES
Hermes → Ollama YES
Hermes → Internet directly NO
Chrome → host filesystem NO
Hermes → rest of host NO
Either → Podman socket NO
为何要将 Chrome 放在独立的容器中?
将 Chrome 上线流程视为可度量的对象来处理最为有效。在扩大范围之前,先记录一份理想的运行日志、一个故障案例以及回滚说明。 优先选择小型且可测试的单元,而非庞大的脚本。当某个步骤出现故障时,故障应指向单一责任模块,而非复杂的流程链。 保持图表状态简洁且具有类型定义。嵌套的数据结构会掩盖哪个节点修改了哪个字段的信息,还会在流程中断后导致无法继续执行。
Untrusted Internet content
↓
Chrome container
↓
CDP
↓
Hermes
为何选择 CDP?
将 CDP 阶段视为可度量的界面时,其效果最佳。在扩大范围之前,先记录一份理想的转录结果、一个失败案例以及回滚说明。 将此阶段视为输入与已验证输出之间的契约。为相关成果命名,明确成功标准,绝不允许默默地仅完成部分工作。 保持图结构简洁且类型明确。嵌套的数据块会掩盖哪个节点编写了哪个字段的信息,还会在中断后导致无法继续处理。
chromedp/headless-shell
网络设计
将网络设计阶段视为可度量的对象来处理,效果最佳。在扩大范围之前,需记录一份理想的操作流程、一个故障案例以及回滚说明。 在功能结果旁同时记录处理时间以及令牌或查询成本。提前明确成本情况,可避免在从演示环境过渡到共享环境时出现意外账单。 保持图表状态简洁且类型明确。嵌套的数据块会掩盖哪个节点修改了哪个字段的信息,还会在出现中断后导致流程无法继续。 将网络设计阶段视为可度量的对象来处理,效果最佳。在扩大范围之前,需记录一份理想的操作流程、一个故障案例以及回滚说明。 需同时记录正常流程与恢复流程。重试机制、人工审核环节以及死信处理都是产品的一部分,而非后续需要补充的内容。
hermes-browser-link
browser-egress
Internet
▲
│
browser-egress
│
Chrome Pod
│
hermes-browser-link
│
Hermes Pod
hermes-browser-link
第一步 —— 停止现有的Hermes环境
在第一步“停止阶段”中,应在修改代码之前明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 优先选择小型、可测试的单元,而非庞大的脚本。当某个步骤失败时,故障应指向单一的责任主体,而非错综复杂的流程。 对于涉及资金支出或修改生产数据的操作,必须经过人工审批。编译时的连接方式并不等同于业务功能的完整性。
systemctl --user stop hermes-local
systemctl --user disable hermes-local
podman volume ls
hermes-data
ollama-models
第二步 — 选择私有子网
在进入第二步“选择阶段”之前,需先明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 将此阶段视为输入与经过验证的输出之间的契约。为相关成果命名,定义成功判定标准,并拒绝默许的半完成状态。 对于涉及资金支出或修改生产数据的操作,必须经过人工审批。编译时的连接配置并不等同于业务上的完整性。
10.77.0.0/24
Hermes pod: 10.77.0.10
Chrome pod: 10.77.0.20
podman network ls
podman network inspect NETWORK_NAME
第三步 — 创建私有浏览器控制网络
在第三步“创建阶段”中,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。除了功能结果外,还需记录执行时间以及令牌或查询成本。提前显示成本信息可以避免在流程从演示环境转向共享环境时出现意外费用。对于会消耗资金或修改生产数据的操作,必须经过人工审批。编译时的配置并不等同于业务功能的完整性。在第三步“创建阶段”中,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。需同时记录正常流程和异常恢复流程的细节。重试机制、人工审核环节以及错误处理措施都是产品不可或缺的部分,而非后续需要补充的内容。
podman network create \
--internal \
--subnet 10.77.0.0/24 \
hermes-browser-link
podman network inspect hermes-browser-link
第4步 — 构建浏览器出口网络
在执行“创建”这一阶段时,首先需明确相关约定:所需的输入参数、成功信号以及部分失败时的处理方式。这样的检查清单有助于确保后续代码修改的规范性。 建议采用小型、可测试的单元而非庞大的脚本。当某一步骤失败时,故障应能指向具体的责任模块,而非复杂的流程链。 在成本较高的步骤之后设置检查点。当操作员重新尝试后续节点时,恢复流程不应再次调用相同的LLM接口。
podman network create browser-egress
第5步 — 重新创建Hermes容器
在执行“第5步:重新创建阶段”时,首先写下相关契约:所需的输入参数、成功信号以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 将此阶段视为输入与验证后输出之间的契约。为相关成果命名,明确成功判定标准,杜绝无声的半完成状态。 在成本较高的步骤之后设置检查点。当操作员重新尝试后续节点时,恢复流程不应再次调用相同的LLM接口。
podman pod rm -f hermes-local
podman pod create \
--name hermes-local \
--network hermes-browser-link:ip=10.77.0.10 \
--userns=keep-id:uid=10000,gid=10000
10.77.0.10
第6步 — 重新创建Ollama
在执行第6步“重新创建Ollama环境”时,首先需明确相关规范:所需输入、成功标志以及部分失败时的处理方式。这份清单能确保后续的代码修改始终符合预期。 在功能结果旁记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。 每次调用都要记录请求ID、模型ID及延迟时间。若没有这些记录,间歇性的服务错误就会被视为应用程序的缺陷。 在执行第6步“重新创建Ollama环境”时,首先需明确相关规范:所需输入、成功标志以及部分失败时的处理方式。这份清单能确保后续的代码修改始终符合预期。 需同时记录正常流程与异常恢复流程。重试机制、人工审核环节以及错误处理措施都是产品本身的组成部分,而非后续需要补充的功能。
podman run -d \
--name ollama \
--pod hermes-local \
--device /dev/kfd \
--device /dev/dri \
--group-add keep-groups \
-e HOME=/root \
-e OLLAMA_MODELS=/root/.ollama/models \
-e OLLAMA_CONTEXT_LENGTH=64000 \
-v ollama-models:/root/.ollama \
docker.io/ollama/ollama:rocm
http://127.0.0.1:11434
podman exec ollama ollama list
第7步 — 重新构建Hermes
将第7步的“重新构建Hermes”流程视为可度量的结构来处理效果最佳。在扩大范围之前,先记录一份成功的测试用例、一个故障案例以及回滚说明。 优先选择小型且可测试的单元,而非庞大的脚本。当某一步骤出现故障时,故障应指向单一责任模块,而非复杂的流程链。 保持图结构简洁且类型明确。嵌套的数据块会掩盖哪个节点编写了哪个字段的信息,还会在流程中断后导致无法继续执行。
export HERMES_WORKSPACE="$HOME/path/to/Hermes-Workspace"
podman run -d \
--name hermes \
--pod hermes-local \
--security-opt=no-new-privileges \
--pids-limit 512 \
-v hermes-data:/opt/data \
-v "$HERMES_WORKSPACE:/opt/data/workspace:rw,nodev,nosuid" \
-w /opt/data/workspace \
docker.io/nousresearch/hermes-agent:latest \
sleep infinity
RW access:
$HERMES_WORKSPACE
/
$HOME
~/.ssh
~/.config
your normal browser profile
Podman socket
Docker socket
第8步 — 获取Chrome无头壳
将第8步的Chrome拉取阶段视为可度量的界面来处理效果最佳。在扩大范围之前,先记录一份完美的测试结果、一个失败案例以及回滚说明。 把这一阶段视为输入与已验证输出之间的契约。为相关成果命名,明确成功标准,绝不允许出现无声的半完成状态。 保持图表状态的简洁性与类型一致性。嵌套的数据块会掩盖哪个节点修改了哪个字段的信息,且在中断后会导致无法继续处理。
podman pull docker.io/chromedp/headless-shell:latest
第9步 — 创建独立的Chrome容器
将第9步“创建阶段”视为可度量的对象来处理效果最佳。在扩大范围之前,需记录一份理想的操作流程、一个故障案例以及回滚说明。 在功能结果旁同时记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外账单。 保持图表状态简洁且类型明确。嵌套的数据块会掩盖哪个节点修改了哪个字段,还会在中断后导致流程无法继续。 将第9步“创建阶段”视为可度量的对象来处理效果最佳。在扩大范围之前,需记录一份理想的操作流程、一个故障案例以及回滚说明。 需同时记录正常流程与恢复流程。重试机制、人工审核环节以及死信处理都是产品的一部分,而非后续需要补充的内容。
podman pod create \
--name hermes-browser-pod \
--network hermes-browser-link:ip=10.77.0.20 \
--network browser-egress
Chrome
│
├── 10.77.0.20 ─── private link to Hermes
│
└── browser-egress ─── Internet
第10步 — 在浏览器容器中运行Chrome
在“步骤10:运行Chrome”阶段,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。相比庞大的脚本,更应采用小型且可测试的单元。当某个步骤失败时,故障原因应能指向单一责任模块,而非复杂的流程链。对于涉及资金支出或修改生产数据的操作,必须经过人工审批。编译时的逻辑连接并不等同于业务功能的完整性。
podman run -d \
--name hermes-browser \
--pod hermes-browser-pod \
--init \
--shm-size=2g \
--security-opt=no-new-privileges \
docker.io/chromedp/headless-shell:latest
-p 9222:9222
10.77.0.20:9222
步骤11 — 从Hermes容器中测试Chrome
在步骤11的Chrome测试阶段,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 将此阶段视为输入与已验证输出之间的契约。为相关成果命名,定义成功判定标准,并拒绝默许的半完成状态。 对于涉及资金支出或修改生产数据的操作,必须经过人工审批。编译时的连接配置并不等同于业务上的完整性。
podman exec hermes python -c \
'import urllib.request; print(urllib.request.urlopen("http://10.77.0.20:9222/json/version").read().decode())'
{
"Browser": "HeadlessChrome/...",
"webSocketDebuggerUrl": "ws://10.77.0.20:9222/devtools/browser/..."
}
Hermes → Chrome
步骤12 — 验证Chrome能否访问互联网
在步骤12的验证阶段,修改代码之前需明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。应在功能结果旁记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在流程从演示环境转向共享环境时出现意外费用。对于会消耗资金或修改生产数据的操作,必须经过人工审批。编译时的配置并不等同于业务功能的完整性。在步骤12的验证阶段,修改代码之前需明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。需同时记录正常流程和异常恢复流程的细节。重试机制、人工审核环节以及错误处理措施都是产品本身的一部分,而非后续需要补充的内容。
podman exec hermes-browser \
curl -I https://example.com
browser-egress
第13步 — 验证Hermes没有直接访问互联网的权限
在执行第13步“验证Hermes”时,首先需记录下相关契约:所需的输入参数、成功信号以及部分失败时的处理方式。这样的检查清单有助于确保后续的代码修改不会出错。 建议使用小型、可测试的单元而非庞大的脚本。当某一步骤失败时,故障应能指向某个具体的责任模块,而非复杂的流程链。 在成本较高的步骤之后设置检查点。当操作员重新尝试后续节点时,恢复流程不应再次调用相同的LLM服务。
podman exec hermes python -c \
'import urllib.request; print(urllib.request.urlopen("https://example.com", timeout=5).status)'
podman exec hermes python -c \
'import urllib.request; print(urllib.request.urlopen("http://10.77.0.20:9222/json/version").status)'
200
Hermes → Internet FAIL
Hermes → Chrome PASS
Chrome → Internet PASS
第14步 — 将Hermes指向远程Chrome实例
在处理第14步的Hermes阶段时,首先写下相关契约:所需的输入参数、成功信号以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 将此阶段视为输入与验证后输出之间的契约。为相关成果命名,明确成功判定标准,杜绝无声的半完成状态。 在成本较高的步骤之后设置检查点。当操作员重新尝试后续节点时,恢复流程不应再次调用相同的LLM接口。
http://127.0.0.1:9222
http://10.77.0.20:9222
podman exec \
--user 10000:10000 \
hermes \
hermes config set browser.cdp_url http://10.77.0.20:9222
podman exec hermes \
grep -A3 '^browser:' /opt/data/config.yaml
browser:
cdp_url: http://10.77.0.20:9222
podman restart hermes
第15步 — 从Hermes进行测试
在完成第15步测试阶段时,首先需明确相关规范:所需的输入参数、成功标志以及部分失败时的处理方式。这份清单能确保后续的代码修改始终符合既定要求。 在功能测试结果旁记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。 在耗时较高的步骤之后设置检查点。当操作员重新尝试后续节点时,恢复流程不应再次调用相同的LLM服务。 在完成第15步测试阶段时,首先需明确相关规范:所需的输入参数、成功标志以及部分失败时的处理方式。这份清单能确保后续的代码修改始终符合既定要求。 需同时记录正常流程与异常恢复流程。重试机制、人工审核环节以及错误处理措施都是产品功能的一部分,而非后续需要补充的内容。
podman exec -it \
--user 10000:10000 \
-w /opt/data/workspace \
hermes \
hermes
重要提示:此为浏览器访问方式,而非无限制的Hermes网络访问
将当前浏览器测试阶段视为可测量的对象最为有效。在扩大范围之前,需记录一份理想的测试用例、一个故障案例以及回滚说明。优先选择小型且可测试的单元,而非庞大的脚本。当某个步骤出现故障时,故障应能指向具体的责任模块,而非复杂的流程链。同时要保持图表状态的简洁性与类型化——嵌套的数据结构会掩盖哪个节点修改了哪个字段的信息,还会在中断后导致无法继续执行。
Hermes browser tools
↓
Chrome
↓
Internet
curl https://example.com
为何不将Chrome放入Hermes容器中?
将“为何不使用Chrome阶段”这一概念视为可度量的指标时,其效果最佳。在扩大范围之前,先记录一个成功的案例、一个失败案例以及回滚说明。 把这一阶段视为输入与已验证输出之间的契约。为相关成果命名,明确成功标准,绝不允许出现悄无声息的半完成状态。 保持图表状态的简洁性与类型一致性。嵌套的数据块会掩盖是哪个节点修改了哪个字段,还会在中断后导致无法继续处理。
127.0.0.1:9222
Hermes pod:
private network only
Browser pod:
private network
+
Internet network
不要使用常规的Chrome配置文件
“不要搭建你的舞台”这一原则在被视为可度量的界面时效果最佳。在扩大范围之前,先记录一份完美的操作日志、一个故障案例以及回滚说明。 在功能结果旁同时记录执行时间以及令牌或查询成本。提前了解成本情况,就能避免在从演示环境过渡到共享环境时出现意外账单。 保持图表状态简洁且类型明确。嵌套的数据块会掩盖哪个节点修改了哪个字段的信息,还会在中断后导致流程无法继续。 “不要搭建你的舞台”这一原则在被视为可度量的界面时效果最佳。在扩大范围之前,先记录一份完美的操作日志、一个故障案例以及回滚说明。 需同时记录正常流程与恢复流程的文档。重试机制、人工审核环节以及死信处理都是产品本身的组成部分,而非后续需要补充的内容。
-v "$HOME/.config/google-chrome:/chrome-profile"
可选:持久化代理浏览器配置文件
对于可选的持久化代理浏览器阶段,应在修改代码之前明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 优先选择小型、可测试的单元,而非庞大的脚本。当某个步骤失败时,故障应指向单一责任点,而非复杂的流程链。 对于涉及资金支出或修改生产数据的操作,必须经过人工审批。编译时的连接方式并不等同于业务功能的完整性。
podman volume create hermes-browser-profile
Human browser profile separate
Agent browser profile separateHost filesystem separate
CDP应保持私密性
由于CDP应保持在私有阶段,因此在修改代码之前需明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 将此阶段视为输入与已验证输出之间的契约。为相关成果命名,定义成功检测标准,并拒绝默许的半完成状态。 对于涉及资金支出或修改生产数据的操作,必须经过人工审批。编译时的连接方式并不等同于业务上的完整性。
10.77.0.20:9222
hermes-browser-link
0.0.0.0:9222 -> Chrome
验证隔离性
在“验证隔离性”阶段,修改代码之前需明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 在功能结果旁记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在流程从演示环境转向共享环境时出现意外费用。 对于会产生费用或修改生产数据的操作,必须经过人工审批。编译时的配置并不等同于业务功能的完整性。 在“验证隔离性”阶段,修改代码之前需明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 需同时记录正常流程和异常恢复流程。重试机制、人工审核环节以及错误处理措施都是产品不可或缺的部分,而非后续需要补充的内容。
podman pod inspect hermes-local
podman pod inspect hermes-browser-pod
Hermes pod
└── hermes-browser-link
Browser pod
├── hermes-browser-link
└── browser-egress
podman inspect hermes \
--format '{{range .Mounts}}{{println .Type .Source "->" .Destination}}{{end}}'
podman inspect hermes-browser \
--format '{{range .Mounts}}{{println .Type .Source "->" .Destination}}{{end}}'
podman port hermes-browser
自动启动两个容器
在处理“自动启动两个容器”这一阶段时,首先需明确相关要求:所需的输入参数、成功标志,以及部分失败时的处理方式。这样的清单能确保后续的代码修改不会偏离原有设计。 建议使用小型、可测试的单元而非庞大的脚本。当某个步骤失败时,故障应指向单一的责任模块,而非复杂的流程链。 在成本较高的步骤之后设置检查点。当操作员重新尝试后续节点时,恢复流程不应再次调用相同的大型语言模型。
nano ~/.config/systemd/user/hermes-local.service
[Unit]
Description=Hermes Local AI and Browser Pods
After=default.target
[Service]
Type=oneshot
RemainAfterExit=yesExecStart=/usr/bin/podman pod start hermes-browser-pod
ExecStart=/usr/bin/podman pod start hermes-localExecStop=/usr/bin/podman pod stop -t 30 hermes-local
ExecStop=/usr/bin/podman pod stop -t 30 hermes-browser-podTimeoutStartSec=120
TimeoutStopSec=60[Install]
WantedBy=default.target
systemctl --user daemon-reload
systemctl --user enable --now hermes-local
sudo loginctl enable-linger "$USER"
podman pod ps
hermes-local
hermes-browser-pod
故障排除
在处理故障排除阶段时,首先写下相关契约:所需的输入参数、成功信号以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。 将这一阶段视为输入与验证后输出之间的契约。为相关成果命名,明确成功判定标准,杜绝无声的半完成状态。 在成本较高的步骤之后设置检查点。当操作员重新尝试后续节点时,恢复流程不应再次调用相同的大型语言模型。
Hermes无法连接到端口9222
在处理 Hermes 无法进入目标阶段的问题时,首先需记录下相关契约:所需的输入参数、成功信号以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。 在功能结果旁记录执行时间以及代币或查询成本。提前明确成本有助于避免从演示环境过渡到共享环境时出现意外费用。 在耗时的步骤之后设置检查点。当操作员重新尝试后续节点时,恢复流程不应再次收取相同的 LLM 调用费用。 在处理 Hermes 无法进入目标阶段的问题时,首先需记录下相关契约:所需的输入参数、成功信号以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。 需同时记录正常流程与异常恢复流程。重试机制、人工审核环节以及死信处理都是产品功能的一部分,而非后续需要补充的内容。
podman ps
podman exec hermes python -c \
'import urllib.request; print(urllib.request.urlopen("http://10.77.0.20:9222/json/version").read().decode())'
hermes-browser-link
Chrome可以启动,但页面会崩溃
虽然Chrome能够启动,但将其视为可测量的界面时效果最佳。在扩大范围之前,先记录一个成功的测试案例、一个失败案例以及回滚说明。 优先选择小型且可测试的单元,而非庞大的脚本。当某个步骤失败时,故障应指向单一责任模块,而非复杂的流程链。 保持图表状态简洁且具有类型定义。嵌套的数据结构会掩盖哪个节点修改了哪个字段的信息,还会在中断后导致无法继续处理。
--shm-size=2g
Chrome可以正常使用,但Hermes浏览器工具未出现
Chrome版本可以正常使用,但将Hermes阶段视为可度量的处理界面时效果最佳。在扩大范围之前,需记录一份成功的案例、一个失败案例以及回滚说明。 应将此阶段视为输入与经过验证的输出之间的契约。为相关成果命名,明确成功标准,绝不允许默许部分完成的情况。 需提供具有严格结构定义和明确副作用标识的工具。主机在自动批准之前必须清楚哪些调用会改变系统状态。
browser:
cdp_url: http://10.77.0.20:9222
nano在Hermes容器内部不可用
在“nano不可用”阶段,将其视为可测量的界面来处理效果最佳。在扩大范围之前,需记录一份理想运行案例、一个故障案例以及回滚说明。 在功能结果旁同时记录处理时间以及令牌或查询成本。提前了解成本情况,可避免在系统从演示环境过渡到共享环境时出现意外账单。 保持图表状态简洁且类型明确。嵌套的数据块会掩盖哪个节点修改了哪个字段的信息,还会在中断后导致流程无法继续。 在“nano不可用”阶段,将其视为可测量的界面来处理效果最佳。在扩大范围之前,需记录一份理想运行案例、一个故障案例以及回滚说明。 需同时记录正常流程与恢复流程。重试机制、人工审核环节以及死信处理都是产品本身的组成部分,而非后续需要补充的功能。
hermes config set
podman exec \
--user 10000:10000 \
hermes \
hermes config set browser.cdp_url http://10.77.0.20:9222
已完成的安全模型
INTERNET
▲
│
browser-egress
│
┌─────────┴──────────┐
│ Chrome Browser Pod │
│ │
│ Headless Chrome │
│ CDP :9222 │
└─────────┬──────────┘
│
hermes-browser-link
INTERNAL ONLY
│
┌─────────▼──────────┐
│ Hermes/Ollama Pod │
│ │
Host Workspace ─►│ Hermes │
RW │ │ │
│ ▼ │
│ Ollama │
│ │ │
└─────┼──────────────┘
▼
AMD GPU
ACCESS
Hermes → designated host workspace YES
Hermes → Ollama YES
Hermes → Chrome CDP YESChrome → Internet YESHermes → Internet directly NO
Hermes → rest of host filesystem NO
Hermes → SSH keys NO
Chrome → host filesystem NO
Chrome → normal browser profile NO
Hermes → Podman/Docker socket NO
Chrome → Podman/Docker socket NO
Host/LAN → Chrome CDP NO
为何选择这种架构
Give it the filesystem.
Give it Docker.
Give it Internet.
Give it Chrome.
Give it credentials.
one working directory
local-model access
browser-control access
model storage
GPU access
Internet access
CDP connectivity
my SSH keys
my entire home directory
my normal browser profile
my Podman socket