
前言:前段时间写了一篇《手把手教你搭建Hermes Agent并且配置微信和TG通知渠道完善日常工作流》的技术分享。最近我习惯用 Hermes 的多 Agent 配合Hermes Kanban推进工作,Hermes Dashboard支持拖拽分配任务与自动调配,成了日常各类工作的调度中心。面板默认只监听本机 9119,不同设备访问不便,如果暴露公网不安全,如果通过SSH本地连接转发那么在不同设备访问不便。本文记录用 Cloudflare Tunnel 与 Access 实现安全公网访问的完整方案:零入站端口、自动 HTTPS、邮箱白名单安全认证。
背景:为什么要把 Dashboard 暴露到公网
最近一段时间,我的工作流有明显变化:更依赖 Hermes 的多 Agent 协作,并用 Kanban 看板把任务串起来。

大致是这样用的:
- 多个 Agent 各司其职(调研、实现、验证等),由 Hermes 统一调度;

- Kanban 负责可视化:待办、进行中、阻塞、完成,一眼看清全局;
- Hermes Web Dashboard (本地默认 9119 端口)把会话、模型、定时任务、技能等集中管理。
对我来说,Dashboard 不只是「看一眼状态」的页面,而是操作台 :在看板上拖拽 就能做任务分配,配合 Hermes 的调度能力还能做自动调配------比纯 CLI 直观得多,也更适合多 Agent 并行时的日常指挥。
问题是:Dashboard 默认只监听 localhost ,人不在 VPS 旁时,手机、笔记本都访问不到。传统做法要开端口、Nginx、证书、认证,维护成本高。我需要的是:偶尔从外网安全打开这块看板,而不是再搭一套公网架构。
当本地服务已经是日常中枢(而不只是调试页)时,「安全公网可达」就变成刚需;Cloudflare Tunnel + Access 适合这种「轻量、个人、要强认证」的场景。
一、方案概述与流量路径
目标:在不开放任何入站端口 、不部署 Nginx 的前提下,通过 HTTPS 访问 Dashboard,并限制只有本人能登录。
流量路径:
arduino
用户浏览器
→ Cloudflare Edge(HTTPS + Access 认证)
→ Cloudflare Tunnel(QUIC 加密隧道)
→ 服务器 cloudflared(本地进程)
→ http://localhost:9119(Hermes Dashboard)
| 对比项 | 传统公网暴露 | 本方案 |
|---|---|---|
| 防火墙 | 需开放端口 | 零入站端口 |
| 反向代理 | 通常需要 Nginx/Caddy | 不需要 |
| TLS 证书 | 自行申请与续期 | Edge 自动 HTTPS |
| 访问控制 | 自装 Basic Auth 等 | Cloudflare Access 策略 |
本质是把「公网访问我的端口」改为「本机进程主动向外建立隧道」,对 NAT、安全组、家庭宽带都更友好。
二、环境说明
以下为本次实践使用的配置
| 项目 | 说明 |
|---|---|
| 操作系统 | Debian 13.x(x64) |
| 域名 | 已接入 Cloudflare 的自有域名 |
| 子域名 | hermes.<你的域名>(示例) |
| Dashboard | Hermes,localhost:9119 |
| 隧道组件 | cloudflared(systemd 托管) |
三、安装 cloudflared
可以直接让hermes安装,明确告知你要使用Cloudflare Tunnel来内网穿透VPS的指定端口服务
ruby
curl -fsSL https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 \
-o /usr/local/bin/cloudflared && chmod +x /usr/local/bin/cloudflared
cloudflared --version
四、创建 Cloudflare Tunnel
在控制台创建,SSH 环境不宜依赖 cloudflared tunnel login 弹浏览器,callback 经常失败。建议在控制台创建 Tunnel 后,用 token 安装服务。
操作入口:
路径:Networks → Tunnels → Create a tunnel ,类型选 Cloudflared ,命名(如 hermes-dashboard),安装方式选 Command line ,复制 token给AI注入。

在服务器执行(可以直接让AI来做):
bash
sudo cloudflared service install <你的-token>
sudo systemctl start cloudflared
sudo systemctl enable cloudflared

五、启动 Hermes Dashboard
Tunnel 转发时,HTTP 请求的 Host 为公网域名,而非 localhost。Hermes 默认仅接受本机 Host,未调整时易出现 502。
css
hermes dashboard --stop
hermes dashboard --host 0.0.0.0 --insecure --no-open
参数说明:
--host 0.0.0.0:监听所有网卡(默认仅127.0.0.1)--insecure:允许非 localhost 的 Host(经 Tunnel 访问时必需)--no-open:服务器上不自动打开浏览器
日常重启可记一条:
css
hermes dashboard --stop && hermes dashboard --host 0.0.0.0 --insecure --no-open
验证 cloudflared:
lua
sudo systemctl status cloudflared --no-pager
正常应看到 Active: active (running) 及 Registered tunnel connection。
六、配置 Cloudflare Access(访问控制)
隧道建立后,域名对公网可达,必须增加认证层。
操作入口:
路径:Zero Trust → Access → Applications → Add an application → Self-hosted

建议配置:
- Application name:Hermes Dashboard(自定)
- Application domain :
hermes.<你的域名> - Session duration:24 小时(可按需调整)
- Policy :Action 选 Allow;Include 选 Emails,仅填写本人邮箱
效果:访问 https://hermes.<你的域名> 时先出现 Cloudflare 登录页,通过策略后才进入 Dashboard。

访问域名出现Cloudflare的鉴权页面,上述就是Cloudfalre Access生效的情况
搭建这个环境主要是更加安全便捷访问Hermes Agent 的Dashboard ,最快捷的搭建方式就是直接复制文章全文给Hermes让他指导部署即可。
Hermes Agent 的理念和我对Agent多工作流编排的期望完全一致,后续会深入研究Hermes的玩法及其源码层面上的设计。