属性参考
本文件由部署的实际配置模板 (
*.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.env | 0600 | bin/passwd.sh (变更服务器账户 → 更新 Sidecar → 重新渲染 → 重启,通过单一命令执行) |
本设备固有值 — PP_MASTER_IP · Kafka 广告地址 · 镜像标签固定 | /etc/kopens/platform.node.env | 0600 | 直接编辑后 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()。
- 通过
-Dpp.conf.dir系统属性指定的目录 (常量PropertiesUtils.CONF_DIR_SYSTEM_PROPERTY = "pp.conf.dir") ${catalina.base}/../config— 模块的config/目录- 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 个。
| # | 模板 | 部署路径 |
|---|---|---|
| 1 | plantpulse-engine.properties | /plantpulse-server/config/plantpulse-engine.properties |
| 2 | plantpulse-storage.properties | /plantpulse-server/config/plantpulse-storage.properties |
| 3 | plantpulse-mq.properties | /plantpulse-server/config/plantpulse-mq.properties |
这三个文件由 PropertiesLoader.load() 一次性读取 (engine/mq/storage),并重新构建 Typed 配置 Bean EngineConfig · StorageConfig · MqConfig。
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.parallelism | 256 | — | Async worker pool parallelism (total cores ~= 256) |
engine.pipeline.threads | 36 | — | 流水线线程数 |
engine.pipeline.ratelimit | 40000 | — | 流水线每秒处理上限 (rate limit) |
engine.pipeline.queue.size | 1200000 | — | 流水线队列大小 (背压极限) |
engine.pipeline.queue.o3.delay | 50 | — | 允许乱序 (out-of-order) 数据的延迟 (ms) |
engine.pipeline.task.mode | SINGLE | — | 任务执行模式 (SINGLE / PARALLEL) |
NTP
| 属性 | 默认值 | 替换 | 说明 |
|---|---|---|---|
engine.ntpdate.server.ip | 127.0.0.1 | — | NTP 服务器 IP |
engine.ntpdate.sync | false | — | 启动时是否执行 NTP 同步 |
流 / CEP
| 属性 | 默认值 | 替换 | 说明 |
|---|---|---|---|
engine.stream.processor | DIRECT | — | 流处理模式 (DIRECT/BUFFERED) |
engine.cep.server.ip | 127.0.0.1 | ${PP_CEP_HOST:127.0.0.1} | CEP 服务器 IP |
engine.cep.server.port | 7400 | ${PP_CEP_CONNECT_PORT:7400} | CEP 服务器端口 (根据 protocol 自动对齐: http → 7400, https → 7401) |
engine.cep.server.protocol | http | ${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.ms | 5000 | — | 消息传递延迟警告 (ms) |
engine.streaming.messaging.timeout.ms | 10000 | — | 消息传递超时 (ms) |
engine.streaming.messaging.timeout.store.type | FILE_QUEUE | — | 超时消息保存方式 (FILE_QUEUE/MEMORY) |
engine.streaming.messaging.timeout.recovery.type | DB | — | 超时消息恢复源 (DB/FILE) |
作业工作线程
| 属性 | 默认值 | 替换 | 说明 |
|---|---|---|---|
engine.job.thread.asset | 8 | — | 资产作业线程数 |
engine.job.thread.point | 8 | — | 数据点作业线程数 |
DDS
| 属性 | 默认值 | 替换 | 说明 |
|---|---|---|---|
engine.dds.enabled | true | — | DDS 全局启用 |
engine.dds.data.tag.enabled | true | — | 标签数据 DDS 发布 |
engine.dds.data.asset.enabled | true | — | 资产数据 DDS 发布 |
异常检测 / 数据流
| 属性 | 默认值 | 替换 | 说明 |
|---|---|---|---|
engine.data.anomaly.enabled | false | — | 启用异常检测 (联动外部服务) |
engine.data.anomaly.url | https://127.0.0.1:8970 | — | 异常检测服务 URL |
engine.dataflow.class | plantpulse.core.engine.pipeline.dataflow.BaseDataFlow | — | 数据流实现类 |
engine.dataflow.server-timestamp.override | false | — | 是否强制服务器时间戳 (true: 采集时刻, false: 原始值) |
engine.dataflow.negative-timestamp.override | true | — | 是否修正负数时间戳 |
engine.factory.model.updater.class | plantpulse.core.engine.model.impl.DefaultFactoryMetaModelUpdater | — | 工厂元模型更新器 |
engine.event.handler.class | plantpulse.core.engine.event.DefaultEventHanlder | — | 事件处理器实现 (类名错别字 Hanlder 仍按实际类名处理) |
engine.javagc.enabled | false | — | 是否允许显式调用 System.gc() |
Flow 引擎
| 属性 | 默认值 | 替换 | 说明 |
|---|---|---|---|
flow.debug.execution.log | false | — | 节点执行 INFO 日志。仅在调试会话中设为 true |
flow.stats.prune.interval.ms | 86400000 | — | 计数器清理执行周期 (ms, 24小时)。由于 Aster TSDB 计数器表不支持 default_time_to_live,因此在应用层清理 |
flow.stats.prune.hourly.days | 30 | — | tm_flow_stats_hourly 的 hour_bucket 保留天数 |
flow.stats.prune.daily.days | 90 | — | tm_flow_stats_daily 的 day_bucket 保留天数 |
flow.health.check.interval.ms | 600000 | — | Flow 健康检查周期 (ms, 10分钟)。当前时间桶 errors > 0 则为 ERROR,否则为 NORMAL (基于 KST) |
flow.webhook.api.key | dev-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.ms | 600000 | — | 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.enabled | true | — | V5 API 认证暴力破解防御 |
engine.api.v5.auth.bruteforce.ip_limit | 30 | — | 每 IP 尝试上限 |
engine.api.v5.auth.bruteforce.user_limit | 10 | — | 每用户尝试上限 |
engine.api.v5.auth.bruteforce.window.seconds | 60 | — | 计数窗口 (秒) |
engine.api.v5.trusted_proxies | (空值) | — | 可信代理 IP 白名单。仅在配置时,若 remoteAddr 在此列表中,则将 X-Forwarded-For 的第一个 IP 用作 client IP。若为空,则仅使用 getRemoteAddr() (fail-safe) |
engine.session.bruteforce.enabled | true | — | /login/login 浏览器会话暴力破解防御 |
engine.session.bruteforce.ip_limit | 30 | — | 每 IP 尝试上限 |
engine.session.bruteforce.user_limit | 10 | — | 每用户尝试上限 |
engine.session.bruteforce.window.seconds | 300 | — | 计数窗口 (秒) |
会话暴力破解计数器采用 Caffeine 内存存储 — 未实现多节点共享 (Redis)。
API 令牌
| 属性 | 默认值 | 替换 | 说明 |
|---|---|---|---|
engine.api.token.cleanup.enabled | true | — | 过期 (expires_at < now)/撤销 (revoked_at IS NOT NULL) 令牌清理 |
engine.api.token.cleanup.retention_days | 30 | — | 超过此期限后从 mm_token 中 hard delete。每 24 小时执行一次 (启动 60 秒后首次执行) |
engine.api.token.default_ttl_days | 90 | — | 发行新令牌时的 默认 过期时间 (日)。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.driver | org.postgresql.Driver | — | JDBC 驱动类 |
metastore.url | jdbc: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.enabled | false | — | 缓存 TLS。内部客户端默认为 redis:// |
cache.ssl.truststore.location | /var/security/plantpulse/master/master.truststore.p12 | — | Truststore 路径 |
cache.ssl.truststore.password | kopens123! | ${PP_TLS_TRUSTSTORE_PASSWORD:kopens123!} | Truststore 密码 |
cache.ssl.truststore.type | PKCS12 | — | Truststore 类型 |
cache.ssl.endpoint.identification.enabled | false | — | 端点身份验证 |
键常量正本为 plantpulse-inmemory 的 InMemoryConfigKeys。
TSE (TimeSeries Engine)
| 属性 | 默认值 | 替换 | 说明 |
|---|---|---|---|
tse.protocol | http | ${PP_TSE_PROTOCOL:http} | TSE 协议。内部通信,默认为明文 http (2026-08) |
tse.host | — | ${PP_TSE_HOST} | TSE 主机 |
tse.port | 7800 | ${PP_TSE_CONNECT_PORT:7800} | TSE 端口。明文监听器默认为 7800 |
tse.user | tse | ${PP_TSE_USER:tse} | TSE 账户 |
tse.password | tse123! | ${PP_TSE_PASSWORD:tse123!} | TSE 密码 |
Aster TSDB 时序存储
| 属性 | 默认值 | 替换 | 说明 |
|---|---|---|---|
storage.db_type | CASSANDRA | — | DB 类型。模板注释中虽残留 CASSANDRA/DSE/SCYLLADB,但 目前支持的值仅有 CASSANDRA |
storage.db_version | 5.0 | — | 并非服务器版本,而是«功能兼容级别» — 详见下方注释 |
storage.host | — | ${PP_CASSANDRA_HOST} | contact point 主机 |
storage.db_version 为 5.0,而 nodetool version 显示为 6.0.0两者均正确。它们指向的不是同一个东西。
| 值 | 项目 | |
|---|---|---|
storage.db_version | 5.0 | 决定驱动程序 使用哪套功能集通信 的兼容级别 |
| 实际捆绑服务器 | 6.0.0 | apache-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.ttl | 62 | 标签时序原始数据 |
storage.tag.point.map.ttl | 1 | 标签点映射 |
storage.tag.point.sampling.ttl | 93 | 标签采样 |
storage.tag.point.snapshot.ttl | 93 | 标签快照 |
storage.tag.point.aggregation.ttl | 93 | 标签聚合 |
storage.tag.point.archive.ttl | 365 | 标签归档 (长期保留) |
storage.tag.blob.ttl | 93 | 标签 BLOB |
storage.asset.data.ttl | 10 | 资产数据 |
storage.asset.data.sampling.ttl | 31 | 资产采样 |
资产快照周期
| 属性 | 默认值 | 说明 |
|---|---|---|
storage.asset.data.snapshot.interval | 10 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.enabled | false | 启用内部元数据存储同步 |
storage.internal.metastore.thread.count | 4 | 同步工作线程数 |
storage.internal.metastore.queue.size | 12000000 | 同步队列大小 |
storage.internal.metastore.point.retation.days | 10 | 数据点保留天数 (⚠️ 错别字键 — 见下方) |
行缓存
| 属性 | 默认值 | 说明 |
|---|---|---|
storage.asset.data.row.cache.size | NONE | 资产数据行缓存 (NONE/ROWS_ONLY/ALL) — ⚠️ 无读取代码 |
storage.tag.point.row.cache.size | NONE | 标签点行缓存 — ⚠️ 无读取代码 |
Compaction
| 属性 | 默认值 | 说明 |
|---|---|---|
storage.table.compaction.strategy | UCS | 默认策略 (TWCS: TimeWindow, UCS: Unified)。由 CassandraCreateDAO 读取 (代码 fallback 为 TWCS) |
storage.table.compaction.strategy.twcs.window_size | 1 | TWCS 窗口大小 — ⚠️ 无读取代码 |
storage.table.compaction.strategy.twcs.window_unit | DAYS | TWCS 窗口单位 — ⚠️ 无读取代码 |
storage.table.compaction.strategy.ucs.scailing_parameter | T8 | UCS 缩放参数 (T8 = tiered 8 levels)。键拼写 scailing 与代码一致 |
storage.table.compaction.strategy.ucs.min_sstable_size | 128MiB | UCS 最小 sstable 大小 (代码 fallback 100MiB) |
storage.table.compaction.strategy.ucs.target_sstable_size | 512MiB | UCS 目标 sstable 大小 |
storage.table.compaction.strategy.ucs.base_shard_count | 8 | UCS 基础分片数 |
storage.table.compaction.strategy.ucs.max_sstables_to_compact | 6 | 单次 compaction 最大 sstable 数 |
storage.table.compaction.strategy.ucs.sstable_growth | 0.7 | UCS sstable 增长比率 |
压缩 / 查询限制 / 备份 / Data Gateway
| 属性 | 默认值 | 替换 | 说明 |
|---|---|---|---|
storage.compresion.zstd.level | 3 | — | zstd 压缩级别 (1~22) — ⚠️ 错别字键, 见下方 |
storage.tag.point.select.limit.size | 1000000 | — | 单标签点 select 最大行数 |
storage.doamin.model.changed.to.metastore.backup | true | — | 域模型变更时的元数据存储备份 — ⚠️ 错别字键 + 无读取代码 |
data.gateway.protocol | http | ${PP_DATA_GATEWAY_PROTOCOL:http} | Data Gateway 协议 |
data.gateway.host | 127.0.0.1 | ${PP_DATA_GATEWAY_HOST:127.0.0.1} | Data Gateway 主机 (前提为本地同居) |
data.gateway.port | 5500 | ${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.level | storage.compression.zstd.level | 3 | StorageConfig → CassandraCreateDAO |
storage.internal.metastore.point.retation.days | storage.internal.metastore.point.retention.days | 10 | StorageConfig → PointDAO |
storage.doamin.model.changed.to.metastore.backup | 无 (正确拼写也没有读取代码) | — | — |
若要实际更改值,请在同一文件中添加代码正确拼写的键。 例如,若要将 zstd 级别提高到 6,必须添加
storage.compression.zstd.level=6(而非修改错别字键,而是 添加正确拼写的行)。保留错别字行无害,但修改模板本身才是根本解决方法。
storage.doamin.model.changed.to.metastore.backup没有任何拼写被代码读取。域模型变更时的备份由MetastoreBackupDeployer(cron0 0 12 1 1/1 ? *, 每月 1 日 12:00) 负责 — 详见调度器架构。
模板中不存在但代码读取的 storage 键
| 属性 | 代码默认值 | 说明 |
|---|---|---|
storage.compression.zstd.type | ZstdCompressor | 压缩类名称 |
无读取代码的 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.port | 9092 | ${PP_KAFKA_PORT:9092} | Kafka 端口 |
mq.kafka.security.protocol | SASL_PLAINTEXT | — | Kafka 安全协议 |
mq.ssl.truststore.location | /var/security/plantpulse/master/master.truststore.p12 | — | 消息 TLS Truststore (MQTT + 可选 Kafka TLS) |
mq.ssl.truststore.password | kopens123! | ${PP_TLS_TRUSTSTORE_PASSWORD:kopens123!} | Truststore 密码 |
mq.ssl.truststore.type | PKCS12 | — | Truststore 类型 |
mq.ssl.endpoint.identification.algorithm | (空值) | — | 主机名验证算法 (空值 = 不验证) |
mq.mqtt.port | — | ${PP_MQTT_TLS_PORT} | MQTT 连接端口 |
mq.mqtt.ssl.enabled | true | — | 使用 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_ENABLED | false | 主发送闸门。 若关闭,则不建立 SMTP 连接直接跳过,仅记录 WARN |
MAIL_SMTP_HOST | smtp-relay.brevo.com | SMTP 转发地址 |
MAIL_SMTP_PORT | 587 | 587 = STARTTLS, 465 = 隐式 TLS (与 MAIL_SMTP_SSL_ENABLE 配合) |
MAIL_SMTP_AUTH | true | 是否 SMTP 登录。即使开启,若 MAIL_SMTP_USER 为空则不登录 |
MAIL_SMTP_USER | (空值) | SMTP 账户。由于是转发商颁发的名称,可能与发信地址不同。 可留空保存 |
🔑 MAIL_SMTP_PASSWORD | (空值) | SMTP 密码或 API 密钥。若在登录转发商处留空,认证将被拒绝 |
MAIL_SMTP_STARTTLS_ENABLE | true | 587 端口是否升级为 STARTTLS |
MAIL_SMTP_SSL_ENABLE | false | 是否像 465 一样从一开始就使用 TLS。此情况下关闭 starttls |
MAIL_SMTP_CONNECTIONTIMEOUT | 10000 | 连接超时 (ms)。若无,JavaMail 默认值为「无限等待」 |
MAIL_SMTP_TIMEOUT | 10000 | 读取超时 (ms)。〃 |
MAIL_SMTP_WRITETIMEOUT | 10000 | 写入超时 (ms)。〃 |
MAIL_FROM | (空值) | 发信地址。 若留空则使用 MAIL_SMTP_USER,但转发账户名通常非有效地址,可能被接收方拒绝 — 请填写实际地址 |
sms.sender.class | plantpulse.core.service.support.alarm.sms.DefaultSMSSender | SMS 发送器实现 FQN。若填写不存在的类,将回退至默认实现 |
TLS 仅使用 1.3 · 1.2 并检查服务器证书名称。
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_ENABLED | true |
MAIL_SMTP_HOST | smtp-relay.gmail.com |
MAIL_SMTP_PORT | 587 |
MAIL_SMTP_AUTH | false |
MAIL_SMTP_USER | (留空) |
MAIL_SMTP_STARTTLS_ENABLE | true |
MAIL_SMTP_SSL_ENABLE | false |
MAIL_FROM | Workspace 域名的实际地址 |
保存后点击配置界面的 重新应用。
报警邮件
- 邮件头部包含产品 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.enabled | false | AI 总开关。 若关闭,则关闭所有 AI 界面和端点 |
ai.llm.base.url | https://api.openai.com | OpenAI 兼容网关 (LiteLLM/vLLM)。末尾不附加 / |
ai.llm.chat.path | /v1/chat/completions | 仅在网关使用其他路径时修改 |
ai.llm.responses.path | /v1/responses | 〃 |
🔑 ai.llm.api.key | (空值) | 网关密钥。若留空,调用将被 401 拒绝 |
ai.llm.model | gpt-5-mini | 网关暴露的模型名称。修改 base.url 时 此项亦同步修改 |
ai.llm.timeout.ms | 60000 | LLM 调用超时 (ms) |
ai.llm.max.output.tokens | 4000 | 响应最大令牌数 |
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.enabled | true | AI 聊天控制台 — 界面上保留的 AI 功能仅此一项 |
ai.chat.history.ttl.days | 90 | 聊天历史保留(日)。通过 Cassandra TTL 应用,重启后从«新»消息起生效 |
ai.alarm.rca.enabled | false | 报警 RCA — 开启后在报警详情中附加 AI 原因分析 |
ai.alarm.eql.enabled | false | 报警 EQL 助手 — 开启后在报警设置表单中附加草案按钮 |
ai.uns.topic.enabled | false | UNS 主题说明 — 开启后在 UNS 树中附加说明面板 |
ai.result.audit.enabled | false | AI 结果审计 — 无界面的 RCA 内部组件。 开启 RCA 时同步开启 |
ai.similar.incident.enabled | false | 相似故障证据采集 — 〃 |
ai.similar.incident.max.items | 5 | 作为证据承载的相似故障最大条数 |
ai.similar.incident.min.score | 40 | 认可为相似故障的最低分数 |
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_ENABLED | true | 若为 false,则 /api/v5/mcp 返回 404 |
AI_MCP_ALLOWED_ORIGINS | (空值) | 浏览器 Origin 白名单 (逗号分隔)。若留空,则拒绝所有浏览器请求,仅允许原生客户端 |
AI_MCP_TREE_MAX_NODES | 2000 | 树响应节点上限 — 依赖于模型上下文窗口,模型增大时相应提高 |
AI_MCP_TREE_DEFAULT_DEPTH | 2 | 树查询默认深度 |
AI_MCP_TREE_MAX_NODE_TAGS | 100 | 单个节点承载的标签数上限 |
AI_MCP_TREE_ONTOLOGY_MAX_CHARS | 200000 | 本体响应字符数上限 |
AI_MCP_TREE_ONTOLOGY_DEFAULT_DEPTH | 3 | 比树默认深度深一层 — 必须到达承载标签数的设备节点,才能在默认响应中回答「该设备有多少个标签» |
AI_MCP_TREE_ONTOLOGY_MAX_TAGS | 500 | 本体响应 整体 的标签行预算 (与节点上限独立)。单个精简标签约为 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.properties | Kafka(KRaft) Broker |
kafka-jaas.conf | /plantpulse-messaging/kafka/config/jaas.conf | Kafka JAAS |
hivemq.xml | /plantpulse-messaging/mqtt/conf/config.xml | HiveMQ Broker |
plantpulse-mq-auth.properties | /plantpulse-messaging/mqtt/conf/auth.properties | HiveMQ 认证源 |
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.port | 9092 | Kafka 端口 (字面量 — 非替换) |
kafka.topic | pp-batch | Batch 入口主题 |
kafka.group.id | PP-BATCH-GROUP | Batch 消费者组 |
batch.timer_schedule_delay | 5000 | Batch 定时周期 (ms) |
batch.thread_pool_batch_thread_size | 4 | Batch 工作线程数 |
batch.buffer_drain_limit_size | 10000 | 单次清空最大条数 |
batch.sync.inmemory.enabled | false | 内存同步 |
batch.sync.inmemory.ttl.minute | 10 | 内存同步 TTL (分) |
batch.sync.tse.enabled | true | 分配至 TSE |
batch.sync.external.db.enabled | false | 外部 DB 同步 |
external.db.name | TIMESCALEDB | 外部 DB 类型。INFLUXDB/QUESTDB 块在模板中处于 注释状态 |
analytics.url | jdbc:spark://${PP_SPARK_HOST}:${PP_KYUUBI_PORT}/default | Spark Thrift JDBC |
plantpulse-cep.properties
| 属性 | 默认值 | 说明 |
|---|---|---|
cep.backend | aster | 启动的后端 (aster · flink)。其他值将导致启动失败 — 后端 |
cep.aster.state.enabled | true | 将 Aster CEP 规则状态 (窗口 · 聚合 · 进行中模式) 保存在 cache.* Redis。键为 PP:CEP:ASTER-STATE:<문장> |
cep.aster.state.snapshot_interval_ms | 60000 | 快照周期 — 崩溃时可能丢失的最大状态。正常停止会拍摄最后一次快照后退出 |
cep.async.core_pool_size | 32 | 异步核心池 |
cep.async.max_pool_size | 256 | 异步最大池 |
cep.async.queue_capacity | 50000 | 异步队列 |
cep.async.keep_alive_seconds | 60 | 线程 keep-alive |
cep.async.shutdown_timeout_seconds | 30 | 优雅关机 (graceful shutdown) 等待 |
cep.consumer.thread_count | 16 | 消费者线程 |
cep.stream.shard_count | 16 | 流分片数 |
cep.stream.drain_limit_size | 1000 | 排水 (drain) 上限 |
cep.stream.drain_warn_ms | 1000 | 排水警告 (ms) |
cep.monitor.initial_delay_seconds | 5 | 监控首次延迟 |
cep.monitor.interval_seconds | 1 | 监控周期 |
cep.monitor.store_interval_seconds | 60 | 指标 Aster TSDB 保存周期 |
cep.api.key | ${PP_CEP_API_KEY} | EQL 管理端点认证 (X-API-Key) |
cep.api.max_eql_text_length | 100000 | EQL 文本最大长度 (DoS 防御) |
cep.storage.request_timeout_seconds | 10 | Aster TSDB 请求超时 |
cep.storage.connect_max_retries | 3 | 连接重试 |
cep.storage.ttl_seconds | 864000 | 指标 TTL (秒, 10日) |
cep.stream.pending_idle_threshold_ms | 60000 | pending 空闲阈值 |
cep.stream.cleaner_initial_delay_ms | 60000 | 清理程序首次延迟 |
cep.stream.cleaner_interval_ms | 10000 | 清理周期 |
cep.stream.max_clean_duration_ms | 30000 | 清理最大耗时 |
cep.stream.cleaner_max_claim_count | 5000 | 申领最大条数 |
cep.stream.ack_chunk_size | 500 | ACK 块大小 |
cep.stream.max_deliveries | 3 | 仅在交付次数达到此值且仍未处理时,事件才被发送至死信队列 |
cep.stream.dead_letter.retention_ms | 86400000 | 死信保留时长 (24小时) |
cep.stream.dead_letter.max_bytes | 268435456 | 死信字节预算 (256 MiB, 所有分片总计)。超过后按分片时间顺序截断 |
plantpulse-jdbc.properties
外部 JDBC 客户端 (SQL 模块 · Data Gateway) 的综合连接配置。前缀为 jdbc.<tech> (postgres/cassandra/spark/tse)。
| 属性 | 值 | 说明 |
|---|---|---|
jdbc.postgres.driver | org.postgresql.Driver | META / PQL |
jdbc.postgres.url | jdbc:postgresql://${PP_POSTGRES_HOST}:${PP_POSTGRES_PORT}/${PP_DB_NAME}?characterEncoding=UTF-8 | |
jdbc.cassandra.driver | plantpulse.cassandra.jdbc.CassandraDriver | OLTP 时序 (CQL)。驱动值仅用于配置一致性 (功能上未使用) |
jdbc.cassandra.url | jdbc:cassandra://${PP_CASSANDRA_HOST}:${PP_CASSANDRA_PORT}/${PP_SCHEME} | |
jdbc.tse.driver | plantpulse.timeseries.tql.TQLDriver | OTAP / TQL |
jdbc.tse.url | jdbc:ts://${PP_TSE_HOST}:${PP_TSE_PORT}/${PP_SCHEME} | ⚠️ 固定为 plain http(ts/7800) |
jdbc.spark.driver | plantpulse.spark.jdbc.SparkSQLDriver | OLAP 分析 |
jdbc.spark.url | jdbc: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.limit | 1000 | 每秒最大请求数 (基于 IP + API 密钥) |
data.gateway.slow.query.ms | 10000 | 慢查询警告阈值 (ms) |
data.gateway.slow.update.ms | 2000 | 慢更新警告阈值 (ms) |
data.gateway.async.timeout.ms | 60000 | 异步超时 (ms) |
plantpulse-datalake-admin-api.properties
以单节点 (type=MASTER) 为基准的各服务 JMX/管理端点集合。该文件是唯一一个键名使用 下划线 (_) 而非点 (.) 的文件。
| 属性 | 默认值 | 说明 |
|---|---|---|
type | MASTER | 单节点或集群主节点 |
db_type | CASSANDRA | 监控对象 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} · 1 | Aster TSDB 连接 |
tse_host · tse_port · tse_protocol · tse_username · tse_password | ${PP_TSE_*} · 7801 · https · tse · tse123! | TSE 连接 (指标加载) |
kafka_jmx_uri | service:jmx:rmi:///jndi/rmi://${PP_KAFKA_HOST}:7299/jmxrmi | Kafka JMX |
mqtt_jmx_uri | ...://${PP_MQTT_HOST}:7279/jmxrmi | HiveMQ JMX |
cep_jmx_uri | ...://${PP_HOST_IP}:6499/jmxrmi | CEP JMX |
datagateway_jmx_uri | ...://${PP_HOST_IP}:7499/jmxrmi | Data Gateway JMX |
sql_jmx_uri | ...://${PP_HOST_IP}:7599/jmxrmi | SQL JMX |
tse_jmx_uri | ...://${PP_HOST_IP}:7899/jmxrmi | TSE JMX |
cassandra_jmx_uri | ...://${PP_CASSANDRA_HOST}:7199/jmxrmi | Aster TSDB JMX |
spark_jmx_uri | ...://${PP_SPARK_HOST}:10010/jmxrmi | Spark JMX |
redis_jmx_uri | redis://${PP_REDIS_HOST}:${PP_REDIS_PORT}?password=... | Valkey 连接 URI |
redis_ssl_truststore_location / _password / _type / redis_ssl_endpoint_identification_enabled | p12 · ${PP_TLS_TRUSTSTORE_PASSWORD:kopens123!} · PKCS12 · false | Valkey TLS |
postgres_jmx_uri | jdbc: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) 的文件。
| 组 | 主要键 | 默认值 |
|---|---|---|
| Temporal | TEMPORAL_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 · TIMEZONE | 2 · 20 · 0(星期日) · 3 · 0 · ${PP_TZ} |
| 执行模式 | ARCHIVER_MODE | SHELL (或 KESTRA) |
| Kestra | KESTRA_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 |
| Spark | SPARK_APP_NAME · SPARK_MASTER · SPARK_JAR_PATH · SPARK_DRIVER_MEMORY · SPARK_EXECUTOR_MEMORY · SPARK_EXECUTOR_CORES · SPARK_NUM_EXECUTORS · ARCHIVER_PARALLELISM · SPARK_CHECKPOINT_DIR | PP-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_DATABASE | cassandra · ${PP_SCHEME:pp} · ${PP_S3_BUCKET:-plantpulse} · spark_catalog · ${PP_SCHEME:pp} |
| 优化 | SNAPSHOT_RETENTION_DAYS · OPTIMIZER_MIN_INPUT_FILES · OPTIMIZER_TARGET_FILE_SIZE_BYTES | 3 · 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_SECONDS | 12/12/12 · 8/7/12 · 3 · 12 · 8 · 21600(6h) · 25200(7h) · 60 |
| Web | WEB_SERVER_PORT | 9600 |
消息 / 认证源模板
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_port | 8888 |
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.topic | pp-tag-point | ⚠️ 字面量 — 非 ${PP_TOPIC_PREFIX} 替换 |
kafka.thread · kafka.group.id | 8 · opcua-plugin-group | |
opc.ua.server.domain · opc.ua.server.port | ${PP_HOST_IP} · 8007 | |
opc.ua.server.user · password · anonymous | opcua · 설치-시-변경 · false | |
opc.ua.server.tcp.port · tls.port | ${PP_OPCUA_TCP_PORT:11004} · ${PP_OPCUA_TLS_PORT:11005} | |
redis.thread · redis.ssl.enabled | 4 · 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.count | 8 · 1000 | |
group.id · auto.offset.reset · enable.auto.commit | pp-plugin-aas-server · earliest · false | |
session.timeout.ms · auto.commit.interval.ms | 30000 · 1000 | |
plugin.message.listener | plantpulse.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.sec | 60 |
edge.clock.skew.threshold.ms | 10000 |
edge.clock.rtt.max.ms | 2000 |
edge.clock.autosync.enabled | true |
edge.clock.autosync.cooldown.ms | 600000 |
edge.clock.warn.cooldown.ms | 600000 |
edge.clock.skip.warn.count | 5 |
edge.status.poll.seconds | 30 |
edge.status.poll.jitter.max.ms | 3000 |
edge.clock.poll.term.sec 和 edge.status.poll.seconds 决定调度作业周期 — 值约束请参考调度器架构的 Edge 节。
DDS / 事件总线 / 推送 / 缓冲
| 属性 | 代码默认值 |
|---|---|
engine.dds.queue.size | 80000 |
engine.dds.worker.threads | 4 |
engine.dds.latency.warn.ms | 1000 |
engine.eventbus.queue.capacity | 65536 |
engine.push.threads | 4 |
engine.push.queue.size | 10000 |
engine.storage.buffer.type | KAFKA |
engine.streaming.timeout.backup.queue.capacity | 12000000 |
engine.dds.enabled·engine.dds.data.tag.enabled·engine.dds.data.asset.enabled的 代码默认值为false。由于模板明确指定为true,因此仅在部署版中开启 — 删除这三行将导致 DDS 静默关闭。
作业线程 (模板未列出部分)
| 属性 | 代码默认值 |
|---|---|
engine.job.thread.oee | 10 |
engine.job.thread.ram | 5 |
engine.job.thread.ems | 5 |
engine.job.thread.system | 4 |
engine.job.asset.slow.threshold.ms | 20000 |
⚠️
engine.job.thread.point的代码默认值为4,但模板为8(engine.job.thread.asset两端均为8)。删除模板行将导致值下降一半。
Flow 引擎 (模板未列出部分)
| 属性 | 代码默认值 |
|---|---|
flow.engine.enabled | true |
flow.executor.parallelism | 64 |
flow.executor.queue.capacity | 10000 |
flow.executor.queue.size | 10000 |
flow.executor.poll.timeout.ms | 50 |
flow.scheduler.pool.size | 4 |
flow.timer.pool.size | 2 |
flow.jdbc.trigger.pool.size | 2 |
flow.shutdown.timeout.sec | 5 |
flow.enabled.cache.ttl.ms | 5000 |
flow.webhook.auth.enabled | true |
报警 / ISO 指标 / OEE
| 属性 | 代码默认值 |
|---|---|
alarm.duplicate.check.minutes | 10 |
engine.oee.debounce.ms | 100 |
iso.oee.rolling.window.minutes | 10 |
iso.ems.rolling.window.minutes | 10 |
iso.ram.rolling.window.minutes | 1440 |
异常检测详情 (资产点 / 系统)
仅在通过 engine.data.anomaly.enabled=true 开启时有意义。
| 属性 | 代码默认值 |
|---|---|
engine.data.anomaly.asset.point.interval | MINUTE |
engine.data.anomaly.asset.point.lookback.minutes | 14400 |
engine.data.anomaly.asset.point.recent.seconds | 600 |
engine.data.anomaly.asset.point.limit | 2100 |
engine.data.anomaly.asset.point.context.length | 2048 |
engine.data.anomaly.asset.point.prediction.length | 96 |
engine.data.anomaly.asset.point.score.history | 60 |
engine.data.anomaly.asset.point.threshold.k | 3.5 |
engine.data.anomaly.asset.point.threshold.min | 0.80 |
engine.data.anomaly.asset.point.threshold.max | 0.98 |
engine.data.anomaly.asset.point.topk.request | 5 |
engine.data.anomaly.asset.point.topn.report | 5 |
engine.data.anomaly.system.lookback.minutes | 1440 |
engine.data.anomaly.system.recent.seconds | 60 |
engine.data.anomaly.system.limit | 2100 |
engine.data.anomaly.system.context.length | 2048 |
engine.data.anomaly.system.pred.length | 96 |
engine.data.anomaly.system.threshold.min | 0.80 |
engine.data.anomaly.system.topk | 2 |
不存在的配置
以下名称出现在旧文档或外部资料中,但 不存在于模板或代码中。以此名称添加配置将没有任何效果。
| 寻找项 | 实际位置 |
|---|---|
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 / .algorithm | storage.compression.zstd.level / storage.compression.zstd.type (模板行为错别字 — 错别字键警告) |
storage.compaction.enable / .schedule | storage.table.compaction.strategy 系列 (Compaction 节) |
storage.metastore.* / storage.cache.* | 无 |
mq.type / mq.kafka.bootstrap.servers / mq.kafka.group.id | mq.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.server | engine.ntpdate.sync / engine.ntpdate.server.ip |
engine.cep.enable / engine.cep.host / engine.cep.port | engine.cep.server.ip / engine.cep.server.port / engine.cep.server.protocol |
engine.anomaly.* | engine.data.anomaly.* |
engine.dds.enable / engine.dds.topic.prefix | engine.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.properties | metastore.password · cache.password · cache.ssl.truststore.password · storage.password · tse.password · data.gateway.api.key |
plantpulse-engine.properties | api.key · flow.webhook.api.key · engine.cep.server.api.key |
plantpulse-mq.properties | mq.password · mq.ssl.truststore.password |
pp.mm_config (邮件) | mail.smtp.password |
pp.mm_config (AI) | ai.llm.api.key — 不为旧名称 ai.openai.* 提供回退 |
plantpulse-cep.properties | cache.password · storage.password · cep.api.key |
plantpulse-batch.properties | metastore.password · cache.password · tse.password · mq.password · storage.db.password · analytics.password · external.db.password |
plantpulse-jdbc.properties | cache.password · jdbc.postgres.password · jdbc.cassandra.password · jdbc.tse.password · jdbc.spark.password · data.gateway.api.key |
plantpulse-data-gateway.properties | data.gateway.api.key |
plantpulse-datalake-admin-api.properties | db_password · tse_password · redis_jmx_uri (URL 内密码) · redis_ssl_truststore_password · postgres_jmx_uri (URL 内密码) |
plantpulse-mqtt.properties · plantpulse-mq-auth.properties | mqtt.password |
plantpulse-plugin-opcua.properties | postgres.password · cassandra.password · redis.password · kafka.password · opc.ua.server.password |
plantpulse-plugin-aas.properties | aas.db.password · cassandra.password · kafka.password |
kafka.properties | ssl.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在 sourceenv.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 # 서버 계정 변경 → 사이드카 → 재렌더 → 재시작
渲染后的配置文件包含替换完成后的值,因此请勿将该文件提交至存储库。