尧图精选

Rocky Linux 部署 Hermes Agent 与 Web-UI:systemd 托管及会话丢失排查指南

🕒 发布时间:2026/9/4 10:13:18 📁 来源:尧图网络
先说结论这套组合完全能跑在 Rocky Linux 上而且用 systemd 托管之后稳定性比桌面版强很多。最近我帮朋友在内网服务器从头到尾部署了一趟 Hermes Agent 和 Hermes-Web-UI中间踩了不少坑尤其是那个“Web-UI 会话老丢失”的问题排查了大半天才找到根因。这篇就把整个流程、遇到的各种报错、以及怎么把会话稳住的经验全部整理出来。这篇内容适合三类人看一是刚接触 Rocky Linux 的运维新手二是想在内网服务器上部署 Hermes Agent 做 Agent 服务管理的后端开发三是已经被“Hermes-Web-UI 会话老是丢失”折磨的同学。文章不会只丢命令每一步都会解释为什么这么做方便你迁移到自己熟悉的发行版上。1. 环境梳理为什么选 Rocky Linux以及初始化必须做好的三件事1.1 Rocky Linux 的定位与版本选择Rocky Linux 是 RHEL 系的开源替代品和 CentOS 的目录结构、包管理方式基本一致所以网上大量针对 CentOS 的教程在 Rocky 上直接可用。我这次用的是 Rocky Linux 9.x 版本内核、软件仓库都比较新对 Python 3.11 这类新环境的支持更好。如果你手头还有 Rocky Linux 8.10 的机器也不是不能装但要注意编译依赖版本普遍偏低需要额外处理 Python、Node.js 的软件源。我的建议是新部署直接上 9.x老机器如果已经稳定运行就留在 8.10不用为了装 Hermes 强行升级系统。注意Rocky Linux 9 和 8 系列命令在 dnf、firewalld 上基本一致systemd 服务文件写法也通用下面的操作在 8/9 上都适用。1.2 系统初始化三件事静态 IP、软件源和 SELinux很多人在安装 Hermes Agent 之前不会去动系统网络结果 Agent 启动时通过主机名反查 IP 失败控制台里一直显示离线。所以我建议装任何 Agent 类服务前先把静态 IP 设好。Rocky Linux 默认用 NetworkManager 管理网络。先看一下当前网卡名称nmcli device status通常输出里会有一个像ens160或ens3的网卡。确认网卡名后用下面的命令设置静态 IP假设你本机 IP 段是 192.168.1.0/24网关是 192.168.1.1sudo nmcli con mod ens160 ipv4.addresses 192.168.1.100/24 sudo nmcli con mod ens160 ipv4.gateway 192.168.1.1 sudo nmcli con mod ens160 ipv4.dns 192.168.1.1 223.5.5.5 sudo nmcli con mod ens160 ipv4.method manual sudo nmcli con up ens160设置完用ip addr show ens160确认。很多 Agent 第一次安装要回连平台做设备注册如果你的机器 DHCP 分配的 IP 和 Agent 上报的 IP 不一致控制台里会出现“设备在线但无法访问”的怪象设置静态 IP 能直接避免这类问题。软件源方面Rocky Linux 9 默认源包含了大部分基础软件但像 Node.js 18 这类需要通过模块流启用sudo dnf install -y epel-release sudo dnf module enable -y nodejs:18SELinux 是大多数 Agent 安装失败的隐形杀手。默认 enforcing 模式下Agent 要监听端口、读写自定义目录都可能被拦截。生产环境我不建议直接关闭 SELinux安全收益会降低但对于内网测试环境我通常直接设为 permissivesudo sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config sudo setenforce 0如果你要在生产环境保持 enforcing需要在安装完 Agent 后观察/var/log/audit/audit.log为对应进程补放行策略。这个工作比较繁琐我实际部署时为了快速验证功能先切 permissive等稳定后再逐个补策略。1.3 放行端口与防火墙策略Hermes Agent 与 Hermes-Web-UI 通信需要几个端口一般 Agent 默认监听一个 API 端口我们环境里是 8000Web-UI 默认监听 8080。如果 UI 打算用 Nginx 反代实际对外只需要开放 80/443。sudo firewall-cmd --permanent --add-port8000/tcp sudo firewall-cmd --permanent --add-port8080/tcp sudo firewall-cmd --reload sudo firewall-cmd --list-all这是最简配置。如果 Agent 需要被外部控制台主动访问可能还要放开一个回调端口具体看你的部署模式。这个后面会在安装 Agent 服务时进一步说明。2. Hermes Agent 核心服务部署从下载二进制包到 systemd 托管2.1 下载与解压直接下载二进制包不做源码编译Hermes Agent 官方提供 Linux amd64 的二进制包。这里不建议从源码编译因为依赖较多编译时间也长。下载后放到统一的部署目录sudo mkdir -p /opt/hermes cd /opt/hermes # 假设你已经从官方渠道下载了 hermes-agent-linux-amd64.tar.gz sudo tar zxvf hermes-agent-linux-amd64.tar.gz -C /opt/hermes sudo chown -R hermes:hermes /opt/hermes在解压之前我习惯先创建一个独立的系统用户而不是直接用 root 运行sudo useradd --system --home /opt/hermes --shell /sbin/nologin hermes sudo chown -R hermes:hermes /opt/hermes用专用用户跑 Agent 的好处很多一是 Agent 进程被入侵后权限受限二是日志和配置文件的属主清晰三是 systemd 里可以用User指令统一管理不会出现“用 root 启动、生成了一堆 root 属主的日志文件后续清理还要 sudo”的尴尬。2.2 首次配置注册实例并回填密钥解压目录里通常会有config.yml或hermes.yaml之类的配置文件。第一次启动前必须先在 Hermes 控制台注册设备拿到实例 ID 和密钥。这一步很多人不理解为什么装个 Agent 还要登录网站实际上不是要强制在线才能用而是 Hermes 采用了“控制台签发设备凭证”的机制。Agent 与 Web-UI 之间通信需要一对密钥这对密钥由控制台生成你拿到后回填到配置里就完成了绑定。这种设计类似家用路由器绑定手机 App先扫码绑定再远程管理。我在实际操作中先在有图形界面的电脑上登录 Hermes 控制台创建一个新实例然后把生成的instance_id和secret_key填入配置文件的对应字段。如果你在内网没有外网环境需要额外在控制台申请离线激活码这个激活码是一次性的填入后不要重复使用。配置文件里我最常调整的三个参数是server: host: 0.0.0.0 port: 8000 agent: name: rocky-lab instance_id: 填控制台生成的ID secret_key: 填控制台生成的密钥 data_dir: /opt/hermes/data log: level: info file: /opt/hermes/logs/agent.logdata_dir一定要显式指定到一个有足够磁盘空间、且不属于/tmp的目录。我之前图省事让数据默认存放在用户目录下后来磁盘空间告警才发现日志文件把分区塞满了。2.3 用 systemd 托管 Hermes Agent 进程二进制方式安装的 Agent 不会自动注册成服务需要手动写一个 systemd service 文件。这是保证“断电重启后 Agent 自动拉起”的关键一步。新建/etc/systemd/system/hermes-agent.service[Unit] DescriptionHermes Agent Service Afternetwork-online.target Wantsnetwork-online.target [Service] Typesimple Userhermes Grouphermes WorkingDirectory/opt/hermes ExecStart/opt/hermes/hermes-agent --config /opt/hermes/config.yml Restarton-failure RestartSec10 LimitNOFILE65535 [Install] WantedBymulti-user.target配置里有几个点值得说明一下Afternetwork-online.target确保网络完全就绪后再启动 Agent避免开机时 DHCP 还没拿到 IP、Agent 就开始上报导致控制台显示离线。Restarton-failure只对非正常退出做重启如果 Agent 因为配置错误启动失败会每 10 秒重试一次方便你通过journalctl -u hermes-agent观察日志。调试阶段可以先把RestartSec改成 2让反馈快一点稳定后再改回 10。启用服务sudo systemctl daemon-reload sudo systemctl enable --now hermes-agent sudo systemctl status hermes-agent如果一切正常status会显示active (running)控制台里对应设备也会变成在线。2.4 Agent 安装时的几个关键验证点服务起来后不要急着装 Web-UI先确认 Agent 自身状态正常# 1. 查看端口监听 sudo ss -tlnp | grep 8000 # 2. 看最近日志有没有报错 sudo journalctl -u hermes-agent --since 5 minutes ago # 3. 用本机 curl 试探 API 是否响应 curl http://127.0.0.1:8000/health如果/health返回{status:ok}之类的 JSON说明 Agent 主体已正常工作。如果端口没监听多半是配置文件里的密钥填错了或者端口被占用。如果端口监听了但 curl 无响应检查防火墙和 SELinux 状态。我在这步遇到过一个问题Agent 启动提示端口被占用用ss -tlnp查了半天没发现占用后来发现是 Rocky Linux 的 SELinux 拦截了进程绑定端口但默认的 audit 日志又没直接告诉你是 SELinux 干的。所以如果一切配置看起来都对、服务就是起不来先执行setenforce 0再试能确认是不是 SELinux 的问题。3. Hermes-Web-UI 安装数据库初始化、Web 配置与反向代理3.1 Hermes-Web-UI 组件构成Hermes-Web-UI 是纯前端静态资源加一套后端 API 服务。后端负责从 Agent 拉取会话数据、管理用户登录态前端负责展示。所以安装 UI 不是把 HTML 文件丢到 Nginx 里那么简单必须先把后端服务跑起来再让前端代理访问后端 API。官方提供的部署包一般同时包含前后端。解压后目录结构通常是hermes-web-ui/ ├── backend/ # API 服务端 ├── frontend/ # 编译后的静态页面 ├── config.yml └── scripts/ └── init_db.sh3.2 数据库准备SQLite 与 PostgreSQL 的选择Hermes-Web-UI 默认使用 SQLite 存储会话、用户、配置项。对于几十个 Agent 的规模SQLite 完全够用胜在零维护。但如果你需要多节点部署、或者对会话持久化要求很高比如几百个并发用户同时用 UI建议一开始就落到 PostgreSQL 上。我这次为了快速验证先用了 SQLite。初始化方式是在部署目录下执行官方附带的初始化脚本cd /opt/hermes/hermes-web-ui sudo -u hermes bash scripts/init_db.sh脚本会在data/目录下生成hermes.db文件。完成后注意权限sudo chown -R hermes:hermes /opt/hermes/hermes-web-ui/data如果数据库文件属主是 root后面后端服务以 hermes 用户运行时会出现“attempt to write a readonly database”的报错这是 SQLite 部署里最典型的权限坑。3.3 Web-UI 后端服务与 Nginx 反向代理配置先给 Web-UI 后端也写一个 systemd 服务我命名为hermes-web.service[Unit] DescriptionHermes Web UI Backend Afterhermes-agent.service Requireshermes-agent.service [Service] Typesimple Userhermes Grouphermes WorkingDirectory/opt/hermes/hermes-web-ui ExecStart/usr/bin/python3 /opt/hermes/hermes-web-ui/backend/main.py Restarton-failure RestartSec5 EnvironmentPYTHONUNBUFFERED1 EnvironmentHERMES_CONFIG/opt/hermes/hermes-web-ui/config.yml [Install] WantedBymulti-user.target这里设置Afterhermes-agent.service保证 UI 后端启动时 Agent 已经在运行UI 拉取 Agent 状态时不会扑空。如果你的 Agent 和 Web-UI 不在同一台机器这个依赖关系要调整成网络依赖。前端静态页面用 Nginx 托管后端 API 通过反向代理转发。新建/etc/nginx/conf.d/hermes-web.confserver { listen 80; server_name your-server-domain-or-ip; client_max_body_size 50m; location / { root /opt/hermes/hermes-web-ui/frontend; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }try_files那一行很重要。前端是单页应用如果你直接访问某个子路由Nginx 找不到对应的真实文件必须让它回退到index.html不然一刷新页面就 404。反代配置里proxy_set_header Host $host也很关键少了这个头后端拿到的是127.0.0.1而不是你的真实域名后续 Web-UI 里生成的一些链接可能指向错误主机。配置完成后重载 Nginxsudo nginx -t sudo systemctl reload nginx3.4 从 UI 页面验证安装结果浏览器访问http://your-server-ip/如果能看到 Hermes 的登录页说明整个链路通了。第一次进入 UI 需要初始化管理员账号用这个账号登录后在 Dashboard 上找到 Agent 列表把它标记为受信设备或者接受加入请求不同版本叫法略有差异。一个常见的疑问是为什么 Agent 已经在线了UI 里还是找不到设备这通常是因为 Web-UI 后端默认只展示“已经完成双向握手”的设备。你需要到 Agent 所在机器的日志里找到它上报的设备 ID再到 UI 的设备管理页里手工添加或批准。这步和“安装 Agent 时为什么要登录网站”本质上是同一个逻辑双方都需要确认对方身份防止内网里有陌生设备伪造成 Agent。4. 高频痛点Hermes-Web-UI 会话总是丢失到底卡在哪个环节4.1 先区分两种“会话丢失”很多人说“Hermes-Web-UI 的会话老是丢失”其实是两种完全不同的现象混在一起一种是你登录 UI 后过一段时间或被系统重启后登录态失效要重新输入账号密码。这是 Web Session 失效。另一种是 UI 和 Agent 之间的实时连接断开界面上的对话记录消失或设备掉线。这是 Agent Session 断裂。两种问题的排查方向完全不同。如果你的现象是“浏览器刷新一下就掉登录”优先检查 Session 存储如果你的现象是“Agent 跑一会儿就在 UI 里变离线”优先检查网络和 Agent 心跳机制。4.2 登录态丢失Session 存储位置是头号元凶Hermes-Web-UI 后端默认把用户 Session 存在内存里。进程一重启所有登录用户的 Session 全部失效表现就是“明明刚登录过刷新一下又要重新登”。短期解决办法是重启 Web 服务后重新登录即可但如果你的机器经常因为 OOM 或者自动更新被重启这个问题会反复出现。要根治必须把 Session 持久化到磁盘或外部存储。在 Hermes-Web-UI 的配置文件里找到 Session 相关设置。不同版本字段略有差异通常是session: type: sqlite timeout_seconds: 86400有的版本支持type: redis。如果你有现成的 Redis 实例优先用 Redis 存储 Session重启后端服务也不掉线。没有 Redis 就选文件或数据库存储把 Session 表落到 SQLite/PostgreSQL 里。另外注意timeout_seconds默认值。很多部署默认只有 3600 秒也就是 1 小时用户体验就是“上午登录过下午回来又要重新登录”。这个值按需调大到 86400 或更长再配合 Cookie 的持久化时间基本可以做到一周不用重新登录。提示修改 Session 过期时间后一定要同时清理浏览器里的旧 Cookie否则会出现“Cookie 里的 Session ID 已经不存在但页面还在用旧 ID 去请求”的尴尬情况。4.3 Nginx 反代导致 Cookie 丢失或过期如果你用了 Nginx 反代排查 Session 丢失时要重点看 Cookie 路径和 Domain 属性。最常见的问题有两种一是 Web-UI 后端构造 Cookie 时没有设置Secure或HttpOnly但 Nginx 层开启了 HTTPS 强制跳转浏览器不认这个不安全来源的 Cookie。解决办法是在 Nginx 配置里显式加上proxy_cookie_path / /; httponly; secure;如果你不强制 HTTPS不要加secure否则浏览器只在 HTTPS 下才发送 Cookie走 HTTP 就一直处于未登录状态。二是 Nginx 没有配置proxy_set_header X-Forwarded-Proto $scheme。后端如果根据请求协议来判断要不要给 Cookie 加Secure属性少了这个头后端会误判请求是 HTTP于是生成的 Cookie 和实际协议不匹配浏览器就可能拒绝写入或发送。我在实际环境里遇到过最刁钻的一个问题是浏览器地址栏输入的是http://server-ipNginx 把请求转发到后端时没有带X-Forwarded-Proto后端收到的是 HTTP 请求正常应该返回没有Secure的 Cookie。但我的 Nginx 配置了全局的proxy_cookie_path / /; secure导致 HTTP 环境下 Cookie 被强制加了Secure属性浏览器直接丢弃表现就是“登录永远成功但跳转后立刻又回到登录页”。所以反向代理配置里面几个 Header 一个都不能少顺手检查一下proxy_cookie_path有没有覆盖正确。4.4 Agent 连接断开心跳超时与并发数如果 Session 丢失表现为“UI 页面上 Agent 状态变成离线重连后之前的对话历史不见了”问题多半出在 Agent 与 Web-UI 后端的心跳机制上。Agent 默认每隔一段时间会向 Web-UI 发一次心跳。如果中间隔了 NAT 网关或者防火墙长时间没有数据交互的连接会被防火墙自动清理。Agent 下一次发心跳时发现连接已断就会尝试重连重连期间 UI 就会显示离线。解决方法是检查 Agent 配置文件里的心跳间隔heartbeat: interval_seconds: 30 timeout_seconds: 120把interval_seconds从默认的 120 改成 30可以显著减少被防火墙清理的概率。同时确认服务器上的连接保活参数sudo sysctl -w net.ipv4.tcp_keepalive_time120 sudo sysctl -w net.ipv4.tcp_keepalive_intvl30 sudo sysctl -w net.ipv4.tcp_keepalive_probes3另外如果 Web-UI 后端配置了最大并发连接数而你有多个 Agent 同时在线高并发时可能有个别 Agent 被挤掉线。我这边有一个 8 核 16G 的服务器跑了 5 个 Agent默认配置没问题。如果你的 Agent 数量超过 20 个需要调大 Web 服务进程数和数据库连接池。4.5 存储目录被系统清理导致会话文件丢失还有一个由 Rocky Linux 系统本身引起的坑Hermes-Web-UI 如果使用文件类型的 Session 存储默认存放路径是/tmp或/var/tmp。Rocky Linux 上 systemd 的tmpfiles.d定时任务会清理/tmp下超过 10 天未访问的文件。如果你的 Session 文件被清理用户在 UI 上表现为“隔了很久回来发现登出会话历史也没了”。排查方法很简单ls -lah /tmp/hermes_session*如果发现里面文件很少只有几条记录而系统在线用户数量远多于文件数量那基本可以确定是被 tmpfiles 清理了。解决办法是把 Session 存储目录改到/opt/hermes/hermes-web-ui/data/sessions并且确认该目录属主是 hermessudo -u hermes mkdir -p /opt/hermes/hermes-web-ui/data/sessions sudo chown -R hermes:hermes /opt/hermes/hermes-web-ui/data注意修改后要重启 Web 服务让新配置生效。同时把Restarton-failure的时长调大一点避免服务在写入 Session 时被反复重启导致文件损坏。4.6 会话恢复验证清单为了确认问题已经解决我一般按下面的顺序做一次完整验证登录 UI确认能正常进入 Dashboard。重启 Hermes-Web-UI 服务浏览器不刷新等 10 秒后点击页面任意操作。如果用 Redis 或数据库存储 Session重启后应该仍然处于登录状态。重启 Hermes Agent 服务观察 UI 上 Agent 状态变化确认能自动重连并恢复在线上报。用浏览器的开发者工具查看 Cookie确认 Session ID 存在且没有Secure属性不匹配问题。这套验证做完基本能覆盖 90% 的会话丢失场景。5. 踩坑记录与排查速查表含桌面版报错、安装需登录等5.1 安装时要求登录网站或激活码是怎么回事很多人在命令行安装 Hermes Agent 时看到提示要登录网站第一反应是“是不是下载了带捆绑的版本”。其实这是 Hermes 的授权绑定机制。Agent 在启动前需要从一个合法控制台获取运行许可类似设备激活过程。你在控制台创建实例后会得到一串字符有的叫instance_id有的叫activation_code。把这串字符作为参数传给 Agent 的启动命令或者写入配置文件即可。如果你坚持不登录网站也不是完全无解。Hermes 支持离线激活需要你先在有网络的机器上登录控制台申请离线激活码然后把激活码通过内网传到目标服务器执行类似./hermes-agent --activate 离线激活码激活码是一次性的激活成功后会在数据目录生成授权文件。以后启动不再需要联网验证。这解释了为什么有些人说“我第一次配置时必须联网后面拔了网线也能跑”。5.2 Hermes Agent 桌面版安装报错的经验之谈如果你在 Windows 上装 Hermes Agent 桌面版遇到报错常见的几种原因缺失 VC 运行库。Agent 桌面版依赖 Microsoft Visual C Redistributable安装前先去微软官网装最新的 x64 版本。安装路径包含中文字符。部分版本的安装包对非 ASCII 路径处理有 bug安装到D:\软件\Hermes这类目录容易出问题。装到D:\Hermes这种纯英文路径基本能避免。杀毒软件拦截。桌面版 Agent 要监听本地端口部分安全软件会把这个行为当成可疑程序拦截。装的时候先退出杀毒软件装完再加白名单。需要说明的是桌面版更适合个人本机调试服务端长期运行还是推荐 Linux systemd 的方式这也是这篇文章主要讨论的路径。5.3 Rocky Linux 软件源问题的踩坑Rocky Linux 8.x 自带的源在 2024 年后部分 mirror 已经停止同步如果没有及时更新执行dnf install会卡在 “Cannot download repomd.xml”。如果你用的是 Rocky 8.10需要确认源地址是否已切换到 vaultsudo dnf install -y http://dl.rockylinux.org/pub/rocky/8/AppStream/x86_64/os/Packages/...更稳妥的做法是打开/etc/yum.repos.d/Rocky-AppStream.repo把baseurl里的mirrorlist.rockylinux.org换成dl.rockylinux.org/pub/rocky/$releasever/AppStream/$basearch/os/。Rocky 9 目前还没这个问题但我也遇到过内网环境需要自行同步源的情况。如果你的服务器无法访问外网需要在内网搭建一个镜像源然后在仓库配置文件里指定内网地址。这一步虽然和 Hermes 安装关系不大但环境基础没准备好后面很多软件都会装不上。5.4 一些系统层面的故障快速排查另外一个高频问题是端口怎么都访问不了。系统服务也起来了本机 curl 也通但从外部浏览器访问就是不通。按这个顺序查# 1. 防火墙是否放行 sudo firewall-cmd --list-all # 2. 端口是否被监听 sudo ss -tlnp | grep 8080 # 3. 如果上面都正常查 SELinux sudo getenforce sudo ausearch -m avc -ts recent如果ausearch输出里有avc: denied记录说明是 SELinux 拦截。临时验证就setenforce 0长期解决需要针对监听端口设置布尔值或自定义策略模块。还有一个容易被忽略的问题云服务商的安全组规则。很多人在本机防火墙放行了端口却忘了云控制台的安全组。如果你用的是云服务器记得同时检查安全组入方向规则否则外部访问依然会被拦在更外层。5.5 常见问题速查表问题现象可能原因解决办法Agent 启动失败日志提示端口被占用SELinux 拦截或端口真的被占用先setenforce 0测试再用ss -tlnp确认占用进程UI 登录成功后刷新又回到登录页Cookie Secure 属性与协议不匹配或 Session 存储未持久化检查 Nginx 的 proxy_cookie_path配置 SQLite/Redis Session 存储UI 提示会话文件无法写入数据目录属主不是 hermeschown -R hermes:hermes /opt/hermes/hermes-web-ui/dataAgent 在 UI 上频繁离线心跳间隔太长NAT 连接被清理调小心跳间隔和 TCP 保活参数数据库只读错误SQLite 文件属主错误修改属主为运行用户安装时提示登录网站需要先在控制台创建实例或申请激活码在线激活或申请离线激活码Rocky Linux 8.10 yum 源失效官方源已迁移到 vault修改 repo 配置指向 dl.rockylinux.org6. 日常运行维护与后续扩展6.1 服务日志管理与轮转Hermes Agent 和 Web-UI 由 systemd 托管后日志统一由 journald 管理。查看日志用sudo journalctl -u hermes-agent -f sudo journalctl -u hermes-web -f我建议在/etc/systemd/journald.conf里把SystemMaxUse调大一点比如 500M避免日志量大时早期记录被覆盖SystemMaxUse500M修改后执行sudo systemctl restart systemd-journald。如果 Agent 配置文件里单独设置了文件日志输出也要注意文件轮转。我这边是让 Agent 只输出到 systemd不额外写文件减少磁盘占用但如果你要对接日志采集系统保留文件日志更方便。6.2 Agent 升级的注意事项Hermes 版本迭代比较快升级时别直接在原目录解压覆盖。我的标准操作是先停服务sudo systemctl stop hermes-agent备份配置和数据库sudo cp -r /opt/hermes /opt/hermes_backup_日期解压新版本到临时目录替换二进制文件启动服务sudo systemctl start hermes-agent确认日志无报错、控制台设备在线备份数据库这步尤其重要因为 Web-UI 的版本升级可能包含数据库迁移如果迁移失败你要能回滚到升级前的状态。6.3 多 Agent 纳管与集中管理Hermes 的价值在于多台服务器统一纳管。如果你有第二台、第三台机器要加 Agent流程和第一台基本一样下载部署包、创建系统用户、修改配置里的instance_id、启动服务。这些 Agent 会通过 Web-UI 统一展示不需要挨个登录服务器查看状态。我实际测试过跨网段部署Agent 在 192.168.1.xWeb-UI 在 192.168.100.x。只要网络路由通了、防火墙放行了对应端口Agent 就能正常注册到 Web-UI。如果你的网络环境更复杂比如有双层 NAT需要确保 Agent 能主动访问到 Web-UI 的服务地址并在 Web-UI 的配置里正确设置允许的来源 IP 或网段。6.4 安全加固建议如果这个环境会长期运行我建议再做几件安全加固的事给 Web-UI 加 HTTPS。用 Nginx Lets Encrypt 或者内网自签证书避免登录密码和 Session Cookie 明文传输。修改默认端口。如果只在内网使用可以不用改如果需要暴露到外网建议把 8080 端口换掉减少被扫描的几率。Agent 运行用户最小化权限。前面创建的 hermes 用户没有登录 shell已经比较安全不要在 Agent 机器上给这个用户 sudo 权限。定期备份数据库。Hermes-Web-UI 的 SQLite 文件、Agent 的授权文件、配置文件这三样是核心资产。写个 crontab 脚本每天打包备份即可。7. 最后想聊的实际体会部署这套东西最让我头疼的不是 Agent 本身而是 Web-UI 会话老是丢。排查到最后发现是三个问题叠加Session 存在内存里、服务被 OOM 重启、Nginx 的 Cookie 属性配置不对。如果你也遇到类似问题别急着怪软件不稳定先按我上面的顺序逐个排除大概率能定位到其中一环。我个人经验是在 Rocky Linux 上部署这类带 Web 管理界面的 Agent 工具统一用 systemd 管理所有进程不要用 nohup 或者 screen 这种临时方案。systemd 不仅提供开机自启和崩溃重启还能通过journalctl统一看日志出问题排查效率高好几倍。如果后续你想把 Hermes 的会话数据接到统一的监控体系里或者用脚本批量管理多台机器的 Agent 状态可以先从 Hermes-Web-UI 的数据表开始研究把数据库结构摸清楚后再做扩展。我这边已经在计划把 Agent 的上线状态同步到企业微信机器人告警等实现完再单独写一篇实战分享。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →