image.png

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

背景:为什么要把 Dashboard 暴露到公网

最近一段时间,我的工作流有明显变化:更依赖 Hermes 的多 Agent 协作,并用 Kanban 看板把任务串起来。

image.png

大致是这样用的:

  • 多个 Agent 各司其职(调研、实现、验证等),由 Hermes 统一调度;

image.png

  • Kanban 负责可视化:待办、进行中、阻塞、完成,一眼看清全局;
  • Hermes Web Dashboard(本地默认 9119 端口)把会话、模型、定时任务、技能等集中管理。

对我来说,Dashboard 不只是「看一眼状态」的页面,而是操作台:在看板上拖拽就能做任务分配,配合 Hermes 的调度能力还能做自动调配——比纯 CLI 直观得多,也更适合多 Agent 并行时的日常指挥。

问题是:Dashboard 默认只监听 localhost,人不在 VPS 旁时,手机、笔记本都访问不到。传统做法要开端口、Nginx、证书、认证,维护成本高。我需要的是:偶尔从外网安全打开这块看板,而不是再搭一套公网架构。

当本地服务已经是日常中枢(而不只是调试页)时,「安全公网可达」就变成刚需;Cloudflare Tunnel + Access 适合这种「轻量、个人、要强认证」的场景。

一、方案概述与流量路径

目标:在不开放任何入站端口不部署 Nginx 的前提下,通过 HTTPS 访问 Dashboard,并限制只有本人能登录。

流量路径:

用户浏览器
  → 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.<你的域名>(示例)
DashboardHermes,localhost:9119
隧道组件cloudflared(systemd 托管)

三、安装 cloudflared

可以直接让hermes安装,明确告知你要使用Cloudflare Tunnel来内网穿透VPS的指定端口服务

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 安装服务。

操作入口:

one.dash.cloudflare.com/

路径:Networks → Tunnels → Create a tunnel,类型选 Cloudflared,命名(如 hermes-dashboard),安装方式选 Command line,复制 token给AI注入。

image.png

在服务器执行(可以直接让AI来做):

sudo cloudflared service install <你的-token>
sudo systemctl start cloudflared
sudo systemctl enable cloudflared

image.png

五、启动 Hermes Dashboard

Tunnel 转发时,HTTP 请求的 Host 为公网域名,而非 localhost。Hermes 默认仅接受本机 Host,未调整时易出现 502

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:服务器上不自动打开浏览器

日常重启可记一条:

hermes dashboard --stop && hermes dashboard --host 0.0.0.0 --insecure --no-open

验证 cloudflared:

sudo systemctl status cloudflared --no-pager

正常应看到 Active: active (running)Registered tunnel connection

六、配置 Cloudflare Access(访问控制)

隧道建立后,域名对公网可达,必须增加认证层。

操作入口:

one.dash.cloudflare.com/

路径:Zero Trust → Access → Applications → Add an application → Self-hosted

image.png

建议配置:

  • Application name:Hermes Dashboard(自定)
  • Application domainhermes.<你的域名>
  • Session duration:24 小时(可按需调整)
  • Policy:Action 选 Allow;Include 选 Emails,仅填写本人邮箱

效果:访问 https://hermes.<你的域名> 时先出现 Cloudflare 登录页,通过策略后才进入 Dashboard。

image.png

访问域名出现Cloudflare的鉴权页面,上述就是Cloudfalre Access生效的情况


搭建这个环境主要是更加安全便捷访问Hermes AgentDashboard,最快捷的搭建方式就是直接复制文章全文给Hermes让他指导部署即可。

Hermes Agent的理念和我对Agent多工作流编排的期望完全一致,后续会深入研究Hermes的玩法及其源码层面上的设计。