Skip to main content

Where Is the Configuration File

Renders overwrite — edit the template instead

At every startup, config/templates/*.template is rendered and overwrites the configuration locations of each component. If you edit the component-side files directly, they will disappear on the next startup. → How to change configuration

The Data Lake configuration is built with "two sources, one direction." The files the operator edits are fixed, and the configuration files inside the container are generated by multiplying those sources.

호스트 /etc/kopens/conf/*.template ← 설정의 «형태» (빈칸이 뚫린 원본)
× /etc/kopens/plantpulse-platform.env ← 시크릿 (비밀번호 · API 키)
× /etc/kopens/platform.node.env ← 이 노드의 값 (IP · 모드)
+ 이미지 안 config/defaults.env ← 비밀 아닌 기본값 (위에서 안 준 것만)
─────────────────────────────────────────
→ pd config render → /opt/kopens/plantpulse-platform/<module>/conf/… (생성물)

pd start is always, without exception, rendered first. So even if you manually edit a generated file inside the container, it disappears on the next startup. On 2026-09-01, someone actually edited cassandra.yaml inside the container to enable authentication, but the file was reverted during regeneration, breaking authentication entirely.

The four master files​

#FileWhat it holdsFormatWho writes it
1/etc/kopens/plantpulse-platform.envSecrets — service account passwords · API keys · TLS passwords. Non-secret common values may also be placed hereVAR=값, one per line, no export. The two header lines (# generated: · # last rotation:) are managed by a toolCreated by install.sh, updated by passwd.sh. Non-secret lines are written directly by the operator
2/etc/kopens/platform.node.envValues true only for this box — PP_MASTER_IP · PP_KAFKA_ADVERTISED_HOST · DOCKER_PP_EXTERNAL_IP · PP_NODE_IDSame formatCreated by the installer from a template, then edited directly by the operator
3/etc/kopens/conf/*.templateThe shape of the configuration — originals of 33 engine configuration filesEach engine's syntax + ${PP_변수} placeholdersSeeded from the image at first startup, then edited directly by the operator
4(in the image) plantpulse-datalake-cli/config/defaults.envNon-secret defaults — ports · account names · directories · TLS settingsKEY=valueThe product. The operator does not edit these; items 1 and 2 override them
Passwords don't change by editing files

Just editing the password line in the sidecar doesn't complete the change. For values where the server account is the master (like PostgreSQL · Aster TSDB), you must also change the server side, and getting the order wrong can prevent the platform from starting. bin/passwd.sh handles that order for you → Change passwords · API keys

The order in which values are determined​

The order in which the host's bin/env.sh reads top-down is the priority. The later-read value wins.

PrioritySourceWhy it wins
1 (highest)/etc/kopens/platform.node.envAn unconditional assignment read after the sidecar
2/etc/kopens/plantpulse-platform.envVAR=값 unconditional assignment — also overrides shell export
3export of the calling shellOnly when 1 and 2 don't specify that name
4 (lowest)bin/env.sh's ${VAR:-기본값}Only when nobody has specified it

That value goes through compose into the container as an environment variable, and inside the container the passed-in value beats defaults.env.

On an installed node, export is silently ignored

Methods of passing a value from the shell, like PP_PG_PASSWORD=새값 bin/up.sh, work only on nodes where the sidecar does not yet exist. If the sidecar already holds that name, the sidecar wins. There was an actual incident where somebody believed they'd changed it this way and moved on.

To see the current effective values and their sources on this box, don't simulate in your head—run this command. Secrets are masked by ****.

cd /opt/kopens/plantpulse-platform-docker
bin/env.sh --print

No sidecar inside the container​

The /etc/kopens/plantpulse-platform.env file is not mounted into the container. Values only get in through this path: the host's bin/env.sh reads the sidecar, and compose passes them into the container as environment variables.

Two things follow from this.

  • After editing the sidecar, you must recreate the container for the new values to take effect. The host's bin/restart-datalake.sh does that.
  • A name that compose doesn't write won't reach the container no matter how much you put it in the sidecar. Which names reach it is determined by the compose/docker-compose.yml's x-pp-secrets anchors and the environment: blocks of the plantpulse-datalake service. Variable reference lists only the "names that reach."

If you run pd doctor inside the container, the sidecar line won't show up as "file not found"—it won't show at all. Instead, the all required secrets set line is the actual measurement—this is normal.

Template list — what renders where​

The 33 templates of the host /etc/kopens/conf/ (23 top-level + cluster/ 10) go to the locations below. The master of this mapping table is inside the container at plantpulse-datalake-cli/config/render.map, and pd config list prints the rows corresponding to this node's mode.

TemplateRendered location (relative to PP_HOME)MASTERWORKER
valkey.confplantpulse-storage/cache/valkey/conf/valkey.conf○○ (cluster/)
postgresql.conf · pg_hba.confplantpulse-storage/db/postgres/conf/○○ (cluster/)
cassandra.yaml · jvm-server.optionsplantpulse-storage/db/cassandra/conf/○○ (cluster/)
spark-env.sh · spark-defaults.conf · metrics.propertiesplantpulse-analytics/spark/conf/○○
hive-site.xml · hive-auth.propertiesplantpulse-analytics/spark/conf/○○ (cluster/)
hive-site.xmlplantpulse-analytics/hive/conf/hive-site.xml○—
kyuubi-defaults.confplantpulse-analytics/kyuubi/conf/○○
gravitino-iceberg-rest-server.confplantpulse-analytics/gravitino/conf/○—
kafka.properties · kafka-jaas.confplantpulse-messaging/kafka/config/kafka.properties · jaas.conf○—
hivemq.xml · plantpulse-mq-auth.propertiesplantpulse-messaging/mqtt/conf/config.xml · auth.properties○—
plantpulse-timeseries-engine.confplantpulse-timeseries/engine/conf/ (under both names)○—
plantpulse-datalake-admin-api.propertiesplantpulse-datalake-admin-api/config/○○ (cluster/)
workflow.yaml · application.yamlplantpulse-workflow/temporal/config/ · kestra/config/○—
plantpulse-cep.propertiesplantpulse-cep/config/○—
plantpulse-jdbc.properties · plantpulse-data-gateway.propertiesplantpulse-data-gateway/config/○—

The cluster/ mark means the WORKER node uses a different template under /etc/kopens/conf/cluster/. For example, replicaof is absent from the MASTER's valkey.conf.template, while replicaof ${PP_MASTER_IP} ${PP_REDIS_PORT} is present in cluster/valkey.conf.template.

Template syntax​

There are only three.

SyntaxMeaning
${PP_VAR}If the value is missing, the entire render fails (exit 4). It does not fill in an empty value and move on
${PP_VAR:기본값} · ${PP_VAR:-기본값}If the value is missing, use the default

Secrets cannot have inline defaults. There was an incident where an old renderer filled in empty values and moved on, resulting in an Aster TSDB with an empty-string password. So now it lists all missing names and stops.

Configuration not rendered — admin console account​

The login account for the admin console is not included in any template. The admin-api process reads it directly from environment variables, to avoid creating another copy of the password on disk.

VariableWhere it comes fromDefault
PP_DATALAKE_ADMIN_USERdefaults.envadmin
PP_DATALAKE_ADMIN_PASSWORDSidecarInstalls after 2026-09-05 use the same development default as the web console admin → Change initial password. Earlier installs are empty, so the console is off
PP_DATALAKE_ADMIN_API_KEYSidecarNone — if empty, only key authentication is disabled; browser login remains as-is

You cannot selectively enable/disable components​

The variable PD_OPTIONS exists, but the current compose stack does not pass this value to the container. So a setup that starts only one component is currently not supported → FAQ