摘要:Hermes Agent 有四种部署方式:一行命令、Docker、$5 VPS、Modal Serverless。选错了不是"跑不起来",而是踩进安全边界、成本曲线和运维复杂度三个坑。本文按"决策 → 安装 → 配置 → 加固 → 成本 → 运维"的顺序走一遍,每个决策点给出理由,最后给一张可以直接抄的决策速查表。
这是「Hermes Agent 深度剖析」系列的第 6 篇,全系列 7 篇:
01 总览:25 万 Star 的自改进 Agent 到底强在哪
02 三层记忆架构:会话记忆、持久记忆与用户模型怎么分工
03 技能学习闭环:Agent 怎么自己写技能文档
04 多平台网关:一个进程接住 16 个消息平台
05 安全架构:容器沙箱、技能扫描与人在回路
06 从零到生产:四种部署方式与成本账(本文)
07 vs OpenClaw:十二个维度的选型对比
一、四种部署方式,先看清地图
| 部署方式 | 启动时间 | 隔离强度 | 持久化 | 月成本 | 适合谁 |
|---|---|---|---|---|---|
| 一行命令 | 30 秒 | 弱(跑在宿主机用户权限下) | 本地目录 | $0 | 体验、调试、写代码 |
| Docker | 2 分钟 | 强(capabilities + 只读根目录) | Volume 挂载 | $0–5 | 生产首选 |
| VPS | 10 分钟 | 中(依赖容器配置) | 云磁盘 | $5–30 | 7×24 在线 |
| Modal Serverless | 1 分钟 | 中(依赖镜像配置) | 对象存储 | $0–60+ | 间歇使用、需要 GPU |
一句话结论:开发用一行命令,生产用 Docker。VPS 和 Serverless 本质是"Docker + 一层托管",安全能力还是来自容器本身。
为什么不直接把 VPS 当独立方案?因为你在 VPS 上跑的还是同一个容器。VPS 解决的只是"机器在哪、怎么常开",不解决"跑得多安全"。
二、方式一:一行命令,它到底做了什么
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
这行命令背后的完整流程:
检测系统(macOS / Linux)
→ 检查依赖(git、curl、python3)
→ 从 GitHub Releases 下载最新二进制
→ 装到 /usr/local/bin/hermes
→ 创建 ~/.hermes/ 目录
→ 启动交互式配置向导
→ 选 LLM 提供商(OpenRouter / Nous Portal / OpenAI / Anthropic / Ollama)
→ 填 API Key
→ 写入 ~/.hermes/.env
2.1 两个必须知道的隐患
| 隐患 | 为什么危险 | 怎么办 |
|---|---|---|
| 供应链 | 脚本内容不可审计,仓库被攻破就可能植入恶意代码 | 先下载后审查:curl -fsSL <url> -o install.sh && less install.sh,确认后再执行 |
| 权限过大 | 装到 /usr/local/bin 需要 sudo,脚本等于拿到完整系统权限 |
生产环境别用它,直接上 Docker |
我的看法:curl | bash 没有问题,问题在于"默认信任"。把它当"开发机上 30 秒装好试试"的工具,而不是部署手段,心态就对了。
三、方式二:Docker,生产环境的标准答案
mkdir -p ~/.hermes/{
data,skills,logs,config}
docker run -d \
--name hermes-agent \
--restart=unless-stopped \
--shm-size=1g \
--cap-drop=ALL \
--cap-add=CHOWN \
--cap-add=DAC_OVERRIDE \
--security-opt=no-new-privileges \
--pids-limit=100 \
--memory=2g \
--memory-swap=2g \
--cpus=2 \
--read-only \
--tmpfs /tmp:rw,noexec,nosuid,size=256m \
--tmpfs /run:rw,noexec,nosuid,size=64m \
-v ~/.hermes/data:/root/.hermes/data:rw \
-v ~/.hermes/skills:/root/.hermes/skills:rw \
-v ~/.hermes/logs:/root/.hermes/logs:rw \
-v ~/.hermes/config:/root/.hermes/config:ro \
-e HERMES_CONFIG_PATH=/root/.hermes/config/config.yaml \
nousresearch/hermes-agent:latest
| 参数 | 作用 | 挡住什么 |
|---|---|---|
--cap-drop=ALL |
清空所有 Linux capabilities | 容器内即使拿到 shell 也执行不了特权操作 |
--security-opt=no-new-privileges |
禁止进程获取新权限 | setuid 提权 |
--read-only |
根文件系统只读 | 往系统目录写恶意文件 |
--pids-limit=100 |
进程数上限 | fork 炸弹耗尽宿主机 PID |
--memory=2g --cpus=2 |
计算资源硬限制 | 内存泄漏、CPU 打满 |
--shm-size=1g |
共享内存 | Playwright 跑 Chromium 必需 |
3.1 一个容易被忽略的细节
注意 --cap-add=CHOWN 和 --cap-add=DAC_OVERRIDE——这是刻意留的两个例外。
原因很实在:Agent 要在挂载的 Volume 里创建技能文档、写日志、维护记忆库。没有 CHOWN 就无法调整属主,没有 DAC_OVERRIDE 就会被文件权限卡住。这是安全性和可用性的一个真实权衡点。
值得学的是这个做法本身:"全禁 + 最小例外"比"默认给一堆"安全得多,因为每个例外都是显式的、可审计的、有理由的。
四、方式三:VPS,$5 能不能跑
以 1 vCPU / 2GB 的小机器为例,完整流程是:装 Docker → 建目录 → 写配置 → 用同一套安全参数起容器。
# ~/.hermes/config/config.yaml(VPS 精简版)
models:
primary:
provider: openrouter
model: anthropic/claude-sonnet-4.6
max_tokens: 4096
secondary:
provider: openrouter
model: google/gemini-2.5-flash
local:
provider: ollama
model: qwen3:8b
memory:
persistent:
engine: fts5
max_documents: 10000
summarization:
trigger_threshold: 0.7
选型参考(价格为写作时公开报价,会变动):
| 机型 | 配置 | 月成本 | 说明 |
|---|---|---|---|
| Hetzner CX22 | 1 vCPU / 2GB | ~$4 | 轻量自用,主用便宜模型 |
| Hetzner CX32 | 2 vCPU / 4GB | ~$8 | 甜点,可同时跑一个 8B 本地模型 |
| DigitalOcean Basic | 1 vCPU / 1GB | $6 | 美国区延迟低 |
| AWS Lightsail | 1 vCPU / 1GB | $5 | AWS 生态集成方便 |
我的判断:别被"$5/月"骗了。1GB 内存跑 Docker + Playwright 会频繁 OOM,实际可用的是 4GB 那档。多花 $4/月换来的稳定性,比省下的钱值。
五、方式四:Serverless,什么时候才划算
Modal 是官方支持的 Serverless 平台,适合间歇使用或需要 GPU 的场景:
import modal
from modal import Image, App, Secret
app = App("hermes-agent")
hermes_image = (
Image.debian_slim()
.apt_install("curl", "git", "python3", "python3-pip")
.run_commands(
"curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/"
"main/scripts/install.sh | bash"
)
)
@app.function(
image=hermes_image,
secrets=[Secret.from_name("hermes-env")],
timeout=3600,
memory=4096,
cpu=2,
)
@modal.asgi_app()
def hermes_server():
import subprocess
subprocess.Popen(["hermes", "start", "--gateway-only"])
modal secret create hermes-env \
HERMES_PRIMARY_PROVIDER=openrouter \
HERMES_PRIMARY_MODEL=anthropic/claude-sonnet-4.6 \
OPENROUTER_API_KEY=sk-or-xxx
modal deploy hermes_modal.py
按"CPU 约 $0.68/小时、内存约 $0.09/小时/GB"的公开单价粗算(2 核 4GB 满配约 $1/小时):
| 使用强度 | 月成本粗算 | 对比 VPS $8 |
|---|---|---|
| 每天 2 小时 | ~$60 | VPS 便宜 7 倍 |
| 每天 1 小时 | ~$30 | VPS 便宜 4 倍 |
| 每天 30 分钟 | ~$15 | VPS 略便宜 |
| 每天 10 分钟 | ~$5 | Serverless 更便宜 |
临界点大约在"每天 20–30 分钟"。但这里有个陷阱:Agent 的"空闲"不是真的空闲——Telegram、Discord 的消息随时可能进来,冷启动会带来几秒延迟,长连接在 Serverless 上也不天然成立。
我的判断:Serverless 适合"我知道自己什么时候用它"的人(比如只在工作时间用、或者跑批处理任务)。如果你的 Agent 要 7×24 接消息,VPS 的固定成本模型反而更可控、体验更好。
六、配置核心:为什么需要三个模型
这是 Hermes 配置体系里最值得借鉴的一个设计——不是"一个强模型打天下",而是按任务分流:
models:
primary:
provider: openrouter
model: anthropic/claude-sonnet-4.6
max_tokens: 8192
# 复杂推理、代码生成、多步工具调用
secondary:
provider: openrouter
model: google/gemini-2.5-flash
max_tokens: 4096
temperature: 0.3
# 简单问答、格式转换、摘要压缩
local:
provider: ollama
model: qwen3:14b
max_tokens: 2048
temperature: 0.1
# 敏感数据、离线场景
routing:
rules:
- task_types: ["code_generation", "code_review", "architecture_design"]
model: primary
- task_types: ["summarization", "translation", "formatting"]
model: secondary
- task_types: ["file_analysis", "personal_notes", "credential_handling"]
model: local
fallback:
primary_timeout: 30s
max_retries: 2
fallback_chain: [secondary, local]
三级配置真正的价值不在"贵的干重活",而在这三件事:
| 价值 | 机制 | 效果 |
|---|---|---|
| 故障隔离 | Primary 超时 → 自动降级 Secondary → 再降 Local | 上游 API 抖动时用户无感 |
| 隐私边界 | 敏感任务固定路由到本地 Ollama | 数据不出本机 |
| 成本控制 | 简单任务走便宜模型 | 简单请求成本可降一个量级 |
6.1 一个反直觉的建议
不要为了省钱把 Primary 设成便宜模型。
理由在系列第 3 篇:Primary 决定了自动生成的技能文档质量,而技能文档会被反复加载使用。在 Primary 上省 $10/月,等于在"知识资产"上省钱——你省下的是一次推理的钱,损失的是未来几十次任务的质量。这笔账算不过来。
七、工具配置:把能力关在圈里
tools:
browser:
engine: playwright
headless: true
timeout: 30s
sandbox: true
allowed_domains: ["github.com", "agentskills.io"]
blocked_domains: ["*internal*", "*admin*"]
code_execution:
sandbox: docker # docker | bubblewrap | none
timeout: 30s
max_memory: 512m
allowed_languages: [python, bash, javascript]
network_access: false # 沙箱内禁网
filesystem:
allowed_paths: ["~/projects/", "~/documents/"]
denied_paths: ["~/.ssh/", "~/.aws/", "/etc/"]
max_file_size: 10m
shell:
enabled: true
require_confirmation: ["rm", "sudo", "chmod", "curl.*|.*sh"]
timeout: 60s
三条原则对应到配置上:
| 原则 | 配置落点 | |
|---|---|---|
| 最小权限 | 浏览器只访问白名单域名;文件系统只挂载必要目录 | |
| 纵深防御 | 代码执行进 Docker 沙箱,且沙箱内禁网 | |
| 人工审核 | rm、sudo、`curl \ |
bash` 必须确认 |
其中 network_access: false 这条最容易被忽略也最有价值:它把"执行任意代码"和"把数据传出去"这两件事拆开了。很多攻击链的关键一步不是执行,而是外传。
八、密钥管理:五个安全等级
永远不要把 API Key 写进 config.yaml。
| 等级 | 方式 | 安全性 | 说明 |
|---|---|---|---|
| 0 | 硬编码在 config.yaml | 极差 | 一次 git push 就泄露 |
| 1 | .env 文件 + chmod 600 |
一般 | 文件泄露即密钥泄露 |
| 2 | 环境变量注入 | 较好 | 不落盘,容器重启即消失 |
| 3 | 系统密钥管理器(Keychain / secret-tool) | 好 | 加密存储,需系统认证 |
| 4 | Vault / 云 Secrets Manager | 最好 | 审计 + 自动轮换 |
# 等级 2
export OPENROUTER_API_KEY="sk-or-v1-xxx"
# 等级 3(macOS)
security add-generic-password -a hermes -s openrouter -w "sk-or-v1-xxx"
# 等级 3(Linux,需 libsecret)
secret-tool store --label="Hermes OpenRouter" service hermes key openrouter
个人用等级 2–3 就够,团队用等级 4。
九、平台接入:一条命令的事
hermes platform add telegram
# → Bot Token
# → Allowed Users(务必填白名单)
hermes start
Telegram 的配置里有个必做的动作——用户白名单:
telegram:
bot_token: "${TELEGRAM_BOT_TOKEN}"
allowed_users: [123456789, 987654321]
permissions:
admin_commands:
users: [123456789]
commands: ["/config", "/restart", "/memory stats"]
user_commands:
users: "*"
commands: ["/ask", "/help", "/skills"]
公开一个不设白名单的 Bot,等于把你的终端挂在公网上。这一点在系列第 4 篇已经讲过网关怎么统一管理多平台,这里不重复。
十、成本账:钱花在哪,怎么省
标准方案(VPS + 云端 Primary)的月度构成大致是:
| 成本项 | 占比 |
|---|---|
| Primary 模型 API | ~55% |
| Secondary 模型 API | ~15% |
| VPS 主机 | ~15% |
| 域名 / SSL / 其他 | ~10% |
| API 平台手续费 | ~5% |
模型 API 占了七成——所以省钱的主战场在模型侧,不在服务器侧。六个有效的策略:
| 策略 | 做法 | 效果 |
|---|---|---|
| 分流到 Secondary | 任务路由让简单请求走便宜模型 | 简单请求成本可降一个数量级 |
| 提前压缩上下文 | trigger_threshold: 0.7(不等 90%) |
长对话 token 显著下降 |
| 限制工具调用 | 单任务最多 15 次工具调用 | 防止循环调试烧钱 |
| 技能缓存命中 | 让 Agent 复用已有技能文档 | 官方口径约省 40% token |
| 选对 API 路由 | 主力模型直连,备用走聚合平台 | 省 5% 左右手续费 |
| 用免费额度 | 部分厂商有免费 tier(速率受限) | 兜底与试跑 |
tools:
global:
max_tool_calls_per_task: 15
max_browser_pages: 3
max_code_executions: 5
memory:
summarization:
trigger_threshold: 0.7
model: secondary
max_summary_tokens: 512
我的看法:成本优化的本质不是"选便宜模型",而是减少无效推理。技能复用省下的 40% token 比换模型省下的 20% 更实在,而且它不牺牲质量——这是唯一"既要又要"的优化项。
十一、生产运维:四件必须做的事
11.1 健康检查
monitoring:
health_check:
enabled: true
endpoint: "/health"
port: 9090
checks: [memory_db, primary_model, secondary_model, disk_usage]
metrics:
enabled: true
endpoint: "/metrics"
port: 9090
format: prometheus
hermes doctor 能一次给出全貌:
✅ Container: healthy (uptime 14d 3h)
✅ Memory DB: 12,847 docs, 8.3ms avg latency
✅ Primary Model: reachable (234ms)
⚠️ Disk usage: 87% (threshold: 90%)
❌ Skill cache hit ratio: 0.22 (threshold: 0.30)
最后一行很关键:技能缓存命中率低,说明 Agent 花在"重新推理"上的钱变多了,这是一个比费用账单更早的预警信号。
11.2 备份
#!/bin/bash
BACKUP_DIR="/backup/hermes"; RETENTION_DAYS=30
mkdir -p "$BACKUP_DIR"
cp ~/.hermes/data/memory.db "$BACKUP_DIR/memory-$(date +%Y%m%d).db"
tar -czf "$BACKUP_DIR/skills-$(date +%Y%m%d).tar.gz" ~/.hermes/skills/
tar -czf "$BACKUP_DIR/config-$(date +%Y%m%d).tar.gz" ~/.hermes/config/
find "$BACKUP_DIR" -type f -mtime +$RETENTION_DAYS -delete
| 数据 | 频率 | 保留 | 位置 |
|---|---|---|---|
| 记忆数据库 | 每日 | 30 天 | 本地 + 对象存储 |
| 技能文档 | 每日 | 永久 | 本地 + Git |
| 配置文件 | 每次变更 | 永久 | Git |
| 审计日志 | 每周 | 90 天 | 低成本对象存储 |
技能文档进 Git 这一条我特别推荐:技能是纯文本的 SKILL.md,天然适合版本管理,还能看出"Agent 这几周学了什么"。
11.3 升级
□ 读 Release Notes,确认 Breaking Changes
□ 备份记忆库与技能文档
□ 低峰时段操作
□ 拉起新容器,跑一次 smoke test(发一条测试消息)
□ 观察 30 分钟错误率与延迟
□ 确认技能文档格式兼容
11.4 故障分诊
| 现象 | 先查什么 | 常见原因与处理 |
|---|---|---|
| 完全无响应 | docker ps |
容器停了 → 起容器;OOM → 加内存 |
| 回复质量突然下降 | 模型可用性 | Primary 超时降级到了 Secondary |
| 成本异常飙升 | 任务路由规则 | 路由失效导致全走 Primary;或上下文失控 |
| 记忆检索变慢 | hermes memory stats |
碎片率 > 30% → hermes memory vacuum |
| 技能命中率下滑 | hermes skills list |
技能过时或重复 → hermes skills prune |
十二、我的看法:四个反常识的结论
一、"一键安装"是在借未来的债。 它省了 30 秒安装时间,但留下了不可审计的脚本、不可控的安装路径、不干净的卸载。它的正确位置是"试用",不是"部署"。
二、Docker 的安全参数不是锦上添花,是底线。 这个 Agent 能执行 Shell、能读写文件、能开浏览器。它的容器被攻破,后果不是"数据泄露",是"机器易主"。顺带纠正一个流传很广的说法:OpenClaw 的 CVE-2026-25253 不是"Prompt 注入导致命令执行",而是控制端 UI 信任了 URL 里的 gatewayUrl 参数,被恶意链接劫持 WebSocket 并窃取令牌——第 5 篇有完整复盘。无论是哪种成因,结论都一样:能执行命令的容器,必须按"随时会被攻破"来设计。
三、三级模型是"反脆弱",不是"省钱技巧"。 从 Primary 降级到 Secondary 再到 Local,这个链条的意义是:外部全挂的时候,系统仍然可用,只是变笨。追求"永不故障"的架构很脆弱,追求"优雅降级"的架构才稳。
四、部署不是一次性工作。 你的 Agent 用得越久,记忆库和技能库越值钱。丢三个月的记忆,等于让它失忆三个月——这部分损失没法用钱衡量。所以备份这件事,应该在第一天就做,而不是在第一次事故之后。
十三、总结
决策速查表
| 决策点 | 推荐 | 一句话理由 |
|---|---|---|
| 部署方式 | 生产 Docker / 体验一行命令 | Docker 提供纵深防御,一行命令只用于验证 |
| 安全参数 | --cap-drop=ALL + --read-only + --pids-limit |
三层叠加,被攻破也提不了权 |
| 密钥 | 环境变量或系统密钥管理器 | 不落盘,或至少 600 权限 |
| 模型组合 | 强模型做 Primary + 便宜模型做 Secondary + 本地做敏感任务 | 兼顾质量、成本、隐私 |
| 平台 | 个人 Telegram / 团队 Discord | API 简洁,延迟低 |
| 成本控制 | 任务路由 + 提前压缩 + 技能复用 | 组合起来能省一半以上 |
| 监控 | 至少盯三类:费用、延迟、记忆库水位 | 出问题之前先看到曲线 |
| 备份 | 每日自动 + 技能进 Git | 记忆和技能是核心资产 |
给中高级开发者的五条建议:
- 生产环境别用
curl | bash - Primary 模型别省钱,它决定了技能质量
- 现在就配监控,别等出事
- 每月花 10 分钟翻一遍自动生成的技能,错的删掉
- 把备份当回事
部署不是终点。装好只是让 Agent 开始工作,真正让它值钱的是从今天起积累的每一条记忆、每一个技能。
下一篇:《vs OpenClaw:十二个维度的选型对比》——把两个框架放在同一张表上量一遍,然后说清楚什么情况下该选谁。
延伸阅读
这是本系列的倒数第二篇。也想听听你的场景:你的 Agent 现在跑在哪——笔记本、一台 $5 的机器,还是按秒计费的云上?每月账单一共多少钱?