Ubuntu 22.04 安装 Apache HertzBeat 1.9.0 指南

从零到一在 Ubuntu 22.04.5 上安装 Apache HertzBeat 1.9.0 实时监控系统(官方二进制发行包),含 JDK 25 配置、JVM 内存限制、内嵌 H2 数据库与外部 MySQL/PostgreSQL 切换、面板登录、HTTP 监控创建/指标查询与 Prometheus 指标对接,本文在 x86_64 真实服务器实测通过

Apache HertzBeatApache HertzBeat安装部署Apache系统监控Ubuntu 22.04运维2026/10/11

Ubuntu 22.04 安装 Apache HertzBeat 1.9.0 指南

目标:从零到一在 Ubuntu 22.04.5 LTS(x86_64)上安装 Apache HertzBeat 1.9.0 实时监控系统。HertzBeat(Apache 顶级项目,可观测/Agentless 采集平台)采用 JVM 语言构建,官方二进制发行包内嵌 H2 数据库、支持 Prometheus 兼容指标出口(/actuator/prometheus)与 Prometheus 兼容告警、自定义监控与状态页构建,默认 Web 端口 1157、采集调度端口 1158。本文已在 /opt/hertzbeat 真实服务器实测通过。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(PRETTY_NAME="Ubuntu 22.04.5 LTS")
  • 系统架构:x86_64(uname -m 输出 x86_64,CPU 6 核,可用内存约 42 GB)
  • 组件版本:Apache HertzBeat 1.9.0(apache-hertzbeat-1.9.0-bin.tar.gz,sha512 见下)
  • 运行时:Temurin OpenJDK 25.0.4.1+1(承载二进制发行包安装位置 /opt/hertzbeat/java;系统 apt 自带 OpenJDK 17.0.20.1 无法运行 1.9.0,原因见「三、版本选型说明」)
  • Web 端口:1157(Tomcat 面板与 REST API);采集/调度端口:1158(Netty)
  • 内嵌数据库:H2(文件 data/hertzbeat.mv.db,模式 MODE=MYSQL,用户 sa);时序历史库:DuckDB(文件 data/history.duckdb)
  • 安装目录:/opt/hertzbeat(发行包解压目录重命名而来,内含 bin/ config/ define/ lib/ logs/ dist/)
  • 演示账号:admin / q1w2e3r4(本文已用该口令完成登录实测,来源见「七、配置说明」sureness.yml)

二、前置条件

  1. 一台 x86_64/amd64 架构的 Ubuntu 22.04 服务器,可用内存建议 ≥4 GB,磁盘 ≥10 GB(发行包约 364 MB,解压后含 lib 依赖较大)。
  2. 具备 binary/下载与执行 权限的普通用户,本文统一使用 root。
  3. 安装 net-tools(提供 netstat,bin/startup.sh 用其自检端口)与 curl(面板/API 验证与后续下载),并确认 JDK 版本:
apt-get update
apt-get install -y net-tools curl
java -version

⚠️ 注意:java -version 看到的系统 JDK 版本只影响「配置说明」。1.9.0 部署本身无需把 JDK 装进系统 PATH——发行包可直接指定内部 JDK 启动(见「四、部署步骤 A」4.5 节)。

三、版本选型说明

版本下载位置所需 JDK说明
1.9.0(当前最新)https://dlcdn.apache.org/hertzbeat/1.9.0/JDK 25(class 文件版本 69.0)本文实测版本;从 Apache Incubator 毕业后的正式 release,1.8.x 配置/运行时/JAR 结构有破坏性变更,1.9.0 不是 1.8.x 的平滑替换包
1.8.xhttps://dlcdn.apache.org/hertzbeat/1.8.x/JDK 11(亦可 JDK 17)上一代稳定分支,仍是许多团队的选型
1.7.x 及更早https://archive.apache.org/dist/hertzbeat/JDK 8+老版本,缺少新特性与长期维护

💡 说明:Apache HertzBeat 已于近期从 Apache Incubator 毕业,官方二进制发布迁移到非 incubator 路径 https://dlcdn.apache.org/hertzbeat/,https://archive.apache.org/dist/incubator/hertzbeat/ 只保留到 1.7.2 的旧归档。1.9.0 的 SHA512 校验值随官方发布页给出。

⚠️ 关于 JDK 版本(本文实测的重要结论):HertzBeat 1.9.0 的 apache-hertzbeat-1.9.0.jar 是用 Java 25 编译的(class 文件版本 69.0),因此必须使用 JDK 25 及以上;用 JDK 17(class 版本仅支持到 61.0)启动会报 UnsupportedClassVersionError ... has been compiled by a more recent version of the Java Runtime (class file version 69.0)。若需在 JDK 11/17 下运行,请选用 1.8.x 分支。官方安装目录 bin/startup.sh 也在代码中内置了 java25.0.1+ 检测逻辑。

四、部署方案 A:官方二进制发行包(推荐,本文实测)

4.1 下载官方发行包

使用 curl 从 Apache 官方 CDN 下载 HertzBeat 1.9.0 二进制发行包:

mkdir -p /opt/src
cd /opt/src
curl -fLO https://dlcdn.apache.org/hertzbeat/1.9.0/apache-hertzbeat-1.9.0-bin.tar.gz
curl -fsSL https://dlcdn.apache.org/hertzbeat/1.9.0/apache-hertzbeat-1.9.0-bin.tar.gz.sha512 -o apache-hertzbeat-1.9.0-bin.tar.gz.sha512
ls -lh apache-hertzbeat-1.9.0-bin.tar.gz

命令执行后的关键信息(与之对应的产物):

-rw-r--r-- 1 root root 135M apache-hertzbeat-1.9.0-bin.tar.gz   # 实际约 364 MB(du -h)

💡 说明:本机此前已下载过一份发行包用于校验比对(sha512 一致,见 4.2)。

4.2 校验 sha512 校验值

cd /opt/src
sha512sum apache-hertzbeat-1.9.0-bin.tar.gz

实测输出(与官方发布页给出的校验值逐字一致):

857a15ae89c3faaa48dffb57a6cfaf73d353fe5974099932c5b1b4a84324ebfe1e813ab24cd035f2b724a82812483e8c67a0e74a0429975eb462231ee50e7f70  apache-hertzbeat-1.9.0-bin.tar.gz

4.3 解压与目录规划

发行包顶层目录名带 -bin 后缀,解压后统一重命名为可读的安装目录 /opt/hertzbeat:

cd /opt
tar -xzf /opt/src/apache-hertzbeat-1.9.0-bin.tar.gz
mv /opt/apache-hertzbeat-1.9.0-bin /opt/hertzbeat
ls -d /opt/hertzbeat

实测输出:

/opt/hertzbeat

安装目录结构(关键子目录与文件):

/opt/hertzbeat/
├── apache-hertzbeat-1.9.0.jar   # Spring Boot 主程序(仅含启动器与迁移脚本)
├── bin/                         # startup.sh / shutdown.sh / restart.sh 等
├── config/                      # application.yml / sureness.yml / logback-spring.xml
├── define/                      # app-*.yml 各监控类型指标采集定义(HTTP=app-api.yml 等)
├── lib/                         # 全部运行依赖 JAR(hertzbeat-manager、H2、DuckDB 等)
├── dist/                        # 前端面板静态资源(index.html + 各 chunk)
├── logs/                        # 运行日志目录
└── java/                        # 内部 JDK(本方案把 JDK 25 放这里,见 4.4)

4.4 部署内部 JDK 25 与 JVM 堆内存限制

1.9.0 需要 JDK 25。推荐把整个 JDK 放到 /opt/hertzbeat/java,这样 bin/startup.sh 会走「Use the inner package jdk to start」分支,无需设置 JAVA_HOME/PATH。以下用 Adoptium Temurin 25(LTS)为例:

cd /opt
curl -fL -o jdk25.tar.gz https://api.adoptium.net/v3/binary/latest/25/ga/linux/x64/jdk/hotspot/normal/eclipse
tar -xzf jdk25.tar.gz
mv /opt/jdk-25.0.4.1+1 /opt/hertzbeat/java
/opt/hertzbeat/java/bin/java -version

实测输出:

openjdk version "25.0.4.1" 2026-08-18 LTS
OpenJDK Runtime Environment Temurin-25.0.4.1+1 (build 25.0.4.1+1-LTS)
OpenJDK 64-Bit Server VM Temurin-25.0.4.1+1 (build 25.0.4.1+1-LTS, mixed mode, sharing)

⚠️ 若改用系统发行版 JDK(如 apt install openjdk-25-jdk)亦可,但需在 4.5 中确认 startup.sh 走 java 分支。

JVM 堆内存限制(256–512 MB):生产建议把 JVM 堆限制在 256–512 MB,避免组件默认堆(本机约把可用内存的 1/4 留给堆,可达 GB 级)过大。修改 bin/startup.sh 第 92 行的 JAVA_MEM_OPTS,追加 -Xms256m -Xmx256m -Xmn128m:

sed -i 's|JAVA_MEM_OPTS=" -server -XX:SurvivorRatio=6 |JAVA_MEM_OPTS=" -Xms256m -Xmx256m -Xmn128m -server -XX:SurvivorRatio=6 |' /opt/hertzbeat/bin/startup.sh
grep -n 'JAVA_MEM_OPTS=' /opt/hertzbeat/bin/startup.sh

修改后的第 92 行(实测回显):

92:JAVA_MEM_OPTS=" -Xms256m -Xmx256m -Xmn128m -server -XX:SurvivorRatio=6 -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOGS_DIR"

启动后验证生效值(jps -l -v 可见 -Xms256m -Xmx256m -Xmn128m,见 4.6 真实回显)。

💡 其他托管形态改法:systemd 用 Environment=JAVA_MEM_OPTS="-Xms256m -Xmx256m -Xmn128m -server";基于官方发行包的 Compose 托管可通过 JAVA_OPTS/JAVA_MEM_OPTS 环境变量注入(见《Apache HertzBeat Docker Compose 部署指南》篇)。参照 JVM 专项:极端情况下(若 JVM 开启 -XX:+UseContainerSupport)以 jps -v/ps -ef 实看为准。

4.5 启动服务

cd /opt/hertzbeat
chmod +x bin/*.sh
./bin/startup.sh

实测输出(完整回显,末行为启动成功与 PID):

You can review logs at hertzbeat/logs
Starting the HertzBeat hertzbeat-startup ...
Use the inner package jdk to start
...
...
...
Service Start Success!
Service PID: 23221

💡 bin/startup.sh 支持子命令:./bin/startup.sh status 查看状态;./bin/shutdown.sh 停止;./bin/restart.sh 重启。常用运维命令与返回码详见《Apache HertzBeat 常用 CLI 命令与工具详解》篇。

4.6 验证运行(端口 / 进程 / JVM / 日志)

端口监听(Web 1157、调度 1158):

netstat -tlnp | grep -E ':1157|:1158'

实测输出:

tcp6       0      0 :::1157                 :::*                    LISTEN      23221/./java/bin/jav
tcp6       0      0 :::1158                 :::*                    LISTEN      23221/./java/bin/jav

Java 进程与 JVM 参数生效值:

/opt/hertzbeat/java/bin/jps -l -v | grep -i hertzbeat

实测输出(可见 -Xms256m -Xmx256m -Xmn128m,即 4.4 的堆限制已生效):

23221 org.apache.hertzbeat.startup.HertzBeatApplication -Duser.timezone=Asia/Shanghai -Dfile.encoding=UTF-8 -Doracle.jdbc.timezoneAsRegion=false --add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED -Xms256m -Xmx256m -Xmn128m -XX:SurvivorRatio=6 -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/hertzbeat/logs -Dlogging.path=/opt/hertzbeat/logs -Dlogging.config=/opt/hertzbeat/config/logback-spring.xml -Dspring.config.location=/opt/hertzbeat/config/

启动日志关键段(tail -n 6 /opt/hertzbeat/logs/startup.log 实测):

2026-10-11 13:46:58 [main] INFO  org.apache.hertzbeat.collector.collect.strategy.CollectStrategyFactory - Registered 37 collect strategies: [udp, memcached, nacos_sd, ssh, jdbc, snmp, icmp, eureka_sd, redis, dns_sd, consul_sd, nebulaGraph, jmx, websocket, telnet, mqtt, mongodb, registry, imap, smtp, ftp, rocketmq, nginx, s7, ngql, dns, ntp, script, zookeeper_sd, ipmi, modbus, pop3, http, redfish, http_sd, kclient, ssl_cert]
2026-10-11 13:46:58 [main] INFO  org.apache.hertzbeat.alert.calculate.periodic.PeriodicAlertRuleScheduler - Starting periodic alert rule scheduler...
2026-10-11 13:46:58 [netty-server-boss-0] INFO  io.netty.handler.logging.LoggingHandler - [id: 0x5cb44542] REGISTERED
2026-10-11 13:46:58 [netty-server-boss-0] INFO  io.netty.handler.logging.LoggingHandler - [id: 0x5cb44542] BIND: 0.0.0.0/0.0.0.0:1158
2026-10-11 13:46:58 [netty-server-boss-0] INFO  io.netty.handler.logging.LoggingHandler - [id: 0x5cb44542, L:/[0:0:0:0:0:0:0:0]:1158] ACTIVE

💡 完整启动需要约 25 秒(实测 Started HertzBeatApplication in 25.812 seconds)。37 种采集策略已注册,说明 Agentless 采集能力就绪。

4.7 面板访问、登录与首个 HTTP 监控(功能实证)

面板首页(GET /):

curl -s -o /dev/null -w 'HTTP %{http_code}, %{size_download} bytes, %{content_type}\n' http://127.0.0.1:1157/
curl -s http://127.0.0.1:1157/ | grep -ioE '<title>[^<]*</title>' | head -1

实测输出:

HTTP 200, 4157 bytes, content-type=text/html;charset=UTF-8
<title>HertzBeat</title>

浏览器访问 http://<服务器IP>:1157 打开控制台,默认登录页为 /account/login。

登录 API(返回 JWT,后续请求在 Authorization: Bearer <token> 携带):

curl -s -X POST http://127.0.0.1:1157/api/account/auth/form \
  -H 'Content-Type: application/json' \
  -d '{"identifier":"admin","credential":"q1w2e3r4"}'

实测输出(节选,含 token、refreshToken、role):

{"code":0,"data":{"token":"eyJhbGciOiJIUzUxMiIsInppcCI6IkRFRiJ9.eJwt...","refreshToken":"eyJhbGciOiJIUzUxMiIsInppcCI6IkRFRiJ9.eJw...","role":"[\"admin\"]"},"msg":null}

用错误口令验证(实测输出 code:5):

{"code":5,"data":null,"msg":"Incorrect Account or Password"}

添加一个 HTTP 监控(POST /api/monitor,监控本机 1157 面板端口;monitor 与 params 结构须包含 host/port/httpMethod/uri/ssl/timeout/enableUrlEncoding 等必填项):

TOKEN=$(curl -s -X POST http://127.0.0.1:1157/api/account/auth/form \
  -H 'Content-Type: application/json' \
  -d '{"identifier":"admin","credential":"q1w2e3r4"}' \
  | sed -n 's/.*"token":"\([^"]*\)".*/\1/p')
curl -s -X POST http://127.0.0.1:1157/api/monitor \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"monitor":{"app":"api","name":"LocalHTTP","intervals":10000,"status":0,"scheduleType":"independent"},"params":[{"field":"host","paramValue":"127.0.0.1","type":1},{"field":"port","paramValue":"1157","type":1},{"field":"httpMethod","paramValue":"GET","type":1},{"field":"uri","paramValue":"/","type":1},{"field":"ssl","paramValue":"false","type":1},{"field":"timeout","paramValue":"5000","type":1},{"field":"enableUrlEncoding","paramValue":"true","type":1}]}'

实测输出:

{"code":0,"data":null,"msg":"Add success"}

查询监控列表(GET /api/monitors)实测输出(节选):返回刚才创建的监控,status:1(正常运行中)、instance:"127.0.0.1:1157":

{"code":0,"data":{"content":[{"id":693131799233280,"jobId":693131799261952,"name":"LocalHTTP","app":"api","scrape":null,"instance":"127.0.0.1:1157","intervals":10000,"scheduleType":"independent","cronExpression":null,"status":1,"type":0,"labels":{},"annotations":{},"description":null,"creator":"admin",...}],...}}

查询监控详情(GET /api/monitor/{id})实测输出(节选),metrics 为该监控已注册的指标集 [summary, header]:

{"code":0,"data":{"collector":null,"metrics":[{"name":"summary","favorited":false},{"name":"header","favorited":false}],"monitor":{"id":693131799233280,"name":"LocalHTTP","app":"api","instance":"127.0.0.1:1157","status":1,...},"params":[{"field":"host","paramValue":"127.0.0.1","type":1},{"field":"port","paramValue":"1157","type":0},...]}}

Prometheus 兼容指标出口(GET /actuator/prometheus,需登录令牌;未带令牌返回 401):

curl -s http://127.0.0.1:1157/actuator/prometheus -H "Authorization: Bearer $TOKEN" | grep -E '^(jvm_memory|process_)' | head -n 6

实测输出(Prometheus 文本格式,可直接被 Prometheus Server 抓取):

jvm_memory_committed_bytes{application="04d566dd179a23221",area="heap",environment="prod",id="PS Eden Space"} 1.00663296E8
jvm_memory_committed_bytes{application="04d566dd179a23221",area="heap",environment="prod",id="PS Old Gen"} 1.34217728E8
jvm_memory_committed_bytes{application="04d566dd179a23221",area="heap",environment="prod",id="PS Survivor Space"} 1.6777216E7
jvm_memory_committed_bytes{application="04d566dd179a23221",area="nonheap",environment="prod",id="CodeHeap 'non-nmethods'"} 2555904.0
jvm_memory_committed_bytes{application="04d566dd179a23221",area="nonheap",environment="prod",id="Metaspace"} 1.55648E8

💡 说明:/actuator/health、/actuator/metrics、/actuator/prometheus 均受认证保护(未带令牌返回 401),对接外部 Prometheus 抓取时需按《配置参数详解》篇配置认证。关闭监控 DELETE /api/monitor/{id}(或勾选后批量删除 DELETE /api/monitors)。

五、部署方案 B:官方源码构建(Maven)

离线/安全红线环境可改用源码构建(产物同样运行在 1.9.0,但需 Maven 3.9+ 与 JDK 17 构建 JDK)。此方式可与方案 A 二选一:

cd /opt/src
curl -fLO https://dlcdn.apache.org/hertzbeat/1.9.0/apache-hertzbeat-1.9.0-src.tar.gz
tar -xzf apache-hertzbeat-1.9.0-src.tar.gz
cd apache-hertzbeat-1.9.0-src
mvn -T 4C clean package -Dmaven.test.skip=true

构建产物位于 webapp/target/apache-hertzbeat-*,其后按方案 A 4.4/4.5 配置 JDK25 与 JVM 堆并启动即可。

💡 说明:源码构建耗时较长、依赖 GitHub/中央仓库网络;可联网环境优先推荐方案 A 二进制发行包(本文实测渠道)。

六、部署方案 C:systemd 托管(生产推荐)

生产环境建议用 systemd 将 HertzBeat 注册为自启服务,本文给出完整单元文件与操作(需 systemd 真机;每行一个单元,禁止批量启停)。新建 /etc/systemd/system/hertzbeat.service:

[Unit]
Description=Apache HertzBeat Monitor
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/hertzbeat
ExecStart=/opt/hertzbeat/bin/startup.sh
ExecStop=/opt/hertzbeat/bin/shutdown.sh
Restart=on-failure
Environment=JAVA_OPTS="-Xms256m -Xmx256m -Xmn128m"

[Install]
WantedBy=multi-user.target

注册并启动(每条仅一个单元):

systemctl daemon-reload
systemctl enable hertzbeat
systemctl start hertzbeat
systemctl status hertzbeat

⚠️ 注意:bin/startup.sh 内的 -Xms/-Xmx 与 systemd Environment=JAVA_MEM_OPTS(若程序脚本读取)取其一显式声明即可,两者并存会以脚本内 JAVA_MEM_OPTS 为准;修改后以 jps -v 复核实际生效堆。

七、配置说明

HertzBeat 全部运行配置位于 /opt/hertzbeat/config/:application.yml(Spring 主配置)、sureness.yml(认证/账号)、logback-spring.xml(日志)。

  1. 服务与端口(application.yml):server.port: 1157;scheduler.server.port: 1158;common.queue.type: memory(可选 kafka/redis 队列)。
  2. 内嵌 H2 数据库:spring.datasource.url: jdbc:h2:./data/hertzbeat;MODE=MYSQL、username: sa、password: 123456,数据文件 data/hertzbeat.mv.db(相对安装目录);Flyway 自动迁移见 db/migration/h2/。
  3. 外接 MySQL/PostgreSQL:把 spring.profiles.active: prod 对应数据源整段替换为 MySQL/PostgreSQL 驱动、连接串、账号密码(如 MySQL 用 com.mysql.cj.jdbc.Driver + jdbc:mysql://<host>:3306/hertzbeat),并同步把 warehouse.store 时序架构选择对应引擎(默认 DuckDB 落盘历史指标)。
  4. 历史时序数据:默认 warehouse.store.duckdb.enabled: true、store-path: data/history.duckdb、expire-time: 90d;如需 VictoriaMetrics/QuestDB/GreptimeDB/TDengine 等,将其 enabled 置 true 并填连接串。
  5. 实时监控数据:warehouse.real-time.memory.enabled: true(内存),可切换 redis。
  6. 认证(sureness.yml):启用 digest/basic/jwt 三种认证;账号存于 account: 段(见下)。默认示例账号 admin 口令 hertzbeat,本文按规范改为 q1w2e3r4。
  7. 自定义监控/状态页:监控指标模板位于 define/app-*.yml;状态页(Status Page)通过在控制台「状态页」绑定监控并配关联组件构建,数据落库 HZB_STATUS_PAGE_*。

演示账号修改位置(实测修改点):config/sureness.yml 的账号段:

account:
  - appId: admin
    credential: q1w2e3r4
    role: [admin]

⚠️ 说明:1.9.0 不在 manager REST 层暴露「改密」接口(AccountController 仅有登录/刷新),改密即改该 credential 字段并重启生效(本机实测:改后旧口令登录返回 code:5 Incorrect Account or Password,新口令 q1w2e3r4 正常登录)。

八、多方案对比与选择建议

方案版本是否需联网安装方式服务托管监听端口优点/缺点
A 二进制发行包1.9.0需(下载)tar.gz 解压 + 内部 JDK手动/可选 systemd1157/1158开箱即用、最快;社区官方渠道(本文之路)
B 源码构建1.9.0需(Maven 中央仓库/GitHub)Maven package手动/systemd1157/1158可定制编译;耗时、依赖网络
C systemd 托管1.9.0不必叠加在 A/B 之上systemd 自启1157/1158生产自启/崩溃自动拉起;需 systemd 真机

💡 内网隔离选 A/B(下载后离线部署),可联网且需要自启/看门狗选 A+systemd。

九、注意事项

  • JDK 必须是 25+(1.9.0 为 Java 25 编译);用 JDK 11/17 会报 UnsupportedClassVersionError,请改用 1.8.x 分支。
  • 默认端口:1157 面板/API、1158 调度、OTLP/gRPC 14317;开防火墙时放行 1157(及若用 14317 采集链路)。
  • 内嵌 H2 仅适合单机/小规模:生产多副本或高写入建议外接 MySQL/PostgreSQL + 上卷时序库(见《配置参数详解》篇数据存储段)。
  • JVM 堆限制 256–512 MB:本文按 §JVM 专项将堆压到 -Xms256m -Xmx256m,修改文件 bin/startup.sh 第 92 行 JAVA_MEM_OPTS,并以 jps -v 复核。
  • 账号口令:示例 admin/q1w2e3r4,生产务必更换口令并妥善保管(sureness.yml)。

十、常见问题(FAQ)

Q1:./bin/startup.sh 报 netstat: command not found,但仍能听到 1157?

没有安装 net-tools 时,startup.sh 的自检(按端口判断是否已启动)会失败并刷屏,但 Java 进程仍通过 nohup 后台启动。解决:apt-get install -y net-tools,之后 ./bin/startup.sh 才能打印 Service Start Success!。

Q2:启动抛 UnsupportedClassVersionError: has been compiled by a more recent version of the Java Runtime (class file version 69.0)?

JDK 版本过低。1.9.0 需 JDK 25(class 69.0);把内部 JDK 放进 /opt/hertzbeat/java 并重跑 ./bin/startup.sh 即可(本文解法,详见四、4.4)。

Q3:面板能开但登录失败/改口令后旧口令还能进?

HertzBeat 1.9.0 无 manager「改密」REST 接口,改密即改 config/sureness.yml 的 account.credential 并重启(本文已实测:改后旧口令返回 Incorrect Account or Password)。另外请确认 TOKEN 请求头是 Authorization: Bearer <token>(不带 Bearer 会被拒绝)。

Q4:/actuator/prometheus 返回 401?

这些 Prometheus/健康指标端点受 sureness 保护,抓取/浏览需带 Authorization: Bearer <token>;要对接外部 Prometheus 请在《配置参数详解》篇按需调整认证或配置抓取令牌。

Q5:如何让监控产生历史/实时指标数据?

POST /api/monitor 创建成功后按 intervals(ms) 周期自动采集,实例 status:1 即正常。实时数据默认存内存(warehouse.real-time.memory.enabled: true),历史数据默认落 DuckDB(warehouse.store.duckdb)。采集查询走 GET /api/monitor/{id}/metrics/{metric}。

Q6:没有 systemd 的环境下如何让服务常驻?

bin/startup.sh 通过 nohup 把 Java 进程 detach 到后台,本身就是常驻方案;如需崩溃自启再叠加 systemd(方案 C)或进程守护工具。

十一、卸载方式

# 1) 停止服务(若 systemd 托管则先停服务)
cd /opt/hertzbeat && ./bin/shutdown.sh
# 或 systemctl disable --now hertzbeat

# 2) 删除安装目录(含内嵌 H2、DuckDB 数据与日志,请确认已备份)
rm -rf /opt/hertzbeat

# 3) 清理下载的发行包与校验文件
rm -rf /opt/src/apache-hertzbeat-1.9.0-bin.tar.gz*

⚠️ 卸载即删除 /opt/hertzbeat/data/(内嵌 H2 hertzbeat.mv.db 与 DuckDB history.duckdb),请先按《常用 CLI 命令与工具详解》篇导出监控与配置后再清理。

十二、参考链接