Skip to main content

Path Map — What Lives Where

Files in the data lake are split between two worlds: the host and inside the container. Half of all incidents start with confusion over which side of the path you're on. This page is a one-page map answering, "Where is that file?"

Three lines to remember
  1. Files you edit live under /etc/kopens/ on the host.
  2. /opt/kopens/plantpulse-platform/…/conf/ inside the container is a product. Edit it and it will be gone at the next startup.
  3. Data, backups, and temporary files are Docker volumes, so they survive container recreation.

Host​

Files the operator edits — /etc/kopens/​

PathWhatEditableCopy between boxes
/etc/kopens/plantpulse-platform.envSecret sidecar — service passwords, API keys, TLS secrets. Permission 0600Passwords via passwd.sh. Non-secret values: edit the VAR=값 line directlyCopy as-is
/etc/kopens/platform.node.envNode file — values that are true only for this box (PP_MASTER_IP, PP_KAFKA_ADVERTISED_HOST, DOCKER_PP_EXTERNAL_IP, PP_NODE_ID)Edit directlyNever copy
/etc/kopens/conf/Configuration templates, 33 of them (*.template). Bind-mounted to the container's plantpulse-datalake-cli/config/templatesEdit directly → Editing templatesIf needed
/etc/kopens/conf.dist/Templates defaults from past deployment images (3-way comparison baseline). Mounted read-only in the containerDon't touch — the tool refreshes them on each deployment—
/etc/kopens/conf.backup/<시각>/Backups left by the tool when reseeding templatesReference only—
/etc/kopens/ca/Shared CA for the box (CA.crt, CA.key)Only when moving to a second boxFirst box → next box
/etc/kopens/workers.rosterCluster worker list <id> <ip>Only worker-add.sh family tools—
/etc/kopens/rotation.journalPassword rotation progress log (0600). Basis for resuming a failed rotationDon't touch—

Operational scripts — /opt/kopens/plantpulse-platform-docker/​

PathWhat
bin/All operational verbs — up.sh, down.sh, restart.sh, restart-datalake.sh, status.sh, logs.sh, shell.sh, passwd.sh, rotate-secret.sh, update.sh, backup.sh, doctor.sh, ops-check.sh …
bin/env.shHost-side defaults and values calculated on the host (cores, memory, disk). bin/env.sh --print prints "current effective value and source" for this box
compose/docker-compose.ymlContainer definition. Environment variables, exposed ports, volumes, memory limits for the data lake
compose/platform.env.exampleThe one file the operator opens — every writable variable with comments. Pick lines here and write them into the sidecar or node file (they're products, so don't edit them directly)
compose/platform.node.env.exampleThe template for the node file
Don't edit bin/env.sh directly

Older guides may say "add export to env.sh". It works, but since it's inside the installation tree, it's fragile against updates and reinstalls. Write the same value as VAR=값 into the sidecar or node file — outside the installation tree it survives, and its priority is higher → Order of value resolution

Docker volumes​

These are named volumes on the host. Removing the container with remove.sh leaves the volumes intact.

VolumePath inside containerWhat
pp-data/data1/pp-data (PP_DATA_DIR)All data — Aster TSDB, PostgreSQL, Valkey, RustFS, Kafka, Spark event logs, logical dumps, unplanned stop records
pp-temp/data1/pp-temp (PP_TEMP_DIR)Temporary files. pd clean clears it. Don't put retention-worthy files here
pp-backup/data1/pp-backup (PP_BACKUP_DIR)Physical backup storage (pgbackrest/, medusa/), backup history, console configuration revisions
pp-security/var/securityTLS material. Created by the plantpulse-certs container; read by the data lake and apps

Inside the container​

There are two ways to get in. For a single command, use docker exec; for several, open a shell.

docker exec plantpulse-datalake pd status # 하나만
/opt/kopens/plantpulse-platform-docker/bin/shell.sh # 셸 열기 (= docker exec -it … bash)

Runtime tree — PP_HOME=/opt/kopens/plantpulse-platform​

PathWhat
plantpulse-datalake-cli/pd itself. bin/pd, cmd/, lib/, services/order.txt, config/defaults.env, config/render.map
plantpulse-datalake-cli/config/templates/Where host /etc/kopens/conf is mounted. What's visible from inside is a copy of the host
plantpulse-datalake-cli/config/templates.dist/Where host /etc/kopens/conf.dist is mounted read-only
plantpulse-storage/cache/valkey, db/postgres, db/cassandra, object/rustfsStorage quartet. Each has bin/, conf/, logs/
plantpulse-analytics/spark, hive, gravitino, kyuubiAnalytics quartet
plantpulse-messaging/kafka, mqttThe two brokers
plantpulse-timeseries/engine, dashboardTime series engine and PlantPulse Dashboard
plantpulse-cep/, plantpulse-data-gateway/Web modules on Tomcat. Config in config/, logs in server/logs/
plantpulse-workflow/temporal, kestraThe two workflow engines
plantpulse-datalake-admin-api/Management console backend. webapp/ is the screen, logs/pd-events.jsonl is the event journal
plantpulse-backup/Physical backup toolkit (bin/backup.sh). The schedule lives not here but in the datalake DB, table backup_schedule

pd env prints this list with actual values for this node. Don't memorize paths; use this command.

docker exec plantpulse-datalake pd env

Products — things that vanish if you edit them​

pd start renders the templates each time and writes to the locations below. The first line is # GENERATED by pd from <템플릿> - edit /etc/kopens/plantpulse-platform.env instead.

ProductSource template (host /etc/kopens/conf/)
plantpulse-storage/db/postgres/conf/postgresql.conf, pg_hba.confpostgresql.conf.template, pg_hba.conf.template
plantpulse-storage/db/cassandra/conf/cassandra.yaml, jvm-server.optionscassandra.yaml.template, jvm-server.options.template
plantpulse-storage/cache/valkey/conf/valkey.confvalkey.conf.template
plantpulse-messaging/kafka/config/kafka.properties, jaas.confkafka.properties.template, kafka-jaas.conf.template
plantpulse-messaging/mqtt/conf/config.xml, auth.propertieshivemq.xml.template, plantpulse-mq-auth.properties.template
plantpulse-cep/config/plantpulse-cep.propertiesplantpulse-cep.properties.template
plantpulse-data-gateway/config/plantpulse-jdbc.properties, plantpulse-data-gateway.propertiesplantpulse-jdbc.properties.template, plantpulse-data-gateway.properties.template

The full mapping table is in Where are configuration files — Template list.

Logs​

WhatWhereHow to view
Boot logs — pd start appends the service launcher output/var/log/plantpulse-datalake.logpd logs (BOOT tag)
Container-view boot copy/var/log/plantpulse-boot.logtail
~40 service logsEach module's logs/ — list in pd logs --listpd logs [서비스]
Combined container log of all the aboveDockerHost: bin/logs.sh plantpulse-datalake
Event journal — who started/stopped/backed up whenplantpulse-datalake-admin-api/logs/pd-events.jsonlConsole events screen, tail
Unplanned stop records/data1/pp-data/pd/downtime/pd downtime

Other locations​

WhatWhere
TLS material/var/security/plantpulse/ (.certs_generated has the generation record)
PostgreSQL logical dumps/data1/pp-data/postgres/dump/
Physical backup storage, history, locks/data1/pp-backup/ (pgbackrest/, medusa/, history.jsonl, pd-backup.lock)
Backup tool settings — contains passwords, don't paste it/etc/pgbackrest/pgbackrest.conf, /etc/medusa/medusa.ini (written by pd at startup)
Backup schedule override/data1/pp-data/backup/schedule.json
Image identity/etc/plantpulse-image.env, /etc/plantpulse-modules.json