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?"
- Files you edit live under
/etc/kopens/on the host. /opt/kopens/plantpulse-platform/…/conf/inside the container is a product. Edit it and it will be gone at the next startup.- Data, backups, and temporary files are Docker volumes, so they survive container recreation.
Host
Files the operator edits — /etc/kopens/
| Path | What | Editable | Copy between boxes |
|---|---|---|---|
/etc/kopens/plantpulse-platform.env | Secret sidecar — service passwords, API keys, TLS secrets. Permission 0600 | Passwords via passwd.sh. Non-secret values: edit the VAR=값 line directly | Copy as-is |
/etc/kopens/platform.node.env | Node file — values that are true only for this box (PP_MASTER_IP, PP_KAFKA_ADVERTISED_HOST, DOCKER_PP_EXTERNAL_IP, PP_NODE_ID) | Edit directly | Never copy |
/etc/kopens/conf/ | Configuration templates, 33 of them (*.template). Bind-mounted to the container's plantpulse-datalake-cli/config/templates | Edit directly → Editing templates | If needed |
/etc/kopens/conf.dist/ | Templates defaults from past deployment images (3-way comparison baseline). Mounted read-only in the container | Don't touch — the tool refreshes them on each deployment | — |
/etc/kopens/conf.backup/<시각>/ | Backups left by the tool when reseeding templates | Reference only | — |
/etc/kopens/ca/ | Shared CA for the box (CA.crt, CA.key) | Only when moving to a second box | First box → next box |
/etc/kopens/workers.roster | Cluster worker list <id> <ip> | Only worker-add.sh family tools | — |
/etc/kopens/rotation.journal | Password rotation progress log (0600). Basis for resuming a failed rotation | Don't touch | — |
Operational scripts — /opt/kopens/plantpulse-platform-docker/
| Path | What |
|---|---|
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.sh | Host-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.yml | Container definition. Environment variables, exposed ports, volumes, memory limits for the data lake |
compose/platform.env.example | The 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.example | The template for the node file |
bin/env.sh directlyOlder 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.
| Volume | Path inside container | What |
|---|---|---|
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/security | TLS 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
| 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'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/rustfs | Storage quartet. Each has bin/, conf/, logs/ |
plantpulse-analytics/spark, hive, gravitino, kyuubi | Analytics quartet |
plantpulse-messaging/kafka, mqtt | The two brokers |
plantpulse-timeseries/engine, dashboard | Time series engine and PlantPulse Dashboard |
plantpulse-cep/, plantpulse-data-gateway/ | Web modules on Tomcat. Config in config/, logs in server/logs/ |
plantpulse-workflow/temporal, kestra | The 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.
| Product | 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 |
The full mapping table is in Where are configuration files — Template list.
Logs
| What | Where | How to view |
|---|---|---|
Boot logs — pd start appends the service launcher output | /var/log/plantpulse-datalake.log | pd logs (BOOT tag) |
| Container-view boot copy | /var/log/plantpulse-boot.log | tail |
| ~40 service logs | Each module's logs/ — list in pd logs --list | pd logs [서비스] |
| Combined container log of all the above | Docker | Host: bin/logs.sh plantpulse-datalake |
| Event journal — who started/stopped/backed up when | plantpulse-datalake-admin-api/logs/pd-events.jsonl | Console events screen, tail |
| Unplanned stop records | /data1/pp-data/pd/downtime/ | pd downtime |
Other locations
| What | Where |
|---|---|
| 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 |