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."
- Files you edit live under
/etc/kopens/on the host. /opt/kopens/plantpulse-platform/…/conf/inside the container is generated. Edits vanish at the next boot.- Data · backups · scratch files live in Docker volumes — they persist even when you rebuild the container.
Host
Files operators edit — /etc/kopens/
| Path | What | Edit how | Copy between boxes |
|---|---|---|---|
/etc/kopens/plantpulse-platform.env | Secrets sidecar — service passwords · API keys · TLS passphrases. Permissions 0600 | Passwords go through passwd.sh. Non-secret values: edit the VAR=값 line directly | Copy as-is |
/etc/kopens/platform.node.env | Node file — values true only on this box (PP_MASTER_IP · PP_KAFKA_ADVERTISED_HOST · DOCKER_PP_EXTERNAL_IP · PP_NODE_ID) | Edit directly | Never copy |
/etc/kopens/conf/ | Config templates — 33 of them (*.template). Bind-mounted into the container at plantpulse-datalake-cli/config/templates | Edit directly → Changing templates | As needed |
/etc/kopens/conf.dist/ | Previous deployment image — actually the template baseline (3-way merge reference). Mounted read-only into the container | Do not touch — tooling refreshes it at each deployment | — |
/etc/kopens/conf.backup/<시각>/ | Backup left by tooling during template reseed | Reference only | — |
/etc/kopens/ca/ | Shared CA between boxes (CA.crt · CA.key) | Only when moving to a second box | First box → next box |
/etc/kopens/workers.roster | Cluster worker roster <id> <ip> | worker-add.sh family tools only | — |
/etc/kopens/rotation.journal | Password rotation progress log (0600). Ground truth for resuming failed rotations | Do not touch | — |
Operations scripts — /opt/kopens/plantpulse-platform-docker/
| Path | What |
|---|---|
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.sh | Host-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.yml | Container definition. Environment variables, public ports, volumes, memory limits seen by the data lake |
compose/platform.env.example | The 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.example | Template for the node file |
bin/env.sh directlyOld 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.
| Volume | Path in container | What |
|---|---|---|
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/security | TLS 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
| Path | What |
|---|---|
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/minio | Four storage nodes. Each runs bin/ conf/ logs/ |
plantpulse-analytics/spark · hive · gravitino · kyuubi | Four analytics nodes |
plantpulse-messaging/kafka · mqtt | Two brokers |
plantpulse-timeseries/engine · dashboard | Time series engine and Grafana |
plantpulse-cep/ · plantpulse-data-gateway/ | Web modules on Tomcat. Config at config/, logs at server/logs/ |
plantpulse-workflow/temporal · kestra | Two 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.
| Generated | Source template (host /etc/kopens/conf/) |
|---|---|
plantpulse-storage/db/postgres/conf/postgresql.conf · pg_hba.conf | postgresql.conf.template · pg_hba.conf.template |
plantpulse-storage/db/cassandra/conf/cassandra.yaml · jvm-server.options | cassandra.yaml.template · jvm-server.options.template |
plantpulse-storage/cache/valkey/conf/valkey.conf | valkey.conf.template |
plantpulse-messaging/kafka/config/kafka.properties · jaas.conf | kafka.properties.template · kafka-jaas.conf.template |
plantpulse-messaging/mqtt/conf/config.xml · auth.properties | hivemq.xml.template · plantpulse-mq-auth.properties.template |
plantpulse-cep/config/plantpulse-cep.properties | plantpulse-cep.properties.template |
plantpulse-data-gateway/config/plantpulse-jdbc.properties · plantpulse-data-gateway.properties | plantpulse-jdbc.properties.template · plantpulse-data-gateway.properties.template |
Full cross-reference at Where are config files — template inventory.
Logs
| What | Where | How to view |
|---|---|---|
Boot log — pd start concatenates service launcher output | /var/log/plantpulse-datalake.log | pd logs (BOOT tag) |
| Boot copy from container perspective | /var/log/plantpulse-boot.log | tail |
| ~40 service logs | Each module's logs/ — list at pd logs --list | pd logs [서비스] |
| All of the above combined | Docker | bin/logs.sh plantpulse-datalake from the host |
| Event journal — who started/stopped/backed up when | plantpulse-datalake-admin-api/logs/pd-events.jsonl | Console events screen, tail |
| Unplanned-shutdown records | /data1/pp-data/pd/downtime/ | pd downtime |
Other locations
| What | Where |
|---|---|
| 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 |