跳到主要内容

属性参考

本文件由部署的实际配置模板 (*.properties) 重新生成。 模板的正本为 plantpulse-datalake-cli/config/templates,主机的 /etc/kopens/conf 将被绑定挂载到该位置。哪个模板渲染到哪个位置由 config/render.map 决定。加载优先级的正本为 plantpulse-core/src/plantpulse/core/engine/utils/PropertiesUtils.java。

如果添加、删除或重命名了键,模板而非本文件为正本。请勿手动填写本文件,应从模板中重新提取。每张表中的“默认值”与模板中所写完全一致,${PP_XXX} 是渲染时被替换为环境变量值的位置。

值从何而来到何处去​

项目位置权限修改方法
秘密 — DB 密码 · API 密钥/etc/kopens/plantpulse-platform.env0600bin/passwd.sh (变更服务器账户 → 更新 Sidecar → 重新渲染 → 重启,通过单一命令执行)
本设备固有值 — PP_MASTER_IP · Kafka 广告地址 · 镜像标签固定/etc/kopens/platform.node.env0600直接编辑后 bin/restart-datalake.sh
配置 — 端口 · 镜像标签 · 语言区域 · 数据路径repo 的 .env (.env.example 提交)—直接编辑后重启
引擎配置«行» — postgresql.conf 参数, Kafka 保留, Aster TSDB 堆/etc/kopens/conf/<파일>.template—编辑模板 → pd config render → pd restart <서비스>
直接修改组件的配置文件将在下次启动时消失

pd start 每次 都会重新渲染模板并覆盖到各组件的配置位置。即便打开并修改 cassandra.yaml · postgresql.conf · kafka.properties,下次启动时也会恢复原样。应修改的是 模板 → 如何修改配置

请勿将秘密值与节点值合并到同一文件

秘密文件在分片安装时会 复制 到应用节点,而节点文件 不可复制。如果合并,单台设备的 PP_MASTER_IP 和镜像标签固定值会泄露到其他设备。格式仅限 VAR=값 一种 — 若附加 export ,env_file: 将无法解析。

模板变更标准流程​

在主机上修改值,并将其反映到容器内的 pd。

vi /etc/kopens/conf/<템플릿> # 1. 호스트의 템플릿을 고칩니다

docker exec plantpulse-datalake pd doctor # 2. 검사 (선택)
docker exec plantpulse-datalake pd config diff # 3. 무엇이 달라지는지 봅니다
docker exec plantpulse-datalake pd config render # 4. 실제로 씁니다
docker exec plantpulse-datalake pd restart <서비스> # 5. 재시작
docker exec plantpulse-datalake pd status # 6. 확인

pd config render 仅重写配置文件,不会重启服务。 在重启前,新配置仅存在于磁盘中,旧进程仍在运行。因此,步骤 4 和步骤 5 必须作为一个组合执行。

配置文件加载优先级​

Web 应用程序 (server / batch / cep / sql / data-gateway) 按以下顺序查找配置文件。实现逻辑为 PropertiesUtils.readExternalFirst()。

  1. 通过 -Dpp.conf.dir 系统属性指定的目录 (常量 PropertiesUtils.CONF_DIR_SYSTEM_PROPERTY = "pp.conf.dir")
  2. ${catalina.base}/../config — 模块的 config/ 目录
  3. WebApp 类路径 (包含在 WAR 中的默认值) — fallback

外部文件以 UTF-8 格式读取。外部配置正常加载时,启动日志将输出以下内容:

Properties loaded from external conf: <absolute-path>

若读取外部文件失败,将记录 error 日志并回退至类路径。

日志配置 (log4j2.xml) 同样通过此链条外部化 (自播种 — 若无外部文件,则将 WAR 默认值复制一次到模块 config/log4j2.xml 后使用)。应用时启动日志将输出 Logging reconfigured from external conf: <absolute-path>。日志级别变更在修改模块 config/log4j2.xml 后重启生效,并在 WAR 重新部署时予以保留。详见配置及部署指南。

注意: 请勿直接修改 WebApp 内部文件 (server/webapps/ROOT/WEB-INF/classes/ 等) — 重新部署 WAR 时会消失。

${ENV:기본값} 替换在两个时间点发生​

模板中的 ${PP_XXX} / ${PP_XXX:기본값} 标记在 两个时间点 被解析。

时间点主体动作
启动时pd config render替换为 Sidecar (plantpulse-platform.env · platform.node.env) 和容器环境。顺序为:环境变量 → :기본값 → 保持原样。不支持嵌套 placeholder
运行时PropertiesUtils.resolveEnvPlaceholders针对加载的 Properties 的 所有值 重新解析 ${ENV_VAR[:default]}

即部署后残留的 ${...} 也可以被进程的环境变量填充。这就是 Docker -e VAR=... 注入优先于模板默认值的原因。

Sidecar 中不存在的 PP_* 变量 (直接应用模板默认值)​

以下变量由模板作为 ${PP_XXX:기본값} 引用,但 Sidecar 文件 未定义。因此,若无单独注入,将始终使用模板默认值。

PP_EXTERNAL_DB_PASSWORD · PP_MAIL_SMTP_HOST · PP_MAIL_SMTP_PORT · PP_MAIL_SMTP_AUTH · PP_MAIL_SMTP_USER · PP_MAIL_SMTP_PASSWORD · PP_MAIL_SMTP_STARTTLS · PP_DIAGNOSTIC_EMAIL

PP_AI_* 曾在此列表中,但 现在不执行任何操作

即使提供 PP_AI_OPENAI_* · PP_AI_MCP_* · PP_AI_CHAT_ENABLED,也将被 静默忽略。读取这些值的层级已于 2026-09-18 移除 — 请参阅 AI 配置。

PP_STORAGE_PASSWORD · PP_METASTORE_PASSWORD 曾在此列表中,但属于«不存在的变量»

模板和 Sidecar 均不引用该名称。实际名称如下 —

项目实际变量
时序存储 (Aster TSDB) 连接PP_CASSANDRA_HOST · PP_CASSANDRA_PORT · PP_CASSANDRA_USER · 🔑 PP_CASSANDRA_PASSWORD
元数据存储 (PostgreSQL) 连接PP_POSTGRES_HOST · PP_POSTGRES_PORT · PP_PG_USER · 🔑 PP_PG_PASSWORD

🔴 PP_MAIL_SMTP_* 也 不再执行任何操作。邮件配置的正本为 pp.mm_config,值在控制台 (/config/index) 或其表格中修改 — 邮件配置。此次迁移是为了确保必须统一的一组值 (主机 · 端口 · 认证启用 · 账户) 仅在单一位置修改。

服务器管理配置 5 种​

由 ConfigTemplates.SERVER_CONFIGS 数组定义,并通过 plantpulse-server/config/ 部署的配置文件共有 5 个。

#模板部署路径
1plantpulse-engine.properties/plantpulse-server/config/plantpulse-engine.properties
2plantpulse-storage.properties/plantpulse-server/config/plantpulse-storage.properties
3plantpulse-mq.properties/plantpulse-server/config/plantpulse-mq.properties

这三个文件由 PropertiesLoader.load() 一次性读取 (engine/mq/storage),并重新构建 Typed 配置 Bean EngineConfig · StorageConfig · MqConfig。

邮件 · AI 配置并非文件 — pp.mm_config 为正本

plantpulse-mail.properties 和 plantpulse-ai.properties 已于 2026-09-17 删除,而将外部配置目录中残留的旧副本读取并迁移到表格的路径也于 2026-09-18 全部移除。也就是说,即使创建该文件,也 不会读取任何内容。

值的输入路径仅有 控制台和 PostgreSQL pp.mm_config 两种。键名称和默认值的正本位于代码的 MailConfigKeys · AiConfigKeys,表中不存在的键将读取其默认值 — 以下两节的键表依然有效。

application.properties (已移除)​

application.properties 已于 2026.06 移除。目前没有读取此文件的代码 (全仓库使用次数为 0),原项目已迁移至以下位置:

  • 主题 / 首页等控制台行为配置 → 控制台 系统 > 配置管理 (PostgreSQL mm_config 表)
  • alarm.duplicate.check.minutes → plantpulse-engine.properties 系列 (EngineConfig 读取)

plantpulse-engine.properties​

路径: plantpulse-server/config/plantpulse-engine.properties · 模板: template/plantpulse-engine.properties

控制数据处理引擎的核心行为。

异步 / 流水线​

属性默认值替换说明 (模板注释)
engine.async.parallelism256—Async worker pool parallelism (total cores ~= 256)
engine.pipeline.threads36—流水线线程数
engine.pipeline.ratelimit40000—流水线每秒处理上限 (rate limit)
engine.pipeline.queue.size1200000—流水线队列大小 (背压极限)
engine.pipeline.queue.o3.delay50—允许乱序 (out-of-order) 数据的延迟 (ms)
engine.pipeline.task.modeSINGLE—任务执行模式 (SINGLE / PARALLEL)

NTP​

属性默认值替换说明
engine.ntpdate.server.ip127.0.0.1—NTP 服务器 IP
engine.ntpdate.syncfalse—启动时是否执行 NTP 同步

流 / CEP​

属性默认值替换说明
engine.stream.processorDIRECT—流处理模式 (DIRECT/BUFFERED)
engine.cep.server.ip127.0.0.1${PP_CEP_HOST:127.0.0.1}CEP 服务器 IP
engine.cep.server.port7400${PP_CEP_CONNECT_PORT:7400}CEP 服务器端口 (根据 protocol 自动对齐: http → 7400, https → 7401)
engine.cep.server.protocolhttp${PP_CEP_PROTOCOL:http}CEP 协议。内部通信默认为 http,分布式/容器为 https
engine.cep.server.api.key(无)${PP_CEP_API_KEY}CEPClient X-API-Key 标头用。必须与 CEP 服务器 cep.api.key 一致

流消息传递​

属性默认值替换说明
engine.streaming.messaging.warning.ms5000—消息传递延迟警告 (ms)
engine.streaming.messaging.timeout.ms10000—消息传递超时 (ms)
engine.streaming.messaging.timeout.store.typeFILE_QUEUE—超时消息保存方式 (FILE_QUEUE/MEMORY)
engine.streaming.messaging.timeout.recovery.typeDB—超时消息恢复源 (DB/FILE)

作业工作线程​

属性默认值替换说明
engine.job.thread.asset8—资产作业线程数
engine.job.thread.point8—数据点作业线程数

DDS​

属性默认值替换说明
engine.dds.enabledtrue—DDS 全局启用
engine.dds.data.tag.enabledtrue—标签数据 DDS 发布
engine.dds.data.asset.enabledtrue—资产数据 DDS 发布

异常检测 / 数据流​

属性默认值替换说明
engine.data.anomaly.enabledfalse—启用异常检测 (联动外部服务)
engine.data.anomaly.urlhttps://127.0.0.1:8970—异常检测服务 URL
engine.dataflow.classplantpulse.core.engine.pipeline.dataflow.BaseDataFlow—数据流实现类
engine.dataflow.server-timestamp.overridefalse—是否强制服务器时间戳 (true: 采集时刻, false: 原始值)
engine.dataflow.negative-timestamp.overridetrue—是否修正负数时间戳
engine.factory.model.updater.classplantpulse.core.engine.model.impl.DefaultFactoryMetaModelUpdater—工厂元模型更新器
engine.event.handler.classplantpulse.core.engine.event.DefaultEventHanlder—事件处理器实现 (类名错别字 Hanlder 仍按实际类名处理)
engine.javagc.enabledfalse—是否允许显式调用 System.gc()

Flow 引擎​

属性默认值替换说明
flow.debug.execution.logfalse—节点执行 INFO 日志。仅在调试会话中设为 true
flow.stats.prune.interval.ms86400000—计数器清理执行周期 (ms, 24小时)。由于 Aster TSDB 计数器表不支持 default_time_to_live,因此在应用层清理
flow.stats.prune.hourly.days30—tm_flow_stats_hourly 的 hour_bucket 保留天数
flow.stats.prune.daily.days90—tm_flow_stats_daily 的 day_bucket 保留天数
flow.health.check.interval.ms600000—Flow 健康检查周期 (ms, 10分钟)。当前时间桶 errors > 0 则为 ERROR,否则为 NORMAL (基于 KST)
flow.webhook.api.keydev-webhook-19ba7a54-1132-49f2-967e-3c6f5cd989a0${PP_FLOW_WEBHOOK_API_KEY:...}Flow 引擎外部 Webhook 认证

Flow 健康检查使用的 Aster TSDB 表:tm_flow_health_status(flow_id, hour_bucket — 当前时刻累加器), tm_flow_health_status_10m(flow_id, min10_bucket — 10分钟单位时序)。

Edge 健康检查​

属性默认值替换说明
edge.health.check.interval.ms600000—Edge 健康检查周期 (ms, 10分钟)

判定源为 Aster TSDB tm_edge_status payload 的 _ON / _NORMAL 标志。由于无需 RT REST 调用,负载为 0 且在 1 秒内完成。表为 tm_edge_health_status(edge_id, hour_bucket), tm_edge_health_status_10m(edge_id, min10_bucket)。

认证 / 安全​

属性默认值替换说明
api.key(无)${PP_API_KEY}平台内部 API 密钥 (服务器 ↔ Edge Agent 认证)
engine.api.v5.auth.bruteforce.enabledtrue—V5 API 认证暴力破解防御
engine.api.v5.auth.bruteforce.ip_limit30—每 IP 尝试上限
engine.api.v5.auth.bruteforce.user_limit10—每用户尝试上限
engine.api.v5.auth.bruteforce.window.seconds60—计数窗口 (秒)
engine.api.v5.trusted_proxies(空值)—可信代理 IP 白名单。仅在配置时,若 remoteAddr 在此列表中,则将 X-Forwarded-For 的第一个 IP 用作 client IP。若为空,则仅使用 getRemoteAddr() (fail-safe)
engine.session.bruteforce.enabledtrue—/login/login 浏览器会话暴力破解防御
engine.session.bruteforce.ip_limit30—每 IP 尝试上限
engine.session.bruteforce.user_limit10—每用户尝试上限
engine.session.bruteforce.window.seconds300—计数窗口 (秒)

会话暴力破解计数器采用 Caffeine 内存存储 — 未实现多节点共享 (Redis)。

API 令牌​

属性默认值替换说明
engine.api.token.cleanup.enabledtrue—过期 (expires_at < now)/撤销 (revoked_at IS NOT NULL) 令牌清理
engine.api.token.cleanup.retention_days30—超过此期限后从 mm_token 中 hard delete。每 24 小时执行一次 (启动 60 秒后首次执行)
engine.api.token.default_ttl_days90—发行新令牌时的 默认 过期时间 (日)。0 = 永久令牌。若发行请求提供 ttl_days,则该值优先 → 发行 API 令牌

原 expires_at 为 NULL 的令牌将保持永久激活 (向下兼容)。


plantpulse-storage.properties​

路径: plantpulse-server/config/plantpulse-storage.properties · 模板: template/plantpulse-storage.properties

管理元数据存储 (PostgreSQL) · 缓存 (Valkey) · 时序存储 (Aster TSDB) · TSE · Data Gateway 连接及存储策略。

⚠️ 本文件中确实存在错别字键。 3 个键的拼写与代码读取的不一致 — 请务必阅读 错别字键警告 节。

PostgreSQL 元数据存储​

属性默认值替换说明
metastore.driverorg.postgresql.Driver—JDBC 驱动类
metastore.urljdbc:postgresql://...${PP_POSTGRES_HOST} · ${PP_POSTGRES_PORT} · ${PP_DB_NAME}元数据存储 JDBC URL。包含查询字符串 ?characterEncoding=UTF-8&reWriteBatchedInserts=true
metastore.user—${PP_PG_USER}元数据存储账户
metastore.password—${PP_PG_PASSWORD}元数据存储密码

缓存 (Valkey / Redis 兼容)​

属性默认值替换说明
cache.host—${PP_REDIS_HOST}缓存主机
cache.port—${PP_REDIS_PORT}缓存端口 (内部 plaintext Valkey backend)
cache.password—${PP_REDIS_PASSWORD}缓存密码
cache.ssl.enabledfalse—缓存 TLS。内部客户端默认为 redis://
cache.ssl.truststore.location/var/security/plantpulse/master/master.truststore.p12—Truststore 路径
cache.ssl.truststore.passwordkopens123!${PP_TLS_TRUSTSTORE_PASSWORD:kopens123!}Truststore 密码
cache.ssl.truststore.typePKCS12—Truststore 类型
cache.ssl.endpoint.identification.enabledfalse—端点身份验证

键常量正本为 plantpulse-inmemory 的 InMemoryConfigKeys。

TSE (TimeSeries Engine)​

属性默认值替换说明
tse.protocolhttp${PP_TSE_PROTOCOL:http}TSE 协议。内部通信,默认为明文 http (2026-08)
tse.host—${PP_TSE_HOST}TSE 主机
tse.port7800${PP_TSE_CONNECT_PORT:7800}TSE 端口。明文监听器默认为 7800
tse.usertse${PP_TSE_USER:tse}TSE 账户
tse.passwordtse123!${PP_TSE_PASSWORD:tse123!}TSE 密码

Aster TSDB 时序存储​

属性默认值替换说明
storage.db_typeCASSANDRA—DB 类型。模板注释中虽残留 CASSANDRA/DSE/SCYLLADB,但 目前支持的值仅有 CASSANDRA
storage.db_version5.0—并非服务器版本,而是«功能兼容级别» — 详见下方注释
storage.host—${PP_CASSANDRA_HOST}contact point 主机
storage.db_version 为 5.0,而 nodetool version 显示为 6.0.0

两者均正确。它们指向的不是同一个东西。

值项目
storage.db_version5.0决定驱动程序 使用哪套功能集通信 的兼容级别
实际捆绑服务器6.0.0apache-cassandra-timeseries-6.0.0.jar — cassandra-6.0 的公司内部 Fork

请勿根据 5.0 认为「服务器版本是 5.0」。关于服务器的信息请参阅 时序数据库。 请勿随意将此值提升至 6.0 — 这将改变驱动程序的行为。

| storage.port | 9042 | ${PP_STORAGE_PORT:9042} | native 协议端口 | | storage.keyspace | — | ${PP_KEYSPACE} | 使用的 keyspace | | storage.user | — | ${PP_CASSANDRA_USER} | 连接账户 | | storage.password | cassandra | ${PP_STORAGE_PASSWORD:cassandra} | 密码。PP_STORAGE_PASSWORD 在 env.sh 中未 export → 应用默认值 | | storage.durable_writes | true | — | 是否使用 commit log (⚠️ 无读取代码 — 见下方) | | storage.append_columns | [] | — | 自动添加用户定义列 | | storage.replication | { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 } | — | 复制策略 (默认为单节点) | | storage.data.disk.name | — | ${PP_DATA_DISK_NAME} | 数据磁盘名称 |

TTL (单位: 日)​

属性默认值说明
storage.tag.point.ttl62标签时序原始数据
storage.tag.point.map.ttl1标签点映射
storage.tag.point.sampling.ttl93标签采样
storage.tag.point.snapshot.ttl93标签快照
storage.tag.point.aggregation.ttl93标签聚合
storage.tag.point.archive.ttl365标签归档 (长期保留)
storage.tag.blob.ttl93标签 BLOB
storage.asset.data.ttl10资产数据
storage.asset.data.sampling.ttl31资产采样

资产快照周期​

属性默认值说明
storage.asset.data.snapshot.interval10 SECONDS每个周期前将资产的标签映射 (data_map) 记录在 asset_data 系列 (data/second/timestamp + 分/时/日边界)

模板注释说明了依据:1 SECONDS 在以资产 121 为基准时,每分钟约 22K 次写入 (占 Aster TSDB 整体约 4%),导致过载。由于标签原始数据 (秒级) 已在 tm_tag_point/TSE 中完全保留,因此将资产视图快照降低至 10s (与代码默认值一致) — 写入量减少 90%,同时保持记录完整性。

此值为调度器的 ASSET_DATA_JOB 周期。必须符合 "<n> <unit>" 2 令牌格式,规则请参考调度器架构。

内部元数据存储同步 (实验性)​

属性默认值说明
storage.internal.metastore.enabledfalse启用内部元数据存储同步
storage.internal.metastore.thread.count4同步工作线程数
storage.internal.metastore.queue.size12000000同步队列大小
storage.internal.metastore.point.retation.days10数据点保留天数 (⚠️ 错别字键 — 见下方)

行缓存​

属性默认值说明
storage.asset.data.row.cache.sizeNONE资产数据行缓存 (NONE/ROWS_ONLY/ALL) — ⚠️ 无读取代码
storage.tag.point.row.cache.sizeNONE标签点行缓存 — ⚠️ 无读取代码

Compaction​

属性默认值说明
storage.table.compaction.strategyUCS默认策略 (TWCS: TimeWindow, UCS: Unified)。由 CassandraCreateDAO 读取 (代码 fallback 为 TWCS)
storage.table.compaction.strategy.twcs.window_size1TWCS 窗口大小 — ⚠️ 无读取代码
storage.table.compaction.strategy.twcs.window_unitDAYSTWCS 窗口单位 — ⚠️ 无读取代码
storage.table.compaction.strategy.ucs.scailing_parameterT8UCS 缩放参数 (T8 = tiered 8 levels)。键拼写 scailing 与代码一致
storage.table.compaction.strategy.ucs.min_sstable_size128MiBUCS 最小 sstable 大小 (代码 fallback 100MiB)
storage.table.compaction.strategy.ucs.target_sstable_size512MiBUCS 目标 sstable 大小
storage.table.compaction.strategy.ucs.base_shard_count8UCS 基础分片数
storage.table.compaction.strategy.ucs.max_sstables_to_compact6单次 compaction 最大 sstable 数
storage.table.compaction.strategy.ucs.sstable_growth0.7UCS sstable 增长比率

压缩 / 查询限制 / 备份 / Data Gateway​

属性默认值替换说明
storage.compresion.zstd.level3—zstd 压缩级别 (1~22) — ⚠️ 错别字键, 见下方
storage.tag.point.select.limit.size1000000—单标签点 select 最大行数
storage.doamin.model.changed.to.metastore.backuptrue—域模型变更时的元数据存储备份 — ⚠️ 错别字键 + 无读取代码
data.gateway.protocolhttp${PP_DATA_GATEWAY_PROTOCOL:http}Data Gateway 协议
data.gateway.host127.0.0.1${PP_DATA_GATEWAY_HOST:127.0.0.1}Data Gateway 主机 (前提为本地同居)
data.gateway.port5500${PP_DATA_GATEWAY_CONNECT_PORT:5500}Data Gateway 端口 (代码 fallback 5501)
data.gateway.api.key—${PP_DATA_GATEWAY_API_KEY}Data Gateway API 密钥

⚠️ 错别字键 — 编辑亦被忽略​

模板中实际存在的以下 3 个键 与代码读取的拼写不一致。即便管理员修改这些行的值,也会 被静默忽略并应用代码默认值。

模板中的键 (错别字)代码实际读取的键代码默认值读取位置
storage.compresion.zstd.levelstorage.compression.zstd.level3StorageConfig → CassandraCreateDAO
storage.internal.metastore.point.retation.daysstorage.internal.metastore.point.retention.days10StorageConfig → PointDAO
storage.doamin.model.changed.to.metastore.backup无 (正确拼写也没有读取代码)——

若要实际更改值,请在同一文件中添加代码正确拼写的键。 例如,若要将 zstd 级别提高到 6,必须添加 storage.compression.zstd.level=6 (而非修改错别字键,而是 添加正确拼写的行)。保留错别字行无害,但修改模板本身才是根本解决方法。

storage.doamin.model.changed.to.metastore.backup 没有任何拼写被代码读取。域模型变更时的备份由 MetastoreBackupDeployer (cron 0 0 12 1 1/1 ? *, 每月 1 日 12:00) 负责 — 详见调度器架构。

模板中不存在但代码读取的 storage 键​

属性代码默认值说明
storage.compression.zstd.typeZstdCompressor压缩类名称

无读取代码的 storage 模板键 (编辑无效)​

storage.durable_writes · storage.asset.data.row.cache.size · storage.tag.point.row.cache.size · storage.table.compaction.strategy.twcs.window_size · storage.table.compaction.strategy.twcs.window_unit (+ 上述 3 个错别字键)

即便将与 TWCS 相关的两个键更改为 storage.table.compaction.strategy=TWCS,也无法控制窗口大小/单位。


plantpulse-mq.properties​

路径: plantpulse-server/config/plantpulse-mq.properties · 模板: template/plantpulse-mq.properties

管理 Kafka / MQTT Broker 连接及 DDS 发布主题。代码侧 SSOT 为 MqConfig (连接) 和 UNSTopicDefaults (主题)。

Broker 连接​

属性默认值替换说明
mq.host—${PP_KAFKA_HOST}Broker 主机 (Kafka/MQTT 共用)
mq.user—${PP_MQ_USER}Broker 管理账户
mq.password—${PP_MQ_PASSWORD}Broker 密码
mq.kafka.port9092${PP_KAFKA_PORT:9092}Kafka 端口
mq.kafka.security.protocolSASL_PLAINTEXT—Kafka 安全协议
mq.ssl.truststore.location/var/security/plantpulse/master/master.truststore.p12—消息 TLS Truststore (MQTT + 可选 Kafka TLS)
mq.ssl.truststore.passwordkopens123!${PP_TLS_TRUSTSTORE_PASSWORD:kopens123!}Truststore 密码
mq.ssl.truststore.typePKCS12—Truststore 类型
mq.ssl.endpoint.identification.algorithm(空值)—主机名验证算法 (空值 = 不验证)
mq.mqtt.port—${PP_MQTT_TLS_PORT}MQTT 连接端口
mq.mqtt.ssl.enabledtrue—使用 MQTT TLS

MqConfig 除上述键外,还会读取 Kafka 专用 Truststore 覆盖项 mq.kafka.ssl.truststore.location / .password / .type 和 mq.kafka.ssl.endpoint.identification.algorithm (模板中不存在,若无则使用 mq.ssl.*)。

DDS 主题​

Kafka 14 种 (mq.dds.kafka.topic.*) + MQTT UNS 14 种 (mq.dds.mqtt.topic.*) + SparkplugB 2 种 (mq.dds.mqtt.sparkplugb.*)。

全部键和默认值已在 消息架构 → DDS 发布主题 中整理。主题值为 Kafka/MQTT 线缆协议,且由 UNSTopicDefaultsContractTest 冻结字面量,严禁随意变更。

${PP_TOPIC_PREFIX} 同时决定 Kafka 主题前缀 (pp-)、MQTT UNS 路径根目录 (pp/) 及 SparkplugB 组 ID。


邮件配置 (pp.mm_config)​

正本: PostgreSQL pp.mm_config · 键正本: plantpulse.core.config.MailConfigKeys。 读取端为 SMTPMailSender.loadMailConfig()。

🔴 PP_MAIL_* 环境变量亦不执行任何操作

与 AI 相同 — plantpulse-mail.properties 和 ${PP_MAIL_*} 替换层已于 2026-09-17~18 移除。即使通过 Sidecar 或 docker run -e 提供,也将 被静默忽略。值应填入控制台的 配置界面 (/config/index) 或 pp.mm_config 表中。

配置键默认值说明
MAIL_SEND_ENABLEDfalse主发送闸门。 若关闭,则不建立 SMTP 连接直接跳过,仅记录 WARN
MAIL_SMTP_HOSTsmtp-relay.brevo.comSMTP 转发地址
MAIL_SMTP_PORT587587 = STARTTLS, 465 = 隐式 TLS (与 MAIL_SMTP_SSL_ENABLE 配合)
MAIL_SMTP_AUTHtrue是否 SMTP 登录。即使开启,若 MAIL_SMTP_USER 为空则不登录
MAIL_SMTP_USER(空值)SMTP 账户。由于是转发商颁发的名称,可能与发信地址不同。 可留空保存
🔑 MAIL_SMTP_PASSWORD(空值)SMTP 密码或 API 密钥。若在登录转发商处留空,认证将被拒绝
MAIL_SMTP_STARTTLS_ENABLEtrue587 端口是否升级为 STARTTLS
MAIL_SMTP_SSL_ENABLEfalse是否像 465 一样从一开始就使用 TLS。此情况下关闭 starttls
MAIL_SMTP_CONNECTIONTIMEOUT10000连接超时 (ms)。若无,JavaMail 默认值为「无限等待」
MAIL_SMTP_TIMEOUT10000读取超时 (ms)。〃
MAIL_SMTP_WRITETIMEOUT10000写入超时 (ms)。〃
MAIL_FROM(空值)发信地址。 若留空则使用 MAIL_SMTP_USER,但转发账户名通常非有效地址,可能被接收方拒绝 — 请填写实际地址
sms.sender.classplantpulse.core.service.support.alarm.sms.DefaultSMSSenderSMS 发送器实现 FQN。若填写不存在的类,将回退至默认实现

TLS 仅使用 1.3 · 1.2 并检查服务器证书名称。

默认值中不再包含 SMTP 凭据

MAIL_SMTP_USER · MAIL_SMTP_PASSWORD 的默认值为 空值。由于 MAIL_SEND_ENABLED 为默认 false,在运营人员开启前不会尝试发送。

使用 Gmail SMTP 转发发送​

Google Workspace 的 SMTP 转发 (smtp-relay.gmail.com) 可通过发信服务器的 IP 地址授权。此时无需账户,故不进行登录。首先在 Google 管理控制台的 SMTP 转发设置中注册本服务器的对外 IP。

配置键值
MAIL_SEND_ENABLEDtrue
MAIL_SMTP_HOSTsmtp-relay.gmail.com
MAIL_SMTP_PORT587
MAIL_SMTP_AUTHfalse
MAIL_SMTP_USER(留空)
MAIL_SMTP_STARTTLS_ENABLEtrue
MAIL_SMTP_SSL_ENABLEfalse
MAIL_FROMWorkspace 域名的实际地址

保存后点击配置界面的 重新应用。

报警邮件​

  • 邮件头部包含产品 Logo (CID 内联图像)。即使没有控制台地址也能显示,无需外部获取。
  • 邮件位置行 从站点开始 填写 (站点 → 区域 → 线路 → 设备,不包含企业)。
  • «前往确认报警» 链接为 PP_UI_CONSOLE_URL (<콘솔 주소>/alarm/view/<알람 번호>)。若为空,邮件照常发送,仅移除链接 — 地址设置。
diagnostic.log.email 已消失

由于没有任何读取代码,已从表中 移除 (产品测试防止该键再次进入)。即使残留,亦不执行任何操作。


AI 配置 (pp.mm_config)​

正本: PostgreSQL pp.mm_config · 键正本: plantpulse.core.config.AiConfigKeys。 读取端为 AiConfig (+ AiConfig.mcpSettings())。

🔴 PP_AI_* 环境变量 不执行任何操作

旧的 plantpulse-ai.properties 已于 2026-09-17 删除,读取该文件的路径以及 ${PP_AI_*} 替换层 亦于 2026-09-18 一并移除。现在若通过 Sidecar 或 docker run -e 提供 PP_AI_OPENAI_ENABLED 等名称,将被 静默忽略 — 无错误也无警告。

产品之所以不为了「以防万一»而保留这些名称,是因为被忽略的名称 比不存在的名称更糟糕。它会让服务器看起来像是已经配置好了。

设置值的路径仅有两条 — 控制台配置界面 (/env),或直接修改 pp.mm_config 表。不存在行的键将读取下表的默认值,填入值后才会创建该行。

LLM 网关​

属性默认值说明
ai.llm.enabledfalseAI 总开关。 若关闭,则关闭所有 AI 界面和端点
ai.llm.base.urlhttps://api.openai.comOpenAI 兼容网关 (LiteLLM/vLLM)。末尾不附加 /
ai.llm.chat.path/v1/chat/completions仅在网关使用其他路径时修改
ai.llm.responses.path/v1/responses〃
🔑 ai.llm.api.key(空值)网关密钥。若留空,调用将被 401 拒绝
ai.llm.modelgpt-5-mini网关暴露的模型名称。修改 base.url 时 此项亦同步修改
ai.llm.timeout.ms60000LLM 调用超时 (ms)
ai.llm.max.output.tokens4000响应最大令牌数
ai.llm.temperature-1为负数则在请求中完全省略,使用模型默认值
旧名称 ai.openai.* 不再被读取

前缀已变更为 ai.llm.。即便 pp.mm_config 中残留 ai.openai.base.url 行,由于无读取代码,将使用默认值 (https://api.openai.com) — 导致 虽然配置了网关,但请求仍流向 OpenAI 且失败。升级安装后请检查这些行。

ai.llm.temperature 为何默认值为负数

gpt-5 系列不支持 temperature,发送默认值 1 以外的值会导致 400 Unsupported value。因此,默认设置为表示「不发送»的负数。仅在 LiteLLM/vLLM 后使用其他模型时,将其提高至 0 以上。

功能开关​

🔴 默认值已于 2026-09-16 变更。 界面上保留的 AI 功能仅有 聊天一个,其余均已被产品下线。若将值还原为 true,功能虽能恢复,但该界面在当前版本中 未经验证。

属性默认值说明
ai.chat.enabledtrueAI 聊天控制台 — 界面上保留的 AI 功能仅此一项
ai.chat.history.ttl.days90聊天历史保留(日)。通过 Cassandra TTL 应用,重启后从«新»消息起生效
ai.alarm.rca.enabledfalse报警 RCA — 开启后在报警详情中附加 AI 原因分析
ai.alarm.eql.enabledfalse报警 EQL 助手 — 开启后在报警设置表单中附加草案按钮
ai.uns.topic.enabledfalseUNS 主题说明 — 开启后在 UNS 树中附加说明面板
ai.result.audit.enabledfalseAI 结果审计 — 无界面的 RCA 内部组件。 开启 RCA 时同步开启
ai.similar.incident.enabledfalse相似故障证据采集 — 〃
ai.similar.incident.max.items5作为证据承载的相似故障最大条数
ai.similar.incident.min.score40认可为相似故障的最低分数
2026-08 消失的 6 个键

ai.diagnostic.summary.* 3 个 (诊断日志 AI 摘要) 和 ai.operations.report.* 3 个 (AI 运营报告) 已于 2026-08-25 从产品中移除。由于界面 · JS · 控制器均已清理,还原值也无法使功能复活。残留亦无影响 — 无读取代码。

MCP​

🔴 MCP 与 ai.llm.enabled «独立»。 它并非为界面设计,而是 面向外部客户端,因此即使网关关闭,/api/v5/mcp 依然开放。详情参阅 MCP 服务器。

属性默认值说明
AI_MCP_ENABLEDtrue若为 false,则 /api/v5/mcp 返回 404
AI_MCP_ALLOWED_ORIGINS(空值)浏览器 Origin 白名单 (逗号分隔)。若留空,则拒绝所有浏览器请求,仅允许原生客户端
AI_MCP_TREE_MAX_NODES2000树响应节点上限 — 依赖于模型上下文窗口,模型增大时相应提高
AI_MCP_TREE_DEFAULT_DEPTH2树查询默认深度
AI_MCP_TREE_MAX_NODE_TAGS100单个节点承载的标签数上限
AI_MCP_TREE_ONTOLOGY_MAX_CHARS200000本体响应字符数上限
AI_MCP_TREE_ONTOLOGY_DEFAULT_DEPTH3比树默认深度深一层 — 必须到达承载标签数的设备节点,才能在默认响应中回答「该设备有多少个标签»
AI_MCP_TREE_ONTOLOGY_MAX_TAGS500本体响应 整体 的标签行预算 (与节点上限独立)。单个精简标签约为 85B,承载整个站点将占用上下文窗口的 33~56%

其他模板​

template/ 中除上述 5 种外,还包含应用 · 基础设施配置模板。部署路径映射正本为 ConfigTemplates.java。

模板部署路径用途
plantpulse-batch.properties/plantpulse-batch/config/Batch (时序同步/聚合)
plantpulse-cep.properties/plantpulse-cep/config/CEP 引擎
plantpulse-jdbc.properties/plantpulse-data-gateway/config/JDBC 综合配置
plantpulse-data-gateway.properties/plantpulse-data-gateway/config/Data Gateway 行为
plantpulse-warehouse.properties/plantpulse-warehouse/config/Aster TSDB → Iceberg(S3) 归档
plantpulse-datalake-admin-api.properties/plantpulse-datalake-admin-api/config/管理控制台 API · JMX 采集
plantpulse-plugin-opcua.properties/plantpulse-plugin/opc-ua/config/OPC UA 服务器插件
plantpulse-plugin-aas.properties/plantpulse-plugin/aasx-server/config/AAS V3 (aasx-server) 插件
kafka.properties/plantpulse-messaging/kafka/config/kafka.propertiesKafka(KRaft) Broker
kafka-jaas.conf/plantpulse-messaging/kafka/config/jaas.confKafka JAAS
hivemq.xml/plantpulse-messaging/mqtt/conf/config.xmlHiveMQ Broker
plantpulse-mq-auth.properties/plantpulse-messaging/mqtt/conf/auth.propertiesHiveMQ 认证源
hive-auth.properties/plantpulse-analytics/spark/conf/Hive/分析账户认证源
plantpulse-timeseries-engine.conf/plantpulse-timeseries/engine/conf/ (2处)TSE
valkey.conf · postgresql.conf · pg_hba.conf · cassandra.yaml · jvm-server.options/plantpulse-storage/...存储
spark-env.sh · spark-defaults.conf · hive-site.xml · kyuubi-defaults.conf · gravitino-iceberg-rest-server.conf/plantpulse-analytics/...分析
workflow.yaml · application.yaml/plantpulse-workflow/...Temporal / Kestra

plantpulse-websocket.properties 亦不存在。 无 WebSocket/STOMP 系列配置文件。 template/cluster/ 为工作节点专用覆盖项 — 修改 master 模板时需同步修改此处。

plantpulse-batch.properties​

由连接块 (平台/元数据存储/缓存/TSE/Kafka/Aster TSDB/Spark) 和 Batch 行为配置组成。注意连接键与 storage/jdbc 名称不同 — 例如:Aster TSDB 为 storage.db.host / storage.db.port / storage.db.keyspace (server 为 storage.host / storage.port / storage.keyspace)。

属性默认值说明
platform.host${PP_MASTER_IP}平台 (server-web) 主机
mq.port9092Kafka 端口 (字面量 — 非替换)
kafka.topicpp-batchBatch 入口主题
kafka.group.idPP-BATCH-GROUPBatch 消费者组
batch.timer_schedule_delay5000Batch 定时周期 (ms)
batch.thread_pool_batch_thread_size4Batch 工作线程数
batch.buffer_drain_limit_size10000单次清空最大条数
batch.sync.inmemory.enabledfalse内存同步
batch.sync.inmemory.ttl.minute10内存同步 TTL (分)
batch.sync.tse.enabledtrue分配至 TSE
batch.sync.external.db.enabledfalse外部 DB 同步
external.db.nameTIMESCALEDB外部 DB 类型。INFLUXDB/QUESTDB 块在模板中处于 注释状态
analytics.urljdbc:spark://${PP_SPARK_HOST}:${PP_KYUUBI_PORT}/defaultSpark Thrift JDBC

plantpulse-cep.properties​

属性默认值说明
cep.backendaster启动的后端 (aster · flink)。其他值将导致启动失败 — 后端
cep.aster.state.enabledtrue将 Aster CEP 规则状态 (窗口 · 聚合 · 进行中模式) 保存在 cache.* Redis。键为 PP:CEP:ASTER-STATE:<문장>
cep.aster.state.snapshot_interval_ms60000快照周期 — 崩溃时可能丢失的最大状态。正常停止会拍摄最后一次快照后退出
cep.async.core_pool_size32异步核心池
cep.async.max_pool_size256异步最大池
cep.async.queue_capacity50000异步队列
cep.async.keep_alive_seconds60线程 keep-alive
cep.async.shutdown_timeout_seconds30优雅关机 (graceful shutdown) 等待
cep.consumer.thread_count16消费者线程
cep.stream.shard_count16流分片数
cep.stream.drain_limit_size1000排水 (drain) 上限
cep.stream.drain_warn_ms1000排水警告 (ms)
cep.monitor.initial_delay_seconds5监控首次延迟
cep.monitor.interval_seconds1监控周期
cep.monitor.store_interval_seconds60指标 Aster TSDB 保存周期
cep.api.key${PP_CEP_API_KEY}EQL 管理端点认证 (X-API-Key)
cep.api.max_eql_text_length100000EQL 文本最大长度 (DoS 防御)
cep.storage.request_timeout_seconds10Aster TSDB 请求超时
cep.storage.connect_max_retries3连接重试
cep.storage.ttl_seconds864000指标 TTL (秒, 10日)
cep.stream.pending_idle_threshold_ms60000pending 空闲阈值
cep.stream.cleaner_initial_delay_ms60000清理程序首次延迟
cep.stream.cleaner_interval_ms10000清理周期
cep.stream.max_clean_duration_ms30000清理最大耗时
cep.stream.cleaner_max_claim_count5000申领最大条数
cep.stream.ack_chunk_size500ACK 块大小
cep.stream.max_deliveries3仅在交付次数达到此值且仍未处理时,事件才被发送至死信队列
cep.stream.dead_letter.retention_ms86400000死信保留时长 (24小时)
cep.stream.dead_letter.max_bytes268435456死信字节预算 (256 MiB, 所有分片总计)。超过后按分片时间顺序截断

plantpulse-jdbc.properties​

外部 JDBC 客户端 (SQL 模块 · Data Gateway) 的综合连接配置。前缀为 jdbc.<tech> (postgres/cassandra/spark/tse)。

属性值说明
jdbc.postgres.driverorg.postgresql.DriverMETA / PQL
jdbc.postgres.urljdbc:postgresql://${PP_POSTGRES_HOST}:${PP_POSTGRES_PORT}/${PP_DB_NAME}?characterEncoding=UTF-8
jdbc.cassandra.driverplantpulse.cassandra.jdbc.CassandraDriverOLTP 时序 (CQL)。驱动值仅用于配置一致性 (功能上未使用)
jdbc.cassandra.urljdbc:cassandra://${PP_CASSANDRA_HOST}:${PP_CASSANDRA_PORT}/${PP_SCHEME}
jdbc.tse.driverplantpulse.timeseries.tql.TQLDriverOTAP / TQL
jdbc.tse.urljdbc:ts://${PP_TSE_HOST}:${PP_TSE_PORT}/${PP_SCHEME}⚠️ 固定为 plain http(ts/7800)
jdbc.spark.driverplantpulse.spark.jdbc.SparkSQLDriverOLAP 分析
jdbc.spark.urljdbc:spark://${PP_SPARK_HOST}:${PP_KYUUBI_PORT}/default/${PP_SCHEME}
data.gateway.api.key${PP_DATA_GATEWAY_API_KEY}JDBC 调用认证用

⚠️ 请勿将 jdbc.tse.url 更改为 https(tss/7801)。 TQL JDBC 驱动使用明文 TSE 监听器 (7800)。TSE 客户端全局默认使用明文 http/7800 (2026-08, env.sh TSE 节)。若设为 tss/7801,将导致 JDBC 连接失败 → data-gateway 启动失败 → /api/v1/* 全部 404 → analytics 目录 404。因此,已通过 ts/PP_TSE_PORT 固定。

jdbc.spark.username 为分析专用账户 ${PP_ANALYTICS_USER}。与 Kyuubi 内部元数据存储账户 (PP_HIVE_*) 分离。 可选择使用键 jdbc.<tech>.pool.initial|min|max (postgres/spark/tse), jdbc.<tech>.query.timeout|fetch-size (全部参考见 plantpulse-jdbc/docs/configuration.md)。 jdbc.cassandra.local-datacenter 在模板中处于注释状态,未设置时为 datacenter1。

plantpulse-data-gateway.properties​

属性默认值说明
data.gateway.api.key${PP_DATA_GATEWAY_API_KEY:ADFA-URDV-QWED-1234}API 认证密钥 (必需)。dev 默认值在交付时更换
data.gateway.rate.limit1000每秒最大请求数 (基于 IP + API 密钥)
data.gateway.slow.query.ms10000慢查询警告阈值 (ms)
data.gateway.slow.update.ms2000慢更新警告阈值 (ms)
data.gateway.async.timeout.ms60000异步超时 (ms)

plantpulse-datalake-admin-api.properties​

以单节点 (type=MASTER) 为基准的各服务 JMX/管理端点集合。该文件是唯一一个键名使用 下划线 (_) 而非点 (.) 的文件。

属性默认值说明
typeMASTER单节点或集群主节点
db_typeCASSANDRA监控对象 DB 类型
master / host${PP_MASTER_IP} / ${PP_HOST_IP}主节点 / 本主机
db_host · db_port · db_keyspace · db_username · db_password · db_replication_factor${PP_CASSANDRA_*} · 9042 · ${PP_SCHEME} · 1Aster TSDB 连接
tse_host · tse_port · tse_protocol · tse_username · tse_password${PP_TSE_*} · 7801 · https · tse · tse123!TSE 连接 (指标加载)
kafka_jmx_uriservice:jmx:rmi:///jndi/rmi://${PP_KAFKA_HOST}:7299/jmxrmiKafka JMX
mqtt_jmx_uri...://${PP_MQTT_HOST}:7279/jmxrmiHiveMQ JMX
cep_jmx_uri...://${PP_HOST_IP}:6499/jmxrmiCEP JMX
datagateway_jmx_uri...://${PP_HOST_IP}:7499/jmxrmiData Gateway JMX
sql_jmx_uri...://${PP_HOST_IP}:7599/jmxrmiSQL JMX
tse_jmx_uri...://${PP_HOST_IP}:7899/jmxrmiTSE JMX
cassandra_jmx_uri...://${PP_CASSANDRA_HOST}:7199/jmxrmiAster TSDB JMX
spark_jmx_uri...://${PP_SPARK_HOST}:10010/jmxrmiSpark JMX
redis_jmx_uriredis://${PP_REDIS_HOST}:${PP_REDIS_PORT}?password=...Valkey 连接 URI
redis_ssl_truststore_location / _password / _type / redis_ssl_endpoint_identification_enabledp12 · ${PP_TLS_TRUSTSTORE_PASSWORD:kopens123!} · PKCS12 · falseValkey TLS
postgres_jmx_urijdbc:postgresql://.../${PP_DB_NAME}?user=...&password=...PostgreSQL 连接 URI

JMX 端口汇总: HiveMQ 7279, Kafka 7299, CEP 6499, Data Gateway 7499, SQL 7599, TSE 7899, Aster TSDB 7199, Spark 10010。

plantpulse-warehouse.properties​

Aster TSDB → Iceberg(S3) 归档 Batch。本文件是唯一一个 键名为大写蛇形 (SNAKE_CASE, UPPER_SNAKE) 的文件。

组主要键默认值
TemporalTEMPORAL_SERVER · TEMPORAL_TASK_QUEUE · TEMPORAL_WORKFLOW_ID · TEMPORAL_SCHEDULE_ID · OPTIMIZER_SCHEDULE_ID · OPTIMIZER_WORKFLOW_ID${PP_TEMPORAL_HOST}:${PP_TEMPORAL_PORT} · PP-S3-QUEUE · PP-S3-ARCHIVER-DAILY-WORKFLOW · PP-S3-ARCHIVER-DAILY · PP-S3-OPTIMIZER-WEEKLY · PP-S3-OPTIMIZER-WEEKLY-WORKFLOW
调度DAILY_HOUR · DAILY_MINUTE · OPTIMIZER_DAY_OF_WEEK · OPTIMIZER_HOUR · OPTIMIZER_MINUTE · TIMEZONE2 · 20 · 0(星期日) · 3 · 0 · ${PP_TZ}
执行模式ARCHIVER_MODESHELL (或 KESTRA)
KestraKESTRA_SERVER · KESTRA_NAMESPACE · KESTRA_TASK_ID · KESTRA_USER · KESTRA_PASS${PP_KESTRA_HOST}:${PP_KESTRA_PORT} · plantpulse · plantpulse-daily-s3-archiver · admin@plantpulse.io · (空值)
脚本S3_SCRIPT_DIR · S3_SCRIPT_NAME · S3_OPTIMIZER_SCRIPT_NAME${PP_HOME}/plantpulse-warehouse/s3 · archive.sh · optimize.sh
SparkSPARK_APP_NAME · SPARK_MASTER · SPARK_JAR_PATH · SPARK_DRIVER_MEMORY · SPARK_EXECUTOR_MEMORY · SPARK_EXECUTOR_CORES · SPARK_NUM_EXECUTORS · ARCHIVER_PARALLELISM · SPARK_CHECKPOINT_DIRPP-SPARK-S3-LAKEHOUSE · local[*] · .../plantpulse-warehouse-s3.jar · 2g · 4g · 4 · 3 · 4 · s3a://${PP_S3_BUCKET:-plantpulse}/spark-checkpoint/
源/目标CASSANDRA_CATALOG · CASSANDRA_DATABASE · S3_BUCKET · ICEBERG_CATALOG · ICEBERG_DATABASEcassandra · ${PP_SCHEME:pp} · ${PP_S3_BUCKET:-plantpulse} · spark_catalog · ${PP_SCHEME:pp}
优化SNAPSHOT_RETENTION_DAYS · OPTIMIZER_MIN_INPUT_FILES · OPTIMIZER_TARGET_FILE_SIZE_BYTES3 · 10 · 134217728 (128MB)
超时ARCHIVER_WF_EXECUTION/RUN/TASK_TIMEOUT_HOURS · OPTIMIZER_WF_EXECUTION/RUN/TASK_TIMEOUT_HOURS · ACTIVITY_MAX_ATTEMPTS · ACTIVITY_TIMEOUT_HOURS · OPTIMIZER_ACTIVITY_TIMEOUT_HOURS · SCRIPT_TIMEOUT_SECONDS · OPTIMIZER_TIMEOUT_SECONDS · HEARTBEAT_INTERVAL_SECONDS12/12/12 · 8/7/12 · 3 · 12 · 8 · 21600(6h) · 25200(7h) · 60
WebWEB_SERVER_PORT9600

消息 / 认证源模板​

plantpulse-mqtt.properties — HiveMQ Broker 配置。

属性默认值
mqtt.host · mqtt.user · mqtt.password${PP_MQTT_HOST} · ${PP_MQ_USER} · ${PP_MQ_PASSWORD}
mqtt.port · mqtt.ssl.enabled${PP_MQTT_TLS_PORT} · true
mqtt.websocket_port8888
mqtt.data_dir/data1/pp-data/hivemq

plantpulse-mq-auth.properties — HiveMQ security extension (FileAuthAuthenticator) 通过 HIVEMQ_AUTH_FILE 环境变量指向的认证源。键仅有 mqtt.user / mqtt.password 两种。

hive-auth.properties — 由 plantpulse-hive-auth (PasswordAuthenticator) 读取。读取 HIVE_AUTH_FILE 环境变量或 $PP_HOME/plantpulse-analytics/spark/conf/hive-auth.properties。特点是键名称本身就是 placeholder。

${PP_HIVE_USER}=${PP_HIVE_PASSWORD}
${PP_ANALYTICS_USER}=${PP_ANALYTICS_PASSWORD}

kafka.properties — KRaft 模式 Kafka Broker。主要值:process.roles=broker,controller, node.id=1, num.partitions=4, 3 种监听器 (SASL_PLAINTEXT/CONTROLLER/SASL_SSL), sasl.enabled.mechanisms=PLAIN, super.users=User:admin, allow.everyone.if.no.acl.found=false, log.dirs=${PP_DATA_DIR}/kafka/kraft_combined_logs, log.retention.ms=3600000 (1 小时), message.max.bytes=157286400, default.replication.factor=1, auto.create.topics.enable=true。

⚠️ log.retention.ms=3600000 = 1 小时。 前提是 Kafka 仅作缓冲,持久化由 Aster TSDB/TSE 承担。若消费者停机超过 1 小时,数据将丢失。

插件模板​

plantpulse-plugin-opcua.properties — PostgreSQL / Aster TSDB / Valkey / Kafka 连接 + OPC UA 服务器端点。

属性默认值说明
kafka.topicpp-tag-point⚠️ 字面量 — 非 ${PP_TOPIC_PREFIX} 替换
kafka.thread · kafka.group.id8 · opcua-plugin-group
opc.ua.server.domain · opc.ua.server.port${PP_HOST_IP} · 8007
opc.ua.server.user · password · anonymousopcua · 설치-시-변경 · false
opc.ua.server.tcp.port · tls.port${PP_OPCUA_TCP_PORT:11004} · ${PP_OPCUA_TLS_PORT:11005}
redis.thread · redis.ssl.enabled4 · false

plantpulse-plugin-aas.properties — AAS V3 服务器 + Kafka 消费配置。

属性默认值说明
aas.v3.port${PP_AAS_V3_PORT:8090}V3 HTTP 端口
kafka.topic${PP_TOPIC_PREFIX}-tag-point实时标签点接收
kafka.thread · kafka.poll.count8 · 1000
group.id · auto.offset.reset · enable.auto.commitpp-plugin-aas-server · earliest · false
session.timeout.ms · auto.commit.interval.ms30000 · 1000
plugin.message.listenerplantpulse.plugin.opcua.messaging.KafkaPluginMessageListener

BaSyx V2 的 registry/AAS 端口 非配置项,而是代码硬编码 — AASServer.java 的 REGISTRY_PORT=4800, AAS_PORT=4801。


模板中不存在但代码读取的引擎键​

EngineConfig 还会读取以下键。由于模板 (plantpulse-engine.properties) 中不存在,平时应用代码默认值,若需变更值,必须在 plantpulse-server/config/plantpulse-engine.properties 中 直接添加行。

Edge 时钟 / 状态轮询​

属性代码默认值
edge.clock.poll.term.sec60
edge.clock.skew.threshold.ms10000
edge.clock.rtt.max.ms2000
edge.clock.autosync.enabledtrue
edge.clock.autosync.cooldown.ms600000
edge.clock.warn.cooldown.ms600000
edge.clock.skip.warn.count5
edge.status.poll.seconds30
edge.status.poll.jitter.max.ms3000

edge.clock.poll.term.sec 和 edge.status.poll.seconds 决定调度作业周期 — 值约束请参考调度器架构的 Edge 节。

DDS / 事件总线 / 推送 / 缓冲​

属性代码默认值
engine.dds.queue.size80000
engine.dds.worker.threads4
engine.dds.latency.warn.ms1000
engine.eventbus.queue.capacity65536
engine.push.threads4
engine.push.queue.size10000
engine.storage.buffer.typeKAFKA
engine.streaming.timeout.backup.queue.capacity12000000

engine.dds.enabled · engine.dds.data.tag.enabled · engine.dds.data.asset.enabled 的 代码默认值为 false。由于模板明确指定为 true,因此仅在部署版中开启 — 删除这三行将导致 DDS 静默关闭。

作业线程 (模板未列出部分)​

属性代码默认值
engine.job.thread.oee10
engine.job.thread.ram5
engine.job.thread.ems5
engine.job.thread.system4
engine.job.asset.slow.threshold.ms20000

⚠️ engine.job.thread.point 的代码默认值为 4,但模板为 8 (engine.job.thread.asset 两端均为 8)。删除模板行将导致值下降一半。

Flow 引擎 (模板未列出部分)​

属性代码默认值
flow.engine.enabledtrue
flow.executor.parallelism64
flow.executor.queue.capacity10000
flow.executor.queue.size10000
flow.executor.poll.timeout.ms50
flow.scheduler.pool.size4
flow.timer.pool.size2
flow.jdbc.trigger.pool.size2
flow.shutdown.timeout.sec5
flow.enabled.cache.ttl.ms5000
flow.webhook.auth.enabledtrue

报警 / ISO 指标 / OEE​

属性代码默认值
alarm.duplicate.check.minutes10
engine.oee.debounce.ms100
iso.oee.rolling.window.minutes10
iso.ems.rolling.window.minutes10
iso.ram.rolling.window.minutes1440

异常检测详情 (资产点 / 系统)​

仅在通过 engine.data.anomaly.enabled=true 开启时有意义。

属性代码默认值
engine.data.anomaly.asset.point.intervalMINUTE
engine.data.anomaly.asset.point.lookback.minutes14400
engine.data.anomaly.asset.point.recent.seconds600
engine.data.anomaly.asset.point.limit2100
engine.data.anomaly.asset.point.context.length2048
engine.data.anomaly.asset.point.prediction.length96
engine.data.anomaly.asset.point.score.history60
engine.data.anomaly.asset.point.threshold.k3.5
engine.data.anomaly.asset.point.threshold.min0.80
engine.data.anomaly.asset.point.threshold.max0.98
engine.data.anomaly.asset.point.topk.request5
engine.data.anomaly.asset.point.topn.report5
engine.data.anomaly.system.lookback.minutes1440
engine.data.anomaly.system.recent.seconds60
engine.data.anomaly.system.limit2100
engine.data.anomaly.system.context.length2048
engine.data.anomaly.system.pred.length96
engine.data.anomaly.system.threshold.min0.80
engine.data.anomaly.system.topk2

不存在的配置​

以下名称出现在旧文档或外部资料中,但 不存在于模板或代码中。以此名称添加配置将没有任何效果。

寻找项实际位置
storage.postgresql.*metastore.driver / metastore.url / metastore.user / metastore.password
storage.redis.*cache.host / cache.port / cache.password / cache.ssl.*
storage.cassandra.*storage.host / storage.port / storage.keyspace / storage.user / storage.password
storage.tse.*tse.protocol / tse.host / tse.port / tse.user / tse.password
storage.ttl.realtime 等按表 storage.tag.point.ttl / storage.asset.data.ttl 等 (TTL 节)
storage.compression.enable / .algorithmstorage.compression.zstd.level / storage.compression.zstd.type (模板行为错别字 — 错别字键警告)
storage.compaction.enable / .schedulestorage.table.compaction.strategy 系列 (Compaction 节)
storage.metastore.* / storage.cache.*无
mq.type / mq.kafka.bootstrap.servers / mq.kafka.group.idmq.host + mq.kafka.port。消费者组非配置项,而是 代码常量 (PP-KAFKA-POINT-GROUP 等, 消息架构)
在文件中 mail.*仅在 pp.mm_config 处 (2026-09-17 迁移, 文件已删除)
websocket.* / plantpulse-websocket.properties无。 STOMP/WebSocket 于 2026-07 退役,浏览器推送使用 SSE (/push/sse) — 消息架构
scheduler.enabled / scheduler.thread.count / scheduler.misfire.* / scheduler.history.*无。 Quartz 配置在 plantpulse-server-web/src/quartz.properties (WAR 类路径) — 调度器架构
engine.ntp.enable / engine.ntp.serverengine.ntpdate.sync / engine.ntpdate.server.ip
engine.cep.enable / engine.cep.host / engine.cep.portengine.cep.server.ip / engine.cep.server.port / engine.cep.server.protocol
engine.anomaly.*engine.data.anomaly.*
engine.dds.enable / engine.dds.topic.prefixengine.dds.enabled, 主题前缀在 PP_TOPIC_PREFIX (mq 模板)
engine.async.queue.size / engine.async.timeout / engine.pipeline.batch.size / engine.timeout.* / engine.dataflow.threads / engine.dataflow.buffer.size无
PP_STOMP_* / PP_WEBSOCKET_* env 变量不在 env.sh 中

包含密码的属性​

这些值在交付前必须更换。dev 明文默认值为 env.sh (或模板) 的 placeholder,在运营/客户交付时,应更改为客户专用值,或通过 Docker -e VAR=... / export 覆盖。

文件键
plantpulse-storage.propertiesmetastore.password · cache.password · cache.ssl.truststore.password · storage.password · tse.password · data.gateway.api.key
plantpulse-engine.propertiesapi.key · flow.webhook.api.key · engine.cep.server.api.key
plantpulse-mq.propertiesmq.password · mq.ssl.truststore.password
pp.mm_config (邮件)mail.smtp.password
pp.mm_config (AI)ai.llm.api.key — 不为旧名称 ai.openai.* 提供回退
plantpulse-cep.propertiescache.password · storage.password · cep.api.key
plantpulse-batch.propertiesmetastore.password · cache.password · tse.password · mq.password · storage.db.password · analytics.password · external.db.password
plantpulse-jdbc.propertiescache.password · jdbc.postgres.password · jdbc.cassandra.password · jdbc.tse.password · jdbc.spark.password · data.gateway.api.key
plantpulse-data-gateway.propertiesdata.gateway.api.key
plantpulse-datalake-admin-api.propertiesdb_password · tse_password · redis_jmx_uri (URL 内密码) · redis_ssl_truststore_password · postgres_jmx_uri (URL 内密码)
plantpulse-mqtt.properties · plantpulse-mq-auth.propertiesmqtt.password
plantpulse-plugin-opcua.propertiespostgres.password · cassandra.password · redis.password · kafka.password · opc.ua.server.password
plantpulse-plugin-aas.propertiesaas.db.password · cassandra.password · kafka.password
kafka.propertiesssl.keystore.password · ssl.key.password · ssl.truststore.password
hive-auth.properties全值均为密码

API 密钥策略: PP_API_KEY · PP_DATA_GATEWAY_API_KEY · PP_FLOW_WEBHOOK_API_KEY · PP_CEP_API_KEY 设为 dev 明文默认值回退 (${VAR:-<dev-default>}) — 旨在使 dev/测试无需额外注入秘密即可启动·部署。请勿更改为 hardfail (:?) — 这会导致 restart-server.sh 在 source env.sh 时立即终止,从而导致部署失败。

建议措施​

秘密不应写在配置文件中。应汇总至单个 Sidecar 文件,设为 0600。

ls -l /etc/kopens/plantpulse-platform.env # 비밀 — 0600, repo 밖
ls -l /etc/kopens/platform.node.env # 이 박스 고유 값 — 0600

# 값을 바꿀 때는 파일을 열지 말고 도구를 씁니다
cd /opt/kopens/plantpulse-platform-docker
bin/passwd.sh --list # 바꿀 수 있는 키
bin/passwd.sh PP_PG_PASSWORD # 서버 계정 변경 → 사이드카 → 재렌더 → 재시작

渲染后的配置文件包含替换完成后的值,因此请勿将该文件提交至存储库。