Skip to main content

Path Map — Where Everything Is

Files in the data lake are divided between two worlds: the host and inside the container. Half the confusion comes from mixing them up. This page is a one-sheet map to answer "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 generated. Edits vanish at the next boot.
  3. Data · backups · scratch files live in Docker volumes — they persist even when you rebuild the container.

Host

Files operators edit — /etc/kopens/

PathWhatEdit howCopy between boxes
/etc/kopens/plantpulse-platform.envSecrets sidecar — service passwords · API keys · TLS passphrases. Permissions 0600Passwords go through passwd.sh. Non-secret values: edit the VAR=값 line directlyCopy as-is
/etc/kopens/platform.node.envNode file — values true only on this box (PP_MASTER_IP · PP_KAFKA_ADVERTISED_HOST · DOCKER_PP_EXTERNAL_IP · PP_NODE_ID)Edit directlyNever copy
/etc/kopens/conf/Config templates — 33 of them (*.template). Bind-mounted into the container at plantpulse-datalake-cli/config/templatesEdit directly → Changing templatesAs needed
/etc/kopens/conf.dist/Previous deployment image — actually the template baseline (3-way merge reference). Mounted read-only into the containerDo not touch — tooling refreshes it at each deployment
/etc/kopens/conf.backup/<시각>/Backup left by tooling during template reseedReference only
/etc/kopens/ca/Shared CA between boxes (CA.crt · CA.key)Only when moving to a second boxFirst box → next box
/etc/kopens/workers.rosterCluster worker roster <id> <ip>worker-add.sh family tools only
/etc/kopens/rotation.journalPassword rotation progress log (0600). Ground truth for resuming failed rotationsDo not touch

Operations scripts — /opt/kopens/plantpulse-platform-docker/

PathWhat
bin/All operation 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 computed values (cores · memory · disk). bin/env.sh --print prints "effective value and source for this box right now"
compose/docker-compose.ymlContainer definition. Environment variables, public ports, volumes, memory limits seen by the data lake
compose/platform.env.exampleThe one file operators open — all usable variables with comments. Pick lines here and copy them into the sidecar or node file (don't edit it directly; it's generated)
compose/platform.node.env.exampleTemplate for the node file
Do not edit bin/env.sh directly

Old guides say "add env.sh to export". It works, but it's inside the install tree and fragile to updates and reinstalls. Put the same value as VAR=값 in the sidecar or node file instead — it lives outside the tree, survives updates, and has higher priority → Precedence of values

Docker volumes

Named volumes on the host. Rebuilding the container with remove.sh leaves volumes behind.

VolumePath in containerWhat
pp-data/data1/pp-data (PP_DATA_DIR)All data — Cassandra · PostgreSQL · Valkey · MinIO · Kafka · Spark event log · logical dumps · unplanned-shutdown records
pp-temp/data1/pp-temp (PP_TEMP_DIR)Scratch. pd clean empties it. Don't store retention-period files here
pp-backup/data1/pp-backup (PP_BACKUP_DIR)Physical backup store (pgbackrest/ · medusa/) · backup history · console config revisions
pp-security/var/securityTLS material. plantpulse-certs container generates it; data lake and app read it

Inside the container

Two ways to enter. For a single command use docker exec; for many, 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 you see in the container is the host copy
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/minioFour storage nodes. Each runs bin/ conf/ logs/
plantpulse-analytics/spark · hive · gravitino · kyuubiFour analytics nodes
plantpulse-messaging/kafka · mqttTwo brokers
plantpulse-timeseries/engine · dashboardTime series engine and Grafana
plantpulse-cep/ · plantpulse-data-gateway/Web modules on Tomcat. Config at config/, logs at server/logs/
plantpulse-workflow/temporal · kestraTwo workflow engines
plantpulse-datalake-admin-api/Admin console backend. webapp/ prints the UI, logs/pd-events.jsonl prints the event journal
plantpulse-backup/Physical backup toolkit (bin/backup.sh) and systemd timer

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

docker exec plantpulse-datalake pd env

Generated — things that vanish on rebuild

pd start renders templates every time and writes them here. First line is # GENERATED by pd from <템플릿> - edit /etc/kopens/plantpulse-platform.env instead.

GeneratedSource 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

Full cross-reference at Where are config files — template inventory.

Logs

WhatWhereHow to view
Boot log — pd start concatenates service launcher output/var/log/plantpulse-datalake.logpd logs (BOOT tag)
Boot copy from container perspective/var/log/plantpulse-boot.logtail
~40 service logsEach module's logs/ — list at pd logs --listpd logs [서비스]
All of the above combinedDockerbin/logs.sh plantpulse-datalake from the host
Event journal — who started/stopped/backed up whenplantpulse-datalake-admin-api/logs/pd-events.jsonlConsole events screen, tail
Unplanned-shutdown records/data1/pp-data/pd/downtime/pd downtime

Other locations

WhatWhere
TLS material/var/security/plantpulse/ (.certs_generated logs generation)
PostgreSQL logical dump/data1/pp-data/postgres/dump/
Physical backup store · history · lock/data1/pp-backup/ (pgbackrest/ · medusa/ · history.jsonl · pd-backup.lock)
Backup tool config — contains passwords, don't paste/etc/pgbackrest/pgbackrest.conf · /etc/medusa/medusa.ini (pd writes it at startup)
Backup schedule override/data1/pp-data/backup/schedule.json
Image identity/etc/plantpulse-image.env · /etc/plantpulse-modules.json