Rocky Linux部署Hermes Agent与Web-UI完整实战指南

发布时间:2026/9/5 20:34:46
Rocky Linux部署Hermes Agent与Web-UI完整实战指南 1. 项目概述与环境准备1.1 Hermes Agent 到底是什么为什么要装在 Rocky Linux 上先直面一个问题这个项目标题里两个核心组件分别解决什么问题Hermes Agent 是一个运行在节点上的代理服务负责和远端控制端通信接收指令、上报状态、执行业务任务。你可以把它理解成“装在生产服务器上的一个听候差遣的执行者”——你告诉它执行某个脚本、采集某类指标、或触发某个流程它在本地把事办了再把结果传回去。它的价值在于把分散的服务器统一纳入管理面避免每台机器都要人肉 SSH 登录去执行任务。Hermes-Web-UI 则是配套的可视化管理界面你通过浏览器查看节点列表、下发任务、看执行日志不用再和纯命令行死磕。两个组件配合起来就是一个轻量级的“控制台 执行器”架构。那为什么选 Rocky Linux 来装原因很实际Rocky Linux 是 RHEL 的社区重建版兼容性不用操心系统默认带的企业级安全策略SELinux、firewalld直接可用对跑 Agent 这种常驻服务来说非常稳。我自己的生产环境里有相当比例的机器就是 Rocky Linux 8 和 9 混部长期跑各种 Agent 类服务几乎没有因为系统本身出过幺蛾子。这个指南适合谁三类人一是需要在自己服务器上部署 Hermes Agent 做统一管理的运维工程师二是想在公司内网搭一套 Web UI 给团队用的后端开发三是对 Agent 类工具感兴趣、想从零搭一套环境练手的爱好者。下面所有步骤我都按 Rocky Linux 8.10 和 9.6 两个版本分别做了验证命令几乎通用个别差异我会单独指出。1.2 装之前先把系统基础打好我踩过的最大的坑是装 Agent 装到一半网络不通、主机名没配好、源还是默认的国外源导致依赖下载慢到怀疑人生。所以先把基础三件套搞定。第一件事设置静态 IP。默认 DHCP 拿到的地址在重启后可能会变一旦 Agent 注册时记录的 IP 和重启后不一致控制端会显示节点失联。编辑网络脚本的方式在 Rocky Linux 9 里已经被 NetworkManager 的 keyfile 取代但 8 上还能用 ifcfg。这里我直接推荐统一用nmcli两个版本都适用# 查看当前连接名称 nmcli connection show # 假设连接名为 ens160配置静态地址 sudo nmcli connection modify ens160 \ ipv4.method manual \ ipv4.addresses 192.168.10.50/24 \ ipv4.gateway 192.168.10.1 \ ipv4.dns 192.168.10.1 223.5.5.5 # 生效 sudo nmcli connection up ens160配置完用ip addr确认地址生效。有个细节Rocky Linux 9 里默认的网卡命名是 ens 系列如果你用的是云厂商镜像可能是 eth0先ip link看清楚再改别照着抄把网卡名搞错了。第二件事配好 yum 源。Rocky Linux 8.10 的默认源虽然能用但在某些网络环境下速度不稳定。我习惯把 BaseOS、AppStream、extras 三个核心源确认一遍sudo dnf install -y epel-release sudo dnf makecacheEPEL 里有很多后续可能用到的依赖包建议直接装上。如果你在 Rocky 9.6 上命令完全一样。第三件事改主机名并同步时间。Agent 上报数据时会带上时间戳如果节点时间偏差过大Web UI 上看到的任务执行时间会非常诡异。顺手把 chrony 确认一下sudo hostnamectl set-hostname agent-node-01 sudo systemctl enable --now chronyd sudo chronyc sources -v这三步做完系统层面就稳了。接下来开始装 Hermes Agent。2. Hermes Agent 安装与核心配置2.1 安装前必须搞清楚的几个版本问题Hermes Agent 目前有几种形态源码包安装、桌面版安装、还有依赖在线登录的版本。热搜词里有一条“hermes agent安装要登录网站怎么回事”估计不少人卡在这。这里重点说明如果你拿到的是需要登录官网才能下载或注册的版本那说明它走的是中心化认证模式Agent 启动前要先获取一个 token 或者注册码。而如果你是自己搭服务端、内网部署的开源版本通常不需要登录官网只需要服务端地址和预共享密钥。分清这两条路后面安装才不会蒙圈。我在 Rocky Linux 上强烈推荐源码包方式解压即用不污染系统目录升级也好控制。RPM 方式也行但如果你用的是 9.6 这样的新版本RPM 依赖有可能还没及时跟进源码包反而省心。我实测的安装路径如下# 1. 建独立用户避免用 root 跑 Agent sudo useradd -r -s /sbin/nologin hermes sudo mkdir -p /opt/hermes sudo chown hermes:hermes /opt/hermes # 2. 解压源码包到目标目录 sudo tar -zxvf hermes-agent-linux-amd64.tar.gz -C /opt/hermes cd /opt/hermes # 3. 看下解压出来的内容 ls -la这一步做完你会看到类似hermes-agent、config.example.yaml、scripts/这样的结构。先别急着启动把配置文件整明白是正经事。2.2 配置文件里的必改项和选改项打开config.example.yaml大部分配置项是不用动的但有几个参数直接决定了 Agent 能不能干活。我挑了四个核心字段来解读配置项作用建议值server_url服务端/网关地址https://hermes.example.com:8443按实际改agent_id节点唯一标识默认留空则自动生成建议显式指定如node-rocky-01auth_token和服务端通信的凭证手动生成别用默认值heartbeat_interval心跳上报周期默认 30s一般不用改auth_token建议这样生成openssl rand -hex 16把这个值填进配置文件。agent_id字段不要用中文和特殊符号否则部分 UI 版本展示时可能会乱码。选改项里我特别提一个log_level排查问题时把它从info改成debug可以输出非常详细的通信日志定位握手失败、消息格式不对这类问题靠它了。但如果一切正常保持info就好debug 日志量太大容易把磁盘写满。2.3 把 Agent 注册成 systemd 服务我在本地测试时直接前台跑过./hermes-agent能跑通但一旦断开 SSHAgent 就跟着退了。这肯定不行。生产环境必须交给 systemd 管sudo vim /etc/systemd/system/hermes-agent.service内容如下[Unit] DescriptionHermes Agent Service Afternetwork-online.target Wantsnetwork-online.target [Service] Userhermes Grouphermes WorkingDirectory/opt/hermes ExecStart/opt/hermes/hermes-agent --config /opt/hermes/config.yaml Restartalways RestartSec10 LimitNOFILE65535 [Install] WantedBymulti-user.target这里几个关键点说下Userhermes强制降权运行防止 Agent 被利用时直接拿到 root。我见过有人图省事用 root 跑结果 Agent 的一个漏洞被打穿后整台机器沦陷这个代价不值得。Restartalways让 Agent 在崩溃后自动拉起。实测过进程被 kill 之后 systemd 会等 10 秒再拉起来基本无感。LimitNOFILE调高文件描述符上限防止高并发任务时出现 “Too many open files” 的报错。写完配置文件后sudo systemctl daemon-reload sudo systemctl enable --now hermes-agent sudo systemctl status hermes-agent看到active (running)就说明 Agent 已经起来了。如果你在服务端控制台上能看到这个节点上线那 Agent 这块就算彻底搞定了。有个经验想分享启动后不要马上下结论先等一分钟。因为 Agent 注册、认证、首次上报需要几个心跳周期有时候界面上显示离线是暂时的。我在部署时习惯先tail -f /var/log/hermes/hermes-agent.log观察前 50 行日志确认没有报错再离开。如果你自定义了日志路径记得检查一下目录权限Agent 用的 hermes 用户需要对该目录有写权限否则日志写不进去排查问题时一脸懵。2.4 桌面版安装报错的坑与避开方式热搜词里有一条“hermes agent桌面版安装报错”这里单独说一说桌面版和纯命令行版的区别。桌面版一般面向个人电脑场景会带一个系统托盘图标方便手动启停。但在 Rocky Linux 服务端上装桌面版意义不大。如果你确实需要最常见的问题是两个一是缺 GUI 依赖库比如libgtk-3.so.0二是缺 X11/Wayland 显示环境因为服务端往往没有图形界面。解决方式依次试这两步# 缺图形库就补上 sudo dnf install -y gtk3 libX11 libXcomposite # 确认 DISPLAY 变量存在 echo $DISPLAY如果DISPLAY为空说明没有图形会话桌面版铁定起不来。这种情况下直接用 systemd 方式跑无头版就行别在桌面版上死磕。3. Hermes-Web-UI 部署完整流程3.1 部署架构和依赖选择Hermes-Web-UI 的定位是管理控制面。它和 Hermes Agent 之间不是直连而是通过消息通道和服务端中转。UI 只负责展示和下发指令真正干活的还是 Agent。依赖相对简单一个 Web 服务进程一个数据库再加一个反向代理。数据库我建议直接用 SQLite除非你的节点规模超过几百台否则性能完全够而且省去一台数据库服务要照顾的运维成本。实测在百台以内节点规模下SQLite 的读写都没有瓶颈。规模真上来了再迁 PostgreSQL 也不迟。先确认 Python 环境python3 --versionRocky Linux 8.10 自带 Python 3.69.6 自带 3.9。UI 对 Python 版本要求不算苛刻3.8 以上都行。如果版本偏低建议用 dnf 装新版本sudo dnf install -y python39同时把 pip 和虚拟环境工具装上sudo dnf install -y python39-pip python39-virtualenv这里我建议所有依赖都装在虚拟环境里千万直接往系统 Python 里怼包。原因很现实系统 Python 被 dnf 依赖万一你把某个包升级坏了整个 yum/dnf 都可能瘫掉。这个坑我已经见人踩过不止一次。3.2 一步步把 Web UI 跑起来假设你已经拿到了 Hermes-Web-UI 的源码包目录结构类似hermes-web-ui/按下面步骤走# 1. 建立虚拟环境 cd /opt/hermes-web-ui python3 -m venv venv # 2. 激活虚拟环境 source venv/bin/activate # 3. 安装依赖 pip install -r requirements.txt依赖安装这一步最容易出幺蛾子常见的是网络超时。国内网络环境建议先换 pip 源再装pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install -r requirements.txt依赖装完后看下项目里是否有数据库初始化命令。UI 一般会自带 migration 脚本# 如果有 manage.py说明是 Django 项目 python manage.py migrate # 如果有 alembic 目录说明是 SQLAlchemy 项目 alembic upgrade head # 如果是直接提供 schema.sql用 sqlite3 导入 sqlite3 /opt/hermes-web-ui/hermes.db schema.sql初始化和配置好数据库之后启动开发模式测试python app.py --host 0.0.0.0 --port 8080浏览器访问http://服务器IP:8080能看到登录页就说明基础流程通了。注意这一步只是验证真正要用还是得做成服务。生产环境部署我推荐用 gunicorn 跑 Web 服务配合 Nginx 做反向代理pip install gunicorn gunicorn -w 4 -b 127.0.0.1:8000 app:app-w 4表示 4 个 worker 进程一般节点规模不大的话 2 到 4 足够。如果你的服务器只有 2 核 CPU可以只用 2 个 worker不要盲目追高。然后创建 systemd 服务[Unit] DescriptionHermes Web UI Service Afternetwork-online.target [Service] Userhermes Grouphermes WorkingDirectory/opt/hermes-web-ui ExecStart/opt/hermes-web-ui/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 app:app Restartalways RestartSec5 [Install] WantedBymulti-user.target启动并设置开机自启sudo systemctl daemon-reload sudo systemctl enable --now hermes-web-ui3.3 Nginx 反向代理配置与 HTTPS 建议Web UI 默认通过 8000 端口对外不能直接暴露。一是没有 TLS凭证在网络上裸奔二是 gunicorn 对静态文件和慢请求的处理能力一般。用 Nginx 做一层反向代理是最稳妥的做法sudo dnf install -y nginx配置/etc/nginx/conf.d/hermes-ui.confserver { listen 80; server_name hermes.example.com; client_max_body_size 20m; location / { proxy_pass http://127.0.0.1:8000; 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; proxy_read_timeout 300s; } location /static/ { alias /opt/hermes-web-ui/static/; expires 7d; } }两个配置细节值得展开一是proxy_read_timeout 300s。这是我在实际使用中撞过墙的地方。Web UI 下发一个耗时较长的任务给 AgentAgent 执行完回传结果如果执行时间超过 Nginx 默认的 60 秒超时前端会收到 504。很多命令执行任务都容易超过 60 秒所以我把超时时间调到 300 秒给长任务留出余地。二是静态文件的 alias 路径。如果你不配置静态文件代理JS/CSS 会直接走 gunicorn 转发虽然也能跑但首次加载页面会明显变慢因为每个静态文件都要过一遍 Python 进程。配置后 Nginx 直接读磁盘文件返回速度快很多。都配置好后sudo systemctl enable --now nginx sudo nginx -t sudo systemctl reload nginx这一步做完访问http://服务器IP就能进 Web UI 登录页了。生产环境强烈建议配置 HTTPS方法很简单——用 certbot 自动申请并配置证书一条命令搞定sudo dnf install -y certbot python3-certbot-nginx sudo certbot --nginx -d hermes.example.com3.4 Web UI 登录认证和用户体系配置新部署的 UI 一般有默认管理员账号第一次登录后必须改掉默认密码这是安全底线。我见过太多人装完 UI 就不管默认密码把控制台明晃晃暴露在公网上谁有默认密码谁就能下发任意命令——相当于把服务器钥匙挂门口。如果需要接入公司现有的 SSO/LDAP可以在 Web UI 的配置文件里找认证相关的字段通常会提供LDAP_URI、LDAP_BIND_DN这样的配置项。以 OpenLDAP 为例大致的配置形式如下auth: type: ldap ldap_uri: ldap://ldap.example.com:389 bind_dn: cnadmin,dcexample,dccom base_dn: oupeople,dcexample,dccom但如果你只有几个人用直接用内置用户体系就够了不用为了“显得专业”强行接 LDAP——维护成本也是成本。4. 防火墙、SELinux 与网络连通性排查4.1 放行端口之前先想清楚暴露面Rocky Linux 默认开启 firewalld这个防火墙比某些发行版的 iptables 好理解得多但坑也不少。默认 zone 是 public外部流量默认全部拒绝你需要在防火墙上放行端口才能访问 Web UI。sudo firewall-cmd --permanent --add-servicehttp sudo firewall-cmd --permanent --add-servicehttps sudo firewall-cmd --reload注意这里我只放了 80 和 443也就是 Nginx 对外提供服务的端口。8000 端口不要对外放行——它只该被本地的 Nginx 转发。你可以在防火墙里确认一下sudo firewall-cmd --list-all看到services: http https就对了。如果多出来8000/tcp这种端口建议收回去sudo firewall-cmd --permanent --remove-port8000/tcp sudo firewall-cmd --reload暴露面越小越安全这是原则问题。还有一种情况Agent 和服务端之间走的是非标准端口比如 8443那你还需要针对这个端口单独放行sudo firewall-cmd --permanent --add-port8443/tcp sudo firewall-cmd --reload4.2 SELinux 可能是你部署路上的最大隐藏 BossRocky Linux 默认 SELinux 是 enforcing 模式这玩意儿对于从 Debian 系转过来的同学来说几乎是玄学一样的存在。我遇到过无数次这样的情况服务配置全对端口也通了端口监听也正常但外部就是访问不了——最后查下来是 SELinux 拦截了进程的网络访问。排查技巧很简单先看审计日志sudo ausearch -m avc -ts recent如果看到类似denied { name_connect }这样的记录那就是 SELinux 拦截了。有两种解决方式方式一让 gunicorn 在 SELinux 里获得正确的上下文推荐。如果你按上面的 systemd 配置部署通常没有大问题。但如果你的 Web UI 有自己独立的 systemd 服务名比如叫hermes-web-ui.service可能会被 SELinux 判定为initrc_t类型这个类型禁止发起网络连接。解决方式是为这个服务设置正确的类型sudo semanage fcontext -a -t httpd_sys_content_t /opt/hermes-web-ui(/.*)? sudo restorecon -Rv /opt/hermes-web-ui方式二临时把 SELinux 切到 permissive 模式来确认是不是它的锅排查用。sudo setenforce 0 # 测试完恢复 sudo setenforce 1如果 setenforce 0 后一切正常setenforce 1 后又不行那 100% 是 SELinux 策略问题。这时候别图省事直接改/etc/selinux/config把 SELinux 禁掉正确做法是按上面方式一调整上下文或者用audit2allow生成自定义策略模块sudo grep denied /var/log/audit/audit.log | audit2allow -M hermes_policy sudo semodule -i hermes_policy.pp这个方法我一般用在比较偏门的应用上。对于本指南的场景用方式一就够了。4.3 网络连通性的三连排查Agent 能启动Web UI 也能访问但 Agent 在 UI 上一直显示离线——这时候先别改任何配置按下面的顺序排查第一层Agent 到服务端的网络是否通。curl -v https://hermes.example.com:8443/health如果这条命令有响应网络层面的 TCP 链路是通的。如果超时检查两边的防火墙以及服务端是否在监听这个端口。第二层Agent 的认证是否通过。看 Agent 日志如果出现401 Unauthorized或token invalid说明auth_token配置不对。重新核对服务端生成的 token 和 Agent 配置文件里的 token 是否一致。这里有个容易踩的小坑复制 token 时多复制了空格或者配置文件里的引号把 token 包进去了。肉眼很难看出来直接用cat -A config.yaml | grep auth看下有没有多余字符。第三层心跳是否正常上报。看服务端日志里有没有该 Agent 的最后心跳时间。如果 Agent 侧显示发送成功服务端没收到大概率是防火墙丢弃了 UDP 包部分 Agent 使用 UDP 心跳或者服务端的消息队列积压了。处理方式是重启队列服务或者等它自动恢复——心跳机制一般都有一定的容错只要不是长时间断连Agent 会自动重新同步。这一整套排查下来90% 的“离线”问题都能定位。5. 常见问题与坑点实录5.1 会话丢失问题我的 Hermes-Web-UI 会话为什么老是掉热搜词里有一条“我的hermes-web-ui的会话老是丢失”这个问题我确实有发言权因为我在自己的环境里排查过多次。会话丢失一般有四种常见原因原因一gunicorn worker 设置了热重载导致 session 失效。当你用gunicorn --reload跑 Web UI 时代码文件一旦变化worker 会重启内存里的 session 数据全部清空。解决方式是去掉--reload参数仅开发时使用。原因二session 存储用的是内存型后端。有些 Web UI 默认把 session 存在进程内存里gunicorn 有多个 worker 时用户请求由 worker A 处理登录后 session 存在 A下一次请求被负载到 worker BB 没有这个 session就强制要求重新登录。解决方式是在 Web UI 配置里把 session 存储改为数据库或 Redis。如果项目用 Flask找到类似这样的配置app.config[SESSION_TYPE] filesystem # 改成 filesystem 或 redis如果 UI 是基于 Django 的Django 默认把 session 存数据库一般不会碰到这种问题。原因三Nginx 层面没有配置 session 保持。如果你的 UI 有多实例部署多台机器各跑一个 gunicorn用户第一次请求落在 A 机器下一次请求被 Nginx 转发到 B 机器而 session 又是本地文件存储那会话必然丢。解决方式有两种一是把 session 存储集中化Redis二是在 Nginx 里配置 ip_hash 保持固定 IP 的请求落在同一台后端upstream hermes_ui { ip_hash; server 127.0.0.1:8000; server 192.168.1.2:8000; }原因四cookie 过期时间太短。有些 UI 的 session 过期时间默认只有几十分钟如果你干着活去倒了杯水回来发现被登出多半就是这个原因。找到配置里SESSION_COOKIE_AGE或类似字段根据需求调大我一般设置为 7200两小时或更大。5.2 Agent 启动报错的常见错误对照表把实际中高频出现的 Agent 启动报错整理成了一张表方便直接对照排错报错信息原因解决方法permission denied配置文件或日志目录权限不足chown -R hermes:hermes /opt/hermesconfig file not found启动命令没指定配置路径ExecStart 里显式加--config参数invalid auth tokentoken 格式错误或复制多了空格重新粘贴 token用cat -A检查隐藏字符connection refused服务端地址或端口不通telnet 服务端IP 端口测试链路too many open files文件描述符上限低systemd 里加LimitNOFILE65535clock skew服务端和节点时间偏差太大两边都配 chrony确认时间同步ssl certificate verify failed自签证书未受信任把 CA 证书加到系统信任库或临时关闭验证仅测试第七行重点说一下。自签证书导致握手失败是内网部署最常碰到的认证类问题。合法的做法是把你的内网 CA 证书加到系统信任库sudo cp ca.crt /etc/pki/ca-trust/source/anchors/ sudo update-ca-trust临时关闭验证只在调试阶段用不要带进生产配置。5.3 Rocky Linux 8.10 与 9.6 之间的差异和注意点两个版本整体部署流程一致但有几个小差异值得注意第一Python 版本不同。8.10 默认装的是 Python 3.6Web UI 有些新版本依赖可能不支持。如果你在 8.10 上碰到 pip 安装某些包时提示“requires Python 3.8”说明 UI 对 Python 版本有硬性要求。解决方式是把 Python 3.9 装上去然后指定用 3.9 建虚拟环境sudo dnf install -y python39 python39-pip python3.9 -m venv venv第二网络配置方式不同。8.10 还在用ifcfg-*接口和 NetworkManager 共存9.x 已经全面转向nmconnectionkeyfile。我的建议是不管哪个版本都用 nmcli 管理别手动去改 ifcfg 文件。用 nmcli 最大好处是自动生成和更新配置文件的关联不会出现改完网卡重启后配置丢失的情况。第三firewalld 的默认 zone 行为基本一致。这块两个版本没什么变化配置可以复用。但要注意9.x 里 firewalld-nft 和 firewalld-iptables 两个后端存在切换的坑一般默认 nftables 就行不用动。5.4 如何进入单用户模式做故障修复这个和 Hermes 本身没直接关系但既然热搜词里出现了“rocky linux 如何进入单用户模式”而服务端系统出问题时进单用户模式救系统是运维的基本功所以必须写。场景典型你改错了网络配置或者误操作了某个服务导致系统起不来。这时候进单用户模式可以绕过正常的服务启动直接拿到 root shell 进行修复。Rocky Linux 8/9 通用的步骤重启系统在 GRUB 菜单界面按e进入编辑模式。找到以linux开头的那一行通常是linux ($root)/vmlinuz-...。在这一行的末尾追加rd.break进入紧急模式或改为single进入单用户模式。按CtrlX或F10启动。如果用了rd.break你会落在 initramfs 的 shell 里而此时根文件系统是只读的。需要重新挂载并切换根目录mount -o remount,rw /sysroot chroot /sysroot然后你就可以改配置了。修复完退出 chroot输入exit两次重启即可。有个更省事的替代方式如果你还能进系统只是某个服务故障直接systemctl rescue就能进救援模式。建议在第一次踩坑前先在自己熟悉的测试机上演练一遍 GRUB 编辑的流程免得生产环境卡在这个环节手忙脚乱。5.5 升级和卸载要考虑的资源清理Agent 和 Web UI 的升级相对简单但要留意旧进程残留问题。我见过有人直接解压新版本覆盖旧版本结果两个版本的配置文件格式不兼容Agent 起不来。升级前先停服务、备份配置再覆盖文件、启动服务sudo systemctl stop hermes-agent sudo cp /opt/hermes/config.yaml /opt/hermes/config.yaml.bak sudo tar -zxvf hermes-agent-new.tar.gz -C /opt/hermes sudo systemctl start hermes-agent注意不要直接删掉整个 /opt/hermes 目录再解压除非你确定不需要保留任何配置和运行时数据。Agent 的注册信息、任务的执行历史通常在数据目录里直接删了就再也找不回来了。卸载时同样不要直接rm -rf。先停服务、禁用开机自启sudo systemctl stop hermes-agent sudo systemctl disable hermes-agent sudo rm /etc/systemd/system/hermes-agent.service sudo systemctl daemon-reload确认没有进程残留后再清理目录。如果是被控节点要彻底脱离管理面别忘了解除 Agent 在服务端的注册信息否则控制台上会一直挂着一个“长期失联”的僵尸节点看着碍眼。6. 一些经验总结和收尾小建议做这套部署的时候我反复提醒自己一个原则能用最小改动解决问题就绝不动大手术。Rocky Linux 系统本身很稳但稳定不代表不需要维护。装上 Agent 和 Web UI 之后系统的日常巡检清单大概这几条第一定期确认防火墙规则。谁也没法保证不会有同事在机器上顺手放了个大范围端口。建议用firewall-cmd --list-all --permanent和--list-all对比一下确认运行中的规则和永久规则一致避免出现“临时生效后续重启丢配置”的坑。某些应用会把临时规则加进去但不写入永久配置重启后就失联了。第二磁盘日志要控量。Hermes Agent 如果在 debug 模式下跑日志量可能一天就几百 MB。建议直接改配置把日志级别调回 info并按天做日志轮转或交给 logrotate 处理sudo vim /etc/logrotate.d/hermes内容大致如下/var/log/hermes/*.log { daily rotate 7 compress missingok notifempty copytruncate }这个配置的含义是日志每天切割、保留 7 份、压缩旧日志。copytruncate这个参数很关键——它的原理是先复制当前日志内容再清空原文件对正在写入的进程不需要重启就能安全轮转。第三界面会话问题再提醒一遍。如果你在 UI 上操作时频繁被登出优先检查 session 配置和 gunicorn worker 数别急着怀疑浏览器问题。把 session 存储切到 filesystem 或数据库大多数会话丢失问题都能解决。第四升级之前先看文档别只下载压缩包。Hermes 这两个组件的版本迭代速度不算慢升级前花十分钟看一下 release notes确认有没有破坏性的配置变更能避免很多低级问题。最后再分享一个小技巧在 Rocky Linux 上做完所有部署之后把关键状态拍个快照。无论你用的是虚拟机、云盘快照还是容器镜像的方式都行。这样后续万一升级失败、配置改坏回滚只需要几分钟不用重新从头部署一遍。尤其是 Web UI 这种存在数据库状态的组件快照是最好的后悔药。这套环境跑起来之后日常使用中你会慢慢体会到统一管理的好处再也不用一台台机器 SSH 进去敲命令了。后面如果条件允许我建议再给 Web UI 配一套监控告警比如 Agent 离线超过 5 分钟就推一条通知管理体系基本就完整了。到那一步这套部署就算真正发挥价值了。