설정 파일은 어디 있나
데이터레이크의 설정은 «출처 둘, 방향 하나» 로 만들어집니다. 운영자가 고치는 파일은 정해져 있고, 컨테이너 안의 설정 파일은 그것을 곱해서 생성한 것입니다.
호스트 /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/<모듈>/conf/… (생성물)
pd start 는 매번 예외 없이 먼저 렌더합니다. 그래서 컨테이너 안 생성물을 손으로 고쳐도 다음 기동에 사라집니다. 2026-09-01 에 실제로 컨테이너 안 cassandra.yaml 을 고쳐 인증을 켰다가, 재생성으로 파일이 되돌아가면서 인증이 통째로 깨진 사고가 있었습니다.
정본 파일 넷
| # | 파일 | 담는 것 | 형식 | 누가 쓰나 |
|---|---|---|---|---|
| 1 | /etc/kopens/plantpulse-platform.env | 시크릿 — 서비스 계정 비밀번호 · API 키 · TLS 비밀번호. 비밀 아닌 공통 값도 여기 적을 수 있습니다 | VAR=값 한 줄에 하나, export 없이. 머리글 두 줄(# generated: · # last rotation:)은 도구가 관리 | install.sh 가 만들고, passwd.sh 가 갱신. 비밀 아닌 줄은 운영자가 직접 |
| 2 | /etc/kopens/platform.node.env | 이 박스에만 참인 값 — PP_MASTER_IP · PP_KAFKA_ADVERTISED_HOST · DOCKER_PP_EXTERNAL_IP · PP_NODE_ID | 같은 형식 | 설치 도구가 틀에서 만들고, 운영자가 직접 |
| 3 | /etc/kopens/conf/*.template | 설정의 형태 — 각 엔진의 설정 파일 원본 33개 | 각 엔진의 문법 + ${PP_변수} 자리표시자 | 첫 기동 때 이미지에서 시드, 그 뒤 운영자가 직접 |
| 4 | (이미지 안) plantpulse-datalake-cli/config/defaults.env | 비밀 아닌 기본값 — 포트 · 계정 이름 · 디렉터리 · TLS 설정 | KEY=value | 제품. 운영자는 고치지 않고 1·2 로 덮습니다 |
사이드카의 비밀번호 줄을 고치는 것만으로는 반영이 끝나지 않습니다. PostgreSQL · Cassandra 처럼 서버 계정이 정본인 값은 서버 쪽도 함께 바꿔야 하고, 순서를 틀리면 플랫폼이 기동하지 않습니다. bin/passwd.sh 가 그 순서를 대신 밟습니다 → 비밀번호 · API 키 바꾸기
값이 결정되는 순서
호스트의 bin/env.sh 가 위에서 아래로 읽는 순서가 곧 우선순위입니다. 뒤에 읽히는 것이 이깁니다.
| 우선순위 | 출처 | 왜 이기나 |
|---|---|---|
| 1 (최상) | /etc/kopens/platform.node.env | 사이드카 다음에 읽히는 무조건 대입 |
| 2 | /etc/kopens/plantpulse-platform.env | VAR=값 무조건 대입 — 셸 export 도 덮습니다 |
| 3 | 호출 셸의 export | 1 · 2 가 그 이름을 안 적었을 때만 |
| 4 (최하) | bin/env.sh 의 ${VAR:-기본값} | 아무도 안 정했을 때만 |
그 값이 compose 를 거쳐 컨테이너에 환경변수로 들어가고, 컨테이너 안에서는 넘어온 값이 defaults.env 를 이깁니다.
export 는 조용히 무시됩니다PP_PG_PASSWORD=새값 bin/up.sh 처럼 셸에서 값을 주는 방법은 사이드카가 아직 없는 노드에서만 통합니다. 사이드카가 이미 그 이름을 들고 있으면 사이드카가 이깁니다. 실제로 이렇게 바꿨다고 믿고 넘어간 사고가 있었습니다.
지금 이 박스의 유효 값과 출처를 보려면 머릿속으로 시뮬레이션하지 말고 이 명령을 치세요. 시크릿은 **** 로 가려집니다.
cd /opt/kopens/plantpulse-platform-docker
bin/env.sh --print
컨테이너 안에는 사이드카가 없습니다
컨테이너에는 /etc/kopens/plantpulse-platform.env 파일이 마운트되지 않습니다. 값은 호스트의 bin/env.sh 가 사이드카를 읽고, compose 가 그것을 환경변수로 컨테이너에 넣는 경로로만 들어갑니다.
그래서 두 가지가 따라옵니다.
- 사이드카를 고친 뒤에는 컨테이너를 다시 만들어야 새 값이 들어갑니다. 호스트의
bin/restart-datalake.sh가 그 일을 합니다. - compose 가 적지 않은 이름은 아무리 사이드카에 적어도 컨테이너에 닿지 않습니다. 어떤 이름이 닿는지는
compose/docker-compose.yml의x-pp-secrets앵커와plantpulse-datalake서비스의environment:블록이 정합니다. 변수 레퍼런스에 «닿는 이름» 만 모아 두었습니다.
pd doctor 를 컨테이너 안에서 치면 사이드카 행이 «파일 없음» 이 아니라 아예 안 나오고, 대신 all required secrets set 행이 실제 측정입니다 — 정상입니다.
템플릿 목록 — 무엇이 어디로 렌더되나
호스트 /etc/kopens/conf/ 의 템플릿 33개(최상위 23 + cluster/ 10)가 아래 위치로 갑니다. 대응표의 정본은 컨테이너 안 plantpulse-datalake-cli/config/render.map 이고, pd config list 가 이 노드의 모드에 해당하는 행을 찍습니다.
| 템플릿 | 렌더 위치 (PP_HOME 기준) | MASTER | WORKER |
|---|---|---|---|
valkey.conf | plantpulse-storage/cache/valkey/conf/valkey.conf | ○ | ○ (cluster/) |
postgresql.conf · pg_hba.conf | plantpulse-storage/db/postgres/conf/ | ○ | ○ (cluster/) |
cassandra.yaml · jvm-server.options | plantpulse-storage/db/cassandra/conf/ | ○ | ○ (cluster/) |
spark-env.sh · spark-defaults.conf · metrics.properties | plantpulse-analytics/spark/conf/ | ○ | ○ |
hive-site.xml · hive-auth.properties | plantpulse-analytics/spark/conf/ | ○ | ○ (cluster/) |
hive-site.xml | plantpulse-analytics/hive/conf/hive-site.xml | ○ | — |
kyuubi-defaults.conf | plantpulse-analytics/kyuubi/conf/ | ○ | ○ |
gravitino-iceberg-rest-server.conf | plantpulse-analytics/gravitino/conf/ | ○ | — |
kafka.properties · kafka-jaas.conf | plantpulse-messaging/kafka/config/kafka.properties · jaas.conf | ○ | — |
hivemq.xml · plantpulse-mq-auth.properties | plantpulse-messaging/mqtt/conf/config.xml · auth.properties | ○ | — |
plantpulse-timeseries-engine.conf | plantpulse-timeseries/engine/conf/ (두 이름으로) | ○ | — |
plantpulse-datalake-admin-api.properties | plantpulse-datalake-admin-api/config/ | ○ | ○ (cluster/) |
workflow.yaml · application.yaml | plantpulse-workflow/temporal/config/ · kestra/config/ | ○ | — |
plantpulse-cep.properties | plantpulse-cep/config/ | ○ | — |
plantpulse-jdbc.properties · plantpulse-data-gateway.properties | plantpulse-data-gateway/config/ | ○ | — |
cluster/ 표시는 WORKER 노드가 /etc/kopens/conf/cluster/ 아래의 다른 템플릿을 쓴다는 뜻입니다. 예를 들어 MASTER 의 valkey.conf.template 에는 replicaof 가 없고, cluster/valkey.conf.template 에는 replicaof ${PP_MASTER_IP} ${PP_REDIS_PORT} 가 있습니다.
템플릿 문법
세 가지뿐입니다.
| 문법 | 뜻 |
|---|---|
${PP_VAR} | 값이 없으면 렌더 전체가 실패합니다(exit 4). 빈 값으로 채우고 지나가지 않습니다 |
${PP_VAR:기본값} · ${PP_VAR:-기본값} | 값이 없으면 기본값 |
시크릿에는 인라인 기본값을 둘 수 없습니다. 옛 렌더러가 빈 값으로 채우고 지나가 비밀번호가 빈 문자열인 Cassandra 가 뜬 적이 있어서, 지금은 빠진 이름을 전부 나열하고 멈춥니다.
렌더되지 않는 설정 — 관리 콘솔 계정
관리 콘솔의 로그인 계정은 어느 템플릿에도 들어가지 않습니다. admin-api 프로세스가 환경변수에서 직접 읽습니다. 디스크에 비밀번호 사본을 하나 더 만들지 않기 위해서입니다.
| 변수 | 어디서 오나 | 기본값 |
|---|---|---|
PP_DATALAKE_ADMIN_USER | defaults.env | admin |
PP_DATALAKE_ADMIN_PASSWORD | 사이드카 | 2026-09-05 이후 설치본은 웹 콘솔 관리자와 같은 개발용 기본값 → 초기 비밀번호 변경. 그 전 설치본은 비어 있어 콘솔이 꺼져 있습니다 |
PP_DATALAKE_ADMIN_API_KEY | 사이드카 | 없음 — 비면 키 인증만 꺼지고 브라우저 로그인은 그대로 |
옛 안내와 다른 점
| 옛 문서 | 지금 |
|---|---|
configure.sh 가 설정을 생성한다 | pd config render (그리고 pd start 가 매번) |
/etc/kopens/conf 가 plantpulse-startup/template 로 마운트된다 | plantpulse-datalake-cli/config/templates 로 마운트됩니다(2026-09-03). 옛 자리는 아무것도 읽지 않는 사본이라 운영자 편집이 렌더에 닿지 않았습니다 |
컨테이너 안 env.sh · env-reset.sh | 없어졌습니다. 값은 호스트가 정하고 compose 가 넘깁니다 |
PP_OPTIONS 로 컴포넌트를 끈다 | 변수 이름은 PD_OPTIONS 로 바뀌었고, 현재 compose 스택은 이 값을 컨테이너에 넘기지 않습니다 → FAQ |
PP_TIER (FULL / DATALAKE / APP) | 2026-09-02 에 삭제됐습니다. 모든 박스는 전체 설치입니다 |