二进制安装
当前发行版本是 单个 Docker Compose 堆栈 — 包含一个证书生成器、一个数据湖、六个应用和一个代理(安装后的样子)。
本页面是为了 继续运维基于二进制安装构建的现有系统的用户 而保留的。新建部署请使用 一行安装 或 Docker 安装。
另外,下面的内容是基于容器迁移前的标准编写的,可能与当前产品有所偏差。如果二进制环境出现问题,请 联系 webmaster@kopens.com。
概述
本页面介绍了 直接在操作系统上安装 PlantPulse 平台的二进制(原生)安装过程。解压 tar.gz 包,通过一个设置脚本即可配置 OS 依赖、基础设施和应用程序。
数据湖/应用 2 节点分离(
PP_TIER) 安装请参见 2 节点分离安装。本文档基于单机(FULL)二进制安装。
安装方式对比
| 项目 | 二进制安装 | 一行/Docker 安装 |
|---|---|---|
| 安装时间 | 20~40 分钟 | 10~20 分钟 |
| 环境依赖 | 在主机 OS 上安装包 | 全部包含在容器中 |
| 资源隔离 | 与主机共享 | 由容器隔离 |
| 更新 | tar.gz 重新分发 + configure | update.sh 一行命令 |
| 回滚 | 从备份手动恢复 | 自动回滚到旧版本镜像 |
| 隔离网络 | setup-offline.sh 支持 | airgap-load.sh 支持 |
| 主机 OS | 直接影响 | 基本无影响 |
支持的环境
| 操作系统 | 版本 | 验证 |
|---|---|---|
| Oracle Linux | 8.x, 9.x | ✓ |
| RHEL / Rocky Linux | 8.x, 9.x | ✓ |
| Amazon Linux | 2, 2023 | ✓ |
| Ubuntu | 22.04+ | ✓ |
硬件建议规格
| 类别 | 最小 | 标准 | 大规模 |
|---|---|---|---|
| CPU | 16 vCPU | 32 vCPU | 48+ vCPU |
| 内存 | 64GB | 128GB | 200GB+ |
| 数据磁盘 | 200GB | 1TB | 4TB+ |
| 磁盘 IOPS | NVMe SSD 推荐 | NVMe SSD | NVMe SSD |
| 网络 | 1Gbps | 10Gbps | 10Gbps |
验证环境(参考):运营验证环境运行 48 vCPU / 188GB RAM / 4.8TB NVMe SSD,RHEL 9 / Temurin OpenJDK 21 LTS。
安装流程概览
1. 前置准备
1.1 获取 root 权限
安装以 root 权限进行。如需以非 root 用户运维,安装完成后需要单独的权限分离步骤(请咨询运维团队)。
sudo -i
1.2 挂载数据磁盘
为了存储大量时序数据,请将单独的磁盘挂载到 /data1。
# 사용 가능한 디스크 확인
lsblk
# 예: /dev/sdb 를 ext4 로 포맷 후 /data1 에 마운트
mkfs.ext4 /dev/sdb
mkdir -p /data1
mount /dev/sdb /data1
# 부팅 시 자동 마운트
echo "/dev/sdb /data1 ext4 defaults 0 0" >> /etc/fstab
建议分离磁盘:将 OS 磁盘和数据磁盘分离可以简化备份、扩展和故障隔离。即使是小型环境也建议配置为单独的磁盘/LV。
1.3 时间同步
分布式组件(Cassandra、Kafka 等)对节点间的时间精度敏感。NTP 同步是必需的。
# RHEL 계열
dnf install -y chrony
systemctl enable --now chronyd
chronyc tracking
1.4 SELinux / 防火墙
setup.sh 会自动将 SELinux 切换为 permissive 模式,并打开必需的防火墙端口。公司/云上游防火墙需另外参考 端口配置信息 页面添加允许规则。
2. 下载和解压包
将从 KOPENS 运维团队收到的 plantpulse-platform-YYYY.MM.tgz 包放置在 /opt/kopens/ 中。
mkdir -p /opt/kopens
cd /opt/kopens
# scp 또는 USB / 내부 미러로 패키지 이전
# 예시: scp 로 받은 파일을 풀기
tar -xzvf plantpulse-platform-2026.05.tgz
# 결과 디렉토리 확인
ls /opt/kopens/plantpulse-platform/
解压后会生成以下结构。
/opt/kopens/plantpulse-platform/
├── plantpulse-startup/ # 모든 운영 스크립트 + startup.jar
│ ├── env.sh # 전역 환경 변수 (★ 검토 필요)
│ ├── start.sh / stop.sh # 시작 / 정지
│ ├── start-daemon.sh # 데몬 모드 시작
│ ├── restart.sh # stop → clean → start-daemon
│ ├── status.sh # 포트 기반 상태 점검
│ ├── configure.sh # 템플릿 → 실제 설정 생성
│ ├── prepare-ssl.sh # TLS 인증서 생성
│ ├── restart-*.sh # 모듈별 재시작
│ ├── node-*.sh # Cassandra 운영
│ ├── log-viewer.sh # 통합 로그 뷰어
│ └── ...
├── plantpulse-server/ # 웹 콘솔 (Tomcat 기반)
├── plantpulse-batch/ # 배치 처리
├── plantpulse-cep/ # 복합 이벤트 처리
├── plantpulse-data-gateway/ # 데이터 게이트웨이
├── plantpulse-sql/ # SQL 쿼리 서비스
├── plantpulse-monitor/ # 모니터링
├── plantpulse-warehouse/ # 데이터 웨어하우스
├── plantpulse-plugin/ # OPC-UA / AAS 산업 플러그인
├── plantpulse-storage/ # Cassandra / PostgreSQL / Valkey / MinIO
├── plantpulse-messaging/ # Kafka / MQTT(HiveMQ) / STOMP(ActiveMQ)
├── plantpulse-analytics/ # Spark / Hive / Kyuubi / Gravitino / Hadoop
├── plantpulse-workflow/ # Temporal / Kestra
├── plantpulse-timeseries/ # 시계열 엔진 + UI
├── tools/ # OS 의존성 / JDK / DB 클라이언트 / 설정 템플릿
│ ├── setup.sh # 온라인 셋업
│ ├── setup-offline.sh # 폐쇄망 셋업
│ ├── java/ # OpenJDK
│ ├── postgresql/ # psql 클라이언트
│ ├── valkey/ # redis-cli
│ ├── cron/ firewall/ ssl/ swap/ ntp/ ...
│ └── ...
├── offline/ # 폐쇄망 설치 리소스 (RPM 리포 + wheels)
└── backup/ # 자체 백업 디렉토리
3. 运行设置脚本
tools/setup.sh 一次性处理 OS 包安装、JDK 安装、数据目录创建、防火墙 / SELinux / NTP / limits / sysctl 配置。
cd /opt/kopens/plantpulse-platform/tools
./setup.sh
设置脚本交互式输入
setup.sh 会询问以下信息。
| 项目 | 说明 | 示例 |
|---|---|---|
| 节点模式 | MASTER(单节点/集群主节点)或 WORKER | MASTER |
| HOST IP | 服务器内部 IP | 192.168.0.41 |
| SERVICE IP | 外部访问 IP 或域名 | 192.168.0.41 |
| MASTER IP (仅 WORKER) | 主节点 IP | 192.168.0.41 |
| 数据磁盘名称 | 基于 lsblk 输出 | sdb |
| 数据根路径 | 数据存储目录 | /data1 |
设置脚本自动执行的任务
运行耗时:首次运行约需 15~30 分钟(包括 OS 更新、包安装和基础设施组件安装)。
4. 环境变量设置(用 env.local.sh 重写)
/opt/kopens/plantpulse-platform/plantpulse-startup/env.sh 是平台全局单一配置源(基准值)。所有模块的模板配置文件都参考这个值生成。
完整的
PP_*变量列表(默认值和说明)整理在 环境变量参考 页面中按类别分类。
⚠️ 不要直接修改
env.sh。 针对服务器的值(IP、资源、密码等机器特定值)应该写在同一目录的env.local.sh中。这是二进制安装的标准做法。
区分 Docker 安装 二进制安装(本页) 配置文件 直接修改 bin/env.sh中的DOCKER_PP_*环境变量在 plantpulse-startup/env.local.sh中编写重写原件保留 — env.sh原件保持不变,更新时安全
为什么是 env.local.sh?
env.sh 在最顶部最先读取 env.local.sh。 env.sh 中的所有变量都是 ${PP_XXX:-기본값} 形式,所以在 env.local.sh 中以 export PP_XXX=... 声明的值总是覆盖默认值。
env.local.sh不包含在 git 中,平台更新(tar.gz 重新分发)时也不会被覆盖。 → 一旦编写,更新后配置保持不变。- 相反,直接修改
env.sh会在更新时被新的env.sh替换,修改内容丢失。
编写 env.local.sh
如果文件不存在,直接创建即可。只需用 export 方式写入需要更改的变量。
cd /opt/kopens/plantpulse-platform/plantpulse-startup
vi env.local.sh
#!/bin/bash
# env.local.sh — 이 서버 전용 오버라이드 (env.sh 가 먼저 source 하여 우선 적용)
# 여기에 적은 값만 기본값을 덮어씁니다. 적지 않은 변수는 env.sh 기본값을 그대로 사용합니다.
export PP_HOST_IP="192.168.0.41" # 서버 내부 IP (hostname -I)
export PP_SERVICE_IP="192.168.0.41" # 브라우저 접속 IP/도메인 (단일 서버면 HOST_IP 와 동일)
export PP_MASTER_IP="192.168.0.41" # 마스터 IP (단일 서버면 HOST_IP 와 동일)
export PP_DATA_DISK_NAME="sdb" # 데이터 디스크 이름 (lsblk)
export PP_DATA_DIR="/data1/pp-data" # 데이터 저장 경로
export PP_CLUSTER_CORES="30" # 분산 분석에 할당할 코어 (아래 4.1 사이징표 참고)
export PP_CLUSTER_MEMORY_BY_CORE="2G" # 코어당 메모리
保存后必须重新运行
./configure.sh,新值才能反映到各模块配置中(第 5 步)。每次修改时,env.local.sh修改 →./configure.sh运行为一个整体。
4.1 必须检查的核心变量
| 类别 | 变量 | 说明 | 默认值 |
|---|---|---|---|
| Platform | PP_HOME | 安装路径 | /opt/kopens/plantpulse-platform |
PP_MODE | 节点模式 | MASTER / WORKER | |
| Network | PP_HOST_IP | 服务器内部 IP | 192.168.0.41 |
PP_SERVICE_IP | 外部访问 IP | 192.168.0.41 | |
PP_MASTER_IP | 主节点 IP | 192.168.0.41 | |
PP_PUBLIC_IP | 外部公网 IP (NAT) | ${PP_HOST_IP} | |
| Data | PP_DATA_DIR | 数据存储路径 | /data1/pp-data |
PP_TEMP_DIR | 临时文件路径 | /data1/pp-temp | |
PP_BACKUP_DIR | 备份路径 | /data1/pp-backup | |
| Resources | PP_CLUSTER_CORES | 分布式分析分配的核心数 | 30 |
PP_CLUSTER_MEMORY_BY_CORE | 每核心内存 | 2G | |
| Locale | PP_LANG | 区域设置(ko / en) | en |
PP_TZ | 时区 | Asia/Seoul |
上表是查看变量名称和默认值的参考。实际要更改的值按第 4 段开头的说明在
env.local.sh中用export方式写入(env.sh直接修改 ✗)。第 3 步设置中输入的 HOST IP / SERVICE IP / 磁盘名称已经反映了,所以本步骤是检查那些值是否正确,只将不足的项添加到env.local.sh的过程。
如何确定值?(容易混淆的项)
# IP 확인 (PP_HOST_IP / PP_SERVICE_IP)
hostname -I | awk '{print $1}' # 서버 내부 IP
ip -4 addr | grep inet # 외부 접속용 IP를 따로 골라야 할 때
# 데이터 디스크 / 코어 / 메모리
lsblk # 데이터 디스크명 (sdb, nvme0n1 …)
nproc # 전체 CPU 코어 수
free -g | awk '/^Mem:/{print $2"G"}' # 전체 메모리
PP_HOST_IP= 同一网络中指向服务器的内部 IP。单服务器的话,PP_SERVICE_IP、PP_MASTER_IP填相同值即可。PP_SERVICE_IP= 用户用浏览器访问的 IP/域名。如果有 NAT、云环境,请在PP_PUBLIC_IP中另外添加外部公网 IP。
分布式分析资源规模(PP_CLUSTER_CORES / PP_CLUSTER_MEMORY_BY_CORE)
这两个值是分配给 Spark 等分布式分析的资源。不要把整个主机都给,要给存储、消息、网页服务器留足够(建议占总体的 60~70%)。
| 服务器规格 | PP_CLUSTER_CORES | PP_CLUSTER_MEMORY_BY_CORE | 分析使用的内存总计 |
|---|---|---|---|
| 16 核心 / 64GB | 10 | 2G | 20GB |
| 32 核心 / 128GB | 20 | 3G | 60GB |
| 48 核心 / 188GB | 30 | 4G | 120GB |
코어 수 × 코어당 메모리是分析占用的内存总量。请确保这个总计不超过服务器整体内存(剩余 30% 以上)。超过会导致启动时发生 OOM。
4.2 服务账户密码
在生产环境中务必更改以下默认密码。
# env.local.sh 안에 추가
export PP_REDIS_PASSWORD=$(openssl rand -base64 18)
export PP_CASSANDRA_PASSWORD=$(openssl rand -base64 18)
export PP_PG_PASSWORD=$(openssl rand -base64 18)
export PP_MQ_PASSWORD=$(openssl rand -base64 18)
export PP_HIVE_PASSWORD=$(openssl rand -base64 18)
export PP_MINIO_PASSWORD=$(openssl rand -base64 18)
export PP_TEMPORAL_PASSWORD=$(openssl rand -base64 18)
export PP_TLS_KEYSTORE_PASSWORD=$(openssl rand -base64 18)
建议:将更改的密码保存在运营 vault(HashiCorp Vault、AWS Secrets Manager 等)中,使用
env.local.sh环境变量注入模式。
4.3 TLS / SSL 设置
# env.local.sh 안에 추가
export PP_TLS_ENABLED=true
export PP_TLS_DOMAIN=plantpulse.io
export PP_TLS_SAN_DNS="localhost,$(hostname -f),plantpulse.io,plantpulse.kopens.com"
export PP_TLS_SAN_IPS="${PP_HOST_IP},${PP_SERVICE_IP},${PP_PUBLIC_IP},127.0.0.1,192.168.0.10"
export PP_TLS_VALID_DAYS=730
添加外部公网 IP:在 NAT / 云环境中,必须在
PP_TLS_SAN_DNS/PP_TLS_SAN_IPS中明确指定外部 IP/域名,客户端证书验证才能通过。
4.4 验证和重置
cd /opt/kopens/plantpulse-platform/plantpulse-startup
./env-validate.sh # env.sh + env.local.sh 최종 변수 정합성 검증
./env-reset.sh # env.local.sh 변경 후 템플릿 재생성이 필요할 때
env-validate.sh验证已应用env.local.sh重写的最终值。因此,编写env.local.sh后可用此脚本检查 IP、路径、密码是否按意图输入。
5. 应用模板配置(configure.sh)
将 env.sh(+ env.local.sh 重写)的最终值一次性应用到所有模块的配置文件。
cd /opt/kopens/plantpulse-platform/plantpulse-startup
./configure.sh
configure.sh 内部调用 startup.jar CONFIGURE,执行以下操作。
- 扫描
template/目录中所有配置模板(*.template) - 用
env.sh变量替换占位符(${PP_HOST_IP}、${PP_CASSANDRA_PASSWORD}等) - 保存到实际配置文件位置 — 网页应用服务(server、batch、cep、sql、data-gateway)各自的
config/,基础设施模块为conf/、etc/等
网页应用服务的配置已外化到模块 config/ 中,所以即使重新部署网页应用(WAR),配置也不会丢失。
更改后必须重新运行:每次修改
env.local.sh时都要重新运行./configure.sh,新值才能应用到模块。
6. 准备 TLS 证书(prepare-ssl.sh)
如果 PP_TLS_ENABLED=true,在首次启动前生成证书。
cd /opt/kopens/plantpulse-platform/plantpulse-startup
./prepare-ssl.sh
- 生成自签名证书(ECDSA secp256r1)
- 生成 keystore / truststore(
/var/security/plantpulse/) - 分离生成 OPC-UA / Kafka / MQTT / Cassandra / Web 证书
- 要使用外部 CA 证书,请参见 安全设置 页面
7. 启动平台
7.1 前台启动(初期验证)
安装后首次启动时,建议直接查看启动日志验证。
/opt/kopens/plantpulse-platform/plantpulse-startup/start.sh
7.2 后台启动(运营模式)
在生产环境中以守护进程模式启动。关闭终端后平台继续运行。
/opt/kopens/plantpulse-platform/plantpulse-startup/start-daemon.sh
7.3 启动顺序
startup.jar 根据依赖顺序分步启动各个组件。
各阶段完成前自动等待,无需额外操作。整体启动需要 3 ~ 5 分钟。
7.4 启动成功消息
═══════════════════════════════════════════════════════════════════
____ _ _ ____ _
| _ \| | __ _ _ __ | |_| _ \ _ _| |___ ___
| |_) | |/ _` | '_ \| __| |_) | | | | / __|/ _ \
| __/| | (_| | | | | |_| __/| |_| | \__ \ __/
|_| |_|\__,_|_| |_|\__|_| \__,_|_|___/\___|
PLATFORM
═══════════════════════════════════════════════════════════════════
● Status STARTING [DAEMON]
● Host ...
● URLs https://... (web)
═══════════════════════════════════════════════════════════════════
...
플랜트펄스 플랫폼이 정상적으로 시작되었습니다.
8. 安装验证
8.1 服务状态检查
/opt/kopens/plantpulse-platform/plantpulse-startup/status.sh
各模块显示为 RUNNING 状态,同时显示系统资源使用摘要(CPU / Memory PSS / Disk)。
=============================================================================================================
PLANTPULSE PLATFORM - ALL SERVICE STATUS
=============================================================================================================
<SYSTEM RESOURCE OVERVIEW>
--------------------------------------------------------------------------------------------------------------
CPU LOAD (AVG) : 12.3% (48 cores)
MEMORY USAGE : 65.2% (123.1G / 188.7G)
DATA DISK USAGE : 45.8% (2.2T / 4.8T)
--------------------------------------------------------------------------------------------------------------
<SERVICE STATUS BY PORT>
SERVICE | PORT | STATUS | PID | CPU | MEMORY (PSS) | PROCESS
PP_MESSAGING[KAFKA] | 9092 | RUNNING | 12345 | 2.3% | 8.5G ( 4.51%) | java
PP_STORAGE[CASSANDRA] | 9042 | RUNNING | 12567 | 5.1% | 16.2G ( 8.59%) | java
PP_SERVER | 80 | RUNNING | 12890 | 1.2% | 4.8G ( 2.55%) | java
...
8.2 网页控制台访问
用浏览器访问以下地址。
| URL | 用途 |
|---|---|
http://[SERVICE_IP]/ | 运营控制台(端口 80) |
https://[SERVICE_IP]/ | 运营控制台(端口 443,TLS) |
https://[SERVICE_IP]:7443/ | 管理控制台(独立端口) |
- 默认管理员账户:admin / admin123!
- 登录后立即更改密码。
8.3 健康检查端点
与外部监控系统集成时使用。
# 컨테이너 / 프로세스 헬스
curl -kfsS https://127.0.0.1:4950/api/health | jq
# 모니터 모듈
curl -fsS http://127.0.0.1:4949/health
运营命令汇总
cd /opt/kopens/plantpulse-platform/plantpulse-startup
./start.sh # 포그라운드 시작
./start-daemon.sh # 백그라운드 시작
./stop.sh # 정지
./restart.sh # stop → clean → start-daemon
./status.sh # 전체 모듈 상태
./log-viewer.sh # 통합 로그 뷰어
./log-delete.sh # 오래된 로그 정리
./clean.sh # 임시 파일 정리 (정지 후)
./kill.sh # 강제 종료 (응답 없을 때)
# 모듈별 재시작
./restart-server.sh # 웹 서버
./restart-storage.sh # 스토리지
./restart-analytics.sh # 분석
./restart-messaging.sh # 메시징
./restart-timeseries.sh # 시계열
./restart-workflow.sh # 워크플로우
./restart-cep.sh # CEP
./restart-data-gateway.sh # 데이터 게이트웨이
./restart-monitor.sh # 모니터
./restart-batch.sh # 배치
./restart-warehouse.sh # 웨어하우스
./restart-plugin.sh # 플러그인
./restart-opcua-server.sh # OPC-UA
./restart-aasx-server.sh # AAS
# Cassandra 운영
./node-status.sh # 클러스터 상태
./node-info.sh # 노드 상세
./node-cql.sh # CQL 셸
./node-compact.sh # 수동 컴팩션
./node-cleanup.sh # 노드 정리
./node-repair.sh # 데이터 복구
隔离网络(Airgap)安装
在断网环境中按以下步骤安装。
在构建节点(有网络环境)生成捆绑包
cd /opt/kopens/plantpulse-platform/offline
./prepare-offline.sh
# 산출물: /offline-install/kopens-offline.tar.gz
捆绑包包含以下内容。
- 完整的
/opt/kopens/plantpulse-platform/目录 - 必需的 RPM(
offline/repos/rpm/+repodata/) - Python wheel(
offline/repos/python-wheels/) - JDK / 基础设施包(
tools/下方)
转移到隔离网络节点
用 USB / 内部文件服务器 / scp 等方式转移 kopens-offline.tar.gz。
在隔离网络节点上安装
mkdir -p /opt/kopens
tar -xzvf /path/to/kopens-offline.tar.gz -C /opt/kopens/
cd /opt/kopens/plantpulse-platform/tools
./setup-offline.sh
# 환경 변수 작성 및 시작 (env.sh 직접수정 ✗ → env.local.sh 에 오버라이드)
cd /opt/kopens/plantpulse-platform/plantpulse-startup
vi env.local.sh
./configure.sh
./start-daemon.sh
./status.sh
setup-offline.sh 仅使用本地 RPM 仓库安装 OS 依赖,部署基础设施组件。
更新
小版本更新(配置 / 补丁)
cd /opt/kopens/plantpulse-platform/plantpulse-startup
./stop.sh
# 패치 파일 적용 (운영팀이 안내한 절차에 따라)
cp -r /tmp/patch/* /opt/kopens/plantpulse-platform/
./configure.sh
./start-daemon.sh
./status.sh
大版本更新(全量重新部署)
# 1. 현재 데이터 / 설정 백업
./stop.sh
cp -a /opt/kopens/plantpulse-platform /opt/kopens/plantpulse-platform.bak-$(date +%Y%m%d)
tar -czf /data1/pp-backup/pre-update-$(date +%Y%m%d).tar.gz /data1/pp-data /data1/pp-backup
# 2. 새 tar.gz 풀기 (env.local.sh / 데이터는 보존)
# 설정값은 env.local.sh 에 있으므로 그 파일만 보존하면 됩니다.
# env.sh 는 새 버전으로 갱신되어도 무방합니다(기본값 정본).
cd /opt/kopens
tar -xzvf plantpulse-platform-NEW.tgz --exclude='plantpulse-platform/plantpulse-startup/env.local.sh'
# 3. 재구성 및 시작
cd /opt/kopens/plantpulse-platform/plantpulse-startup
./configure.sh
./start-daemon.sh
# 4. 문제 시 롤백
./stop.sh
rm -rf /opt/kopens/plantpulse-platform
mv /opt/kopens/plantpulse-platform.bak-YYYYMMDD /opt/kopens/plantpulse-platform
cd /opt/kopens/plantpulse-platform/plantpulse-startup
./start-daemon.sh
数据保护:大版本更新前务必对
/data1/pp-data和/data1/pp-backup进行完整备份,保存到单独的磁盘/外部存储。
问题解决要点
| 症状 | 一级处理 |
|---|---|
| 启动后某些模块 STOPPED | 用 ./status.sh 确认哪个模块,然后 ./restart-<module>.sh |
| 内存不足 / OOMKilled | 调整 env.local.sh 中的 PP_CLUSTER_CORES / PP_CLUSTER_MEMORY_BY_CORE,然后 ./configure.sh |
| 端口冲突 | 用 ss -tlnp 查看占用进程并终止,或在 env.local.sh 中修改端口后 ./configure.sh |
| 磁盘不足 | 清理 node-cleanup.sh / node-compact.sh 或旧备份 |
| 启动失败 | 查看 ./log-viewer.sh 或 tail -F /var/log/plantpulse-startup.log |
| 需要强制停止 | ./kill.sh(最后手段 — 有数据损坏风险) |
详细诊断步骤请参见 问题解决 页面。
下一步
技术支持
安装过程中需要帮助请 联系 webmaster@kopens.com。请附上 ./log-viewer.sh 的屏幕截图或 /opt/kopens/plantpulse-platform/plantpulse-startup/test/ 的验证结果,可以加快分析速度。