环境变量参考
PlantPulse 的所有配置都始于一个环境变量。本页面是安装与运行期间所涉及变量的分类别参考指南。
本页面涵盖基础设施/部署环境变量(
PP_*·DOCKER_PP_*)。关于应用程序运行属性(engine.*,websocket.*等),请参考 属性参考。
1. 配置文件在哪里?
Platform 以 Docker Compose 栈形式运行,其值的定义处有两个。
| 定义处 | 包含内容 | 读取者 |
|---|---|---|
plantpulse-platform-docker/bin/env.sh | 在主机上确定的值 — 凭据默认值、docker 运行时、网络、在主机上计算出的资源值 | 主机的运行脚本 |
plantpulse-platform-docker/compose/docker-compose.yml | 容器实际看到的值 | 容器 |
env.sh六个应用(plantpulse-server-web · plantpulse-batch-web · plantpulse-warehouse-web · plantpulse-plugin-opcua · plantpulse-plugin-aasx · plantpulse-ha)不 source env.sh。应用看到的定义处只有 compose 一个。
也就是说,仅存在于 env.sh 而不在 compose 中的名称无法触达应用,应用将使用 jar/WAR 内置默认值运行。实际上,曾发生过在仅在数据湖中更改标识符的站点上,五个应用持续使用旧名称而导致事故的情况(2026-08-29)。
每个层级决定值的方式不同。
| 层级 | 值由什么决定 |
|---|---|
plantpulse-datalake | compose 传递的值 → 容器的 pd 以 ${VAR:-기본값} 形式接收。传递的值优先 |
| 六个应用 | compose 传递的环境变量覆盖 jar/WAR 内置默认值 |
plantpulse-certs | 仅查看 compose 的 PP_TLS_*。不 source 文件 |
优先级 — 谁覆盖谁
在主机端,bin/env.sh 从上到下的运行顺序即为优先级。
| 优先级 | 来源 | 胜出原因 |
|---|---|---|
| 1 (最高) | /etc/kopens/plantpulse-platform.env (Secret Sidecar) | export VAR=값 无条件赋值,即使是 Shell export 也会被覆盖 |
| 2 | /etc/kopens/platform.node.env (单节点) | 在 Sidecar 之后 source,同样为无条件赋值 |
| 3 | 调用 Shell 的 export | 胜过默认值的 :- — 但仅在 1·2 未定义该名称时 |
| 4 (最低) | bin/env.sh 的 ${VAR:-기본값} | 仅在 unset 时有效 |
在安装完成的节点上,PP_PG_PASSWORD=새값 bin/up.sh 将被静默忽略。因为 Sidecar 已经持有该名称。更改值的唯一方法是 bin/passwd.sh / bin/rotate-secret.sh。
🔑 机密值的正本在 /etc/kopens/ 之下
服务账号密码(PP_PG_PASSWORD · PP_CASSANDRA_PASSWORD · PP_MQ_PASSWORD 等)与 API 密钥的实际值位于 repo 树之外的 Sidecar 文件中。
| 文件 | 状态 |
|---|---|
/etc/kopens/plantpulse-platform.env | 当前正本 — platform · ai · studio 三款产品通用协议(plantpulse-<product>.env),权限 0600 |
/opt/kopens/plantpulse-platform.env | 旧路径 (仅在 2026-08-25 ~ 08-29 存在) — 不读也不写。若仍然存在,安装脚本将其还原为正本 |
请先通过 ls -l /etc/kopens/ 确认正本是否存在。
Sidecar 覆盖 bin/env.sh。 因为 env.sh 在最上方先 source Sidecar,且其下方所有值均为 ${VAR:-기본값} 形式。因此,仅修改 env.sh 的密码不会产生任何影响 — Sidecar 的旧值将继续胜出。
install.sh 将 bin/env.sh 的默认值原样加载到 Sidecar。因此,在委任(Commissioning)时必须更换 → 初始密码
由于 compose 要求密码为 ${PP_X:?},若值为空,栈将无法启动,而非以«半配置状态启动»。
仅修改 Sidecar 无法完成同步。对于 PostgreSQL · Aster TSDB 等服务器账号为正本的值,必须同步更改服务器端,且若顺序错误,Platform 将无法启动。
请使用专用流程 — 更改密码 (凭据轮转)。此操作在委任时执行一次即可。
🔑 标记为机密值。请勿将原文输入至 git · Issue · 聊天工具。
1.5 容器运行时 · 主机资源 (DOCKER_*)
由 bin/env.sh 决定。以下资源值非固定默认值,而是根据主机计算得出 — 若使用常量,可能会导致在低配主机上无法启动(若 --cpus 大于实际核心数,docker 将拒绝启动)或在启动过程中被 OOM-kill。针对每个盒子指定的值始终优先。
| 变量 | 决定方式 |
|---|---|---|
| DOCKER_CMD | docker (podman 同样可用) |
| DOCKER_REGISTRY | docker.kopens.io/pp — 栈镜像八个仓库的前缀 |
| PP_IMAGE_TAG | latest。发布时建议使用 2026.08 等固定标签 |
| DOCKER_PP_CPUS | nproc (读取失败时为 8) |
| DOCKER_PP_CLUSTER_CORES | DOCKER_PP_CPUS - 2, 最少 4 · 最多 30。以 PP_CLUSTER_CORES 形式传递给容器 |
| DOCKER_PP_MEMORY | 主机 RAM 的 90%, 最少 8G |
| DOCKER_DATALAKE_MEMORY | 96G — 数据湖 Master 的最小值。该值被截断至不超过主机 RAM 的 90%,因此若主机 RAM 低于 107G,则无法提供 96G,该主机即为规格不足。64G 并非支持规格 (系统要求) |
| DOCKER_PW_MEMORY | 60G, 若主机较小则为 RAM 的 90% — Worker 与 Master 使用相同镜像,但运行服务较少,故单独设置 |
| DOCKER_PP_DATA_DISK_NAME | 将承载 / 的实际磁盘通过 findmnt + lsblk 反向追踪 (LVM/dm 追踪至物理磁盘)。失败时为 sda |
| DOCKER_PP_EXTERNAL_IP | 默认空值。仅在 NAT 环境下填写实际公网 IP |
DOCKER_PP_EXTERNAL_IP 中输入无效 IP该值经由 PP_SERVICE_IP 进入 TLS 证书的 SAN。只要混入一个格式不符的 IP,openssl 将拒绝整个扩展文件,导致无法生成任何证书。
网络
| 变量 | 默认值 | 说明 |
|---|---|---|
DOCKER_PP_NETWORK | pp-net | docker network 名称 |
DOCKER_SUBNET | 10.99.0.0/24 | 子网 (避免与其他容器网络重叠) |
DOCKER_GATEWAY | 10.99.0.1 | 网关 |
DOCKER_PP_IP | 10.99.0.100 | 数据湖固定 IP |
各应用内存上限 — 由 compose 决定
为每个应用单独设置 mem_limit 是容器隔离的第一目的(OOM 隔离)。即使某个应用达到上限,其他应用及基础设施仍能保持运行。
| 变量 | 默认值 | 服务 |
|---|---|---|
DOCKER_SERVER_MEMORY / DOCKER_SERVER_HEAP | 14g / 8g | plantpulse-server-web |
DOCKER_BATCH_MEMORY / DOCKER_BATCH_HEAP | 4g / 3g | plantpulse-batch-web |
DOCKER_WAREHOUSE_MEMORY | 8g | plantpulse-warehouse-web |
DOCKER_OPCUA_MEMORY | 3g | plantpulse-plugin-opcua |
DOCKER_AASX_MEMORY | 3g | plantpulse-plugin-aasx |
DOCKER_HA_MEMORY | 2g | plantpulse-ha |
DOCKER_DATALAKE_MEMORY | 96g | plantpulse-datalake |
卷
| 变量 | 默认值 | 用途 |
|---|---|---|
DOCKER_PP_DATA_VOLUME | pp-data | 数据持久存储 |
DOCKER_PP_TEMP_VOLUME | pp-temp | 临时数据 |
DOCKER_PP_BACKUP_VOLUME | pp-backup | 备份存储 |
DOCKER_PP_SECURITY_VOLUME | pp-security | TLS 材质 |
DOCKER_PP_PROXY_CERTS_VOLUME | — | 不存在该变量。代理证书卷 pp-proxy-certs 已在 compose 中以名称形式固定 |
install.sh 一次性选项
| 变量 | 效果 |
|---|---|
SKIP_OS=1 | 省略 OS 设置 |
SKIP_LOGIN=1 | 省略仓库登录 |
SKIP_FW=1 | 省略防火墙设置 |
DOCKER_DATA_DIR | Docker data-root 路径 (默认 /data1/docker-data) |
2. 至少请确认以下内容
在新单机服务器安装中,实际需要操作的内容很少,因为资源值由安装脚本根据主机自动计算。
| 项目 | 位置 | 备注 |
|---|---|---|
🔑 各类 *_PASSWORD · API 密钥 | bin/passwd.sh / bin/rotate-secret.sh | 委任时必须更换。通过编辑文件无法更改 |
PP_LANG | bin/env.sh | 若为韩语运行则设为 ko (默认 en) |
PP_TZ | bin/env.sh | 韩语运行保持 Asia/Seoul |
DOCKER_PP_EXTERNAL_IP | bin/env.sh | 仅在 NAT 之后时填写。否则保持空值 |
DOCKER_DATALAKE_MEMORY | bin/env.sh | 默认 96G。主机规格较小时会自动降低 |
PP_* 为 «容器看到的名称»PP_HOST_IP · PP_DATA_DIR · PP_CLUSTER_CORES 等值是容器内部使用的名称,而在主机上确定该值的是 compose 和 bin/env.sh 的 DOCKER_* (见 §1.5)。例如,核心数由 DOCKER_PP_CLUSTER_CORES 计算并以 PP_CLUSTER_CORES 形式传递给容器。
请勿期望仅在主机上修改 PP_CLUSTER_CORES 即可生效 — 若不传递,Kyuubi 将信任一个不存在的 30 核配置(即便盒子只有 16 vCPU),导致永远无法启动。
3. 平台基础 / 网络 / 资源
| 变量 | 默认值 | 说明 |
|---|---|---|
PP_HOME | /opt/kopens/plantpulse-platform | 安装根目录 (容器内部相同) |
PP_SCHEME | PP | 部署标识方案 |
PP_MODE | MASTER | 节点角色 (MASTER / Worker) — 集群化(水平扩展)轴 |
PP_OPTIONS | {} | 单个服务 on/off 专用 JSON (参考下文 §3.1) |
PP_HOST_IP | 127.0.0.1 | 本节点的 IP |
PP_SERVICE_IP | 127.0.0.1 | 服务绑定 IP |
PP_MASTER_IP | 127.0.0.1 | Worker/APP 层级面向的Master(数据湖) IP。同时也是 Kafka advertised.listeners 的来源。安装 DATALAKE 层级时若未指定,则自动检测为主机 IP |
PP_PUBLIC_IP | 127.0.0.1 | 外部公开 IP (NAT 环境) |
PP_DATA_DIR | /data1/pp-data | 数据根目录 |
PP_TEMP_DIR | /data1/pp-temp | 临时文件根目录 |
PP_BACKUP_DIR | /data1/pp-backup | 备份根目录 |
PP_DATA_DISK_NAME | sdb | 数据磁盘设备名 |
PP_CLUSTER_CORES | 30 | 使用核心数 |
PP_CLUSTER_MEMORY_BY_CORE | 2G | 每核内存分配 |
PP_LANG | en | 默认语言 |
PP_TZ | Asia/Seoul | 时区 (自动应用于所有 java 进程) |
3.1 PP_OPTIONS — 单个服务 on/off
PP_OPTIONS 是用于开启或关闭单个组件的 JSON。默认值为 {},未指定的键全部视为 true(激活)。
例) 若使用外部托管 Redis 并关闭内置 Valkey:
export PP_OPTIONS='{"enable-valkey":false}'
可用的 enable-* 键 (全部默认为 true):
enable-messaging · enable-valkey · enable-postgres · enable-cassandra · enable-spark · enable-rustfs · enable-tse · enable-cep · enable-workflow · enable-data-gateway · enable-sql · enable-hive · enable-gravitino · enable-kyuubi · enable-grafana · enable-monitor
4. 数据存储
| 变量 | 默认值 | 说明 |
|---|---|---|
PP_REDIS_HOST / PP_REDIS_PORT | plantpulse-datalake / 6379 | Valkey/Redis (TLS 监听 6380) |
PP_REDIS_USER / 🔑 PP_REDIS_PASSWORD | redis / — | Redis 账号 |
PP_POSTGRES_HOST / PP_POSTGRES_PORT | plantpulse-datalake / 5432 | PostgreSQL 18 (Percona) |
PP_PG_USER / 🔑 PP_PG_PASSWORD | plantpulse / — | PostgreSQL 账号 |
PP_CASSANDRA_HOST / PP_CASSANDRA_PORT | plantpulse-datalake / 9042 | Aster TSDB |
PP_CASSANDRA_USER / 🔑 PP_CASSANDRA_PASSWORD | cassandra / — | Aster TSDB 账号 |
PP_CASSANDRA_PORT | 9042 | 存储层客户端复用的 Aster TSDB 端口。不存在名为 PP_STORAGE_PORT 的变量 |
PP_S3_HOST / PP_S3_PORT | plantpulse-datalake / 9000 | RustFS 对象存储 |
PP_S3_USER / 🔑 PP_S3_PASSWORD | rustfs / — | RustFS 账号 |
PP_S3_BUCKET | plantpulse | 默认 Bucket — Iceberg 数据 · 备份 |
PP_S3_UPLOAD_BUCKET | upload | 上传物 Bucket。仅加载至 plantpulse-server-web(刻意不传至 Worker)。区分 Bucket 是为了防止一方的保留规则影响另一方 |
PP_DB_NAME | pp | PostgreSQL 数据库名 |
PP_KEYSPACE | pp | Aster TSDB Keyspace 名 |
PP_HIVE_DB | hive-metastore-230 | Hive Metastore DB |
5. 消息传递
| 变量 | 默认值 | 说明 |
|---|---|---|
PP_MQ_USER / 🔑 PP_MQ_PASSWORD | mq / — | Kafka·MQTT 共用账号 (无 Kafka 专用账号) |
PP_TOPIC_PREFIX | pp | Kafka Topic 前缀 (pp-tag-point 等) |
PP_KAFKA_HOST / PP_KAFKA_PORT | PP_MASTER_IP / 9092 | Kafka Broker |
PP_KAFKA_TLS_PORT | 9094 | Kafka 外部 TLS |
PP_KAFKA_CONTROLLER_PORT | 9093 | Kafka KRaft Controller |
PP_MQTT_HOST / PP_MQTT_PORT | PP_MASTER_IP / 1883 | MQTT (HiveMQ) |
PP_MQTT_TLS_PORT | 1884 | MQTT TLS |
随着浏览器实时推送改为 SSE,STOMP Broker 已从数据湖镜像中移除。PP_STOMP_* 变量及 61000/61004 端口不再提供服务。若仍保留在旧防火墙规则中,请予以清理。
6. 处理 · 时序 · 分析 · 工作流
| 变量 | 默认值 | 说明 |
|---|---|---|
PP_CEP_HOST / PP_CEP_PORT / PP_CEP_TLS_PORT | plantpulse-datalake / 7400 / 7401 | CEP 服务器 |
PP_CEP_PROTOCOL | http | CEP 访问协议。分布式/容器建议使用 https |
PP_CEP_CONNECT_PORT | (派生) | server-web → CEP 访问端口。根据协议自动对齐 (http → 7400, https → 7401)。若显式指定则优先 |
PP_DATA_GATEWAY_HOST / PP_DATA_GATEWAY_PORT / PP_DATA_GATEWAY_TLS_PORT | plantpulse-datalake / 5500 / 5501 | Data Gateway |
PP_DATA_GATEWAY_PROTOCOL | http | DGW 访问协议 (内部 loopback 默认为 http) |
PP_DATA_GATEWAY_CONNECT_PORT | (派生) | DGW 访问端口。根据协议自动对齐 (http → 5500, https → 5501)。若显式指定则优先 |
PP_TSE_HOST / PP_TSE_PORT / PP_TSE_TLS_PORT | plantpulse-datalake / 7800 / 7801 | 时序引擎(TSE)。服务器同时监听 http 7800 和 https 7801 |
PP_TSE_PROTOCOL | http | TSE 客户端访问协议。由于是内部段通信,默认为明文 http — 与 TLS 主开关(PP_TLS_ENABLED)分离(2026-08) |
PP_TSE_CONNECT_PORT | (未设置) | env.sh 不 export 的运算符显式覆盖钩子。模板将以 ${PP_TSE_CONNECT_PORT:7800} 为后备(fallback)消费 |
PP_TSE_JDBC_SCHEME | — | 不存在该变量。jdbc.tse.url 模板硬编码了 ts,无法更改方案 |
PP_TSE_USER / 🔑 PP_TSE_PASSWORD | tse / — | TSE 账号 |
PP_ANALYTICS_USER / 🔑 PP_ANALYTICS_PASSWORD | spark / — | 分析(Spark/Kyuubi 客户端)账号。与 Kyuubi 内部 Metastore(PP_HIVE_*)分离的独立凭据 |
PP_HIVE_HOST / PP_HIVE_PORT | PP_MASTER_IP / 9083 | Hive Metastore |
PP_HIVE_USER / 🔑 PP_HIVE_PASSWORD | hive / — | Hive 账号 |
PP_SPARK_HOST / PP_SPARK_PORT | PP_MASTER_IP / 7077 | Spark Master |
PP_KYUUBI_PORT | 10000 | Kyuubi SQL 网关 |
PP_GRAVITINO_USER / 🔑 PP_GRAVITINO_PASSWORD | gravitino / — | Gravitino Catalog |
PP_TEMPORAL_HOST / PP_TEMPORAL_PORT | plantpulse-datalake / 7233 | Temporal 引擎 (Web UI 8233) |
PP_TEMPORAL_USER / 🔑 PP_TEMPORAL_PASSWORD | temporal / — | Temporal 账号 |
PP_KESTRA_HOST / PP_KESTRA_PORT | plantpulse-datalake / 8380 | Kestra 调度器 |
PP_KESTRA_ADMIN_EMAIL / 🔑 PP_KESTRA_ADMIN_PASSWORD | admin@plantpulse.io / — | Kestra 管理员 |
PP_KESTRA_DB_USER / 🔑 PP_KESTRA_DB_PASSWORD | kestra / — | Kestra 元数据库 |
7. 插件 · 观测 · Web 层
| 变量 | 默认值 | 说明 |
|---|---|---|
PP_OPCUA_TCP_PORT | 11004 | OPC-UA opc.tcp 协议端口 |
PP_OPCUA_TLS_PORT | 11005 | OPC-UA TLS |
PP_AAS_SERVER_PORT | 8090 | AAS(BaSyx V3) API。UI 为 8091, Registry/AAS 端口(4800/4801)在代码中固定,无法通过 env 更改 |
PP_GRAFANA_DB_USER / 🔑 PP_GRAFANA_DB_PASSWORD | grafana / — | PlantPulse Dashboard 存储(PostgreSQL)访问。若为空则 pd start exit 3。不存在指定管理员账号的变量 |
以下内容无法通过 env 更改 — 即使填写值也不会产生任何影响。
| 项目 | 端口 | 原因 |
|---|---|---|
| PlantPulse Dashboard | 3000 | 在 compose 的 ports: 中以数字形式固定(不存在 PP_GRAFANA_PORT) |
| WebSocket 推送 | — | PP_WEBSOCKET_PORT · PP_WEBSOCKET_PORT_SSL · PP_WEBSOCKET_USER · PP_WEBSOCKET_SERVER_PASSWORD 在任何存储库中均不存在 |
| AAS Registry/AAS | 4800 · 4801 | 代码固定 |
PP_OPCUA_PORT 同样不存在 — OPC-UA 仅有 PP_OPCUA_TCP_PORT 一个端口。
邮件服务器与控制台 · 现场应用地址并非环境变量。PP_MAIL_SMTP_* 即使填写也不会被读取,值应填入 pp.mm_config — 邮件设置 · 地址设置。
8. TLS / SSL
| 变量 | 默认值 | 说明 |
|---|---|---|
PP_TLS_ENABLED | true | TLS 主开关 — 决定服务客户端的默认协议 |
PP_TLS_CERT_DIR | /var/security/plantpulse | 证书目录 |
PP_TLS_DOMAIN | plantpulse.io | 证书域名 |
🔑 PP_TLS_KEYSTORE_PASSWORD / 🔑 PP_TLS_TRUSTSTORE_PASSWORD | — | keystore/truststore 密码 (所有节点必须相同) |
PP_TLS_VALID_DAYS | 3650 | 证书有效期(日) |
PP_TLS_SAN_IPS | PP_HOST_IP,…,127.0.0.1 | 证书 SAN IP。运行环境下必须包含外部访问 IP(如:公网 IP) |
PP_TLS_SAN_DNS | localhost,<hostname>,<domain> | 证书 SAN DNS |
PP_TLS_NODE_NAMES | master worker-1 … worker-5 | 集群节点名称 |
PP_TLS_FORCE_REGENERATE | false | true 时强制重新生成证书 |
9. API 密钥 / AI 网关
所有项均有开发用默认值(fallback)。在运行/客户交付时,必须通过 Docker
-e或export进行更换。
| 变量 | 说明 |
|---|---|
🔑 PP_API_KEY | 平台内部 API 密钥 (服务器 ↔ 边缘代理认证) |
🔑 PP_DATA_GATEWAY_API_KEY | server-web → data-gateway JDBC 认证 |
🔑 PP_CEP_API_KEY | server-web → CEP 服务器 X-API-Key (需与 CEP 服务器 cep.api.key 一致) |
🔑 PP_FLOW_WEBHOOK_API_KEY | Flow Engine 外部 Webhook 认证 |
PP_AI_OPENAI_ENABLED · PP_AI_OPENAI_BASE_URL · PP_AI_OPENAI_API_KEY · PP_AI_OPENAI_MODEL 在
2026-09-18 起不再起作用。即使填写也不会报错或警告,而是被静默忽略,
且服务器看起来像已配置一样。
AI 设置的正本位于 PostgreSQL pp.mm_config 表中,键名称也从 ai.openai.* 变更为
ai.llm.*。填写值的途径为控制台的设置界面(/env)或该表 —
属性参考 — AI 设置。
10. 更改后应用流程
vi /etc/kopens/plantpulse-platform.env # 사이드카 — 여기를 고칩니다
cd /opt/kopens/plantpulse-platform-docker/bin
./restart.sh # 준비될 때까지 대기 (종료 코드 0 = 쓸 수 있다)
填写在 bin/env.sh 中的值在重新安装或升级时会消失。因为安装脚本会删除整个安装树并重新接收。Sidecar 位于该树之外,因此得以保留。
若需要更改容器看到的值,请修改 compose/docker-compose.yml 后以相同方式重启。设置模板通过绑定挂载(Bind Mount)至主机的 /etc/kopens/conf,可直接在主机编辑,且在重新安装后依然保留。
若更改变量后未生效,请按以下顺序确认。
| 确认项 | 内容 |
|---|---|
| ① Sidecar 是否胜出 | 若 /etc/kopens/plantpulse-platform.env 中存在同名变量,则 env.sh 和 Shell export 均失效 → 优先级 |
| ② 名称是否可触达应用 | 六个应用不读取 env.sh。若不在 compose 中,则无法触达应用 |
| ③ 是否已重启 | 包括区域(Locale)·时区在内,大部分值仅在启动时点生效 |
| ④ 是否为密码 | 密码无法通过编辑文件更改 → 密码轮转 |
详细步骤请参考 启动指南。