관리 콘솔
데이터레이크 노드의 운영 콘솔입니다. 브라우저로 상태 · 지표 · 로그 · 진단 · 설정 · 백업 · 워커를 한 화면에서 보고, 허용된 pd 명령을 실행하고, 같은 주소로 외부 모니터링 시스템(Grafana · Prometheus · Zabbix)에 헬스 API 를 제공합니다.
| 항목 | 값 |
|---|---|
| 백엔드 모듈 | plantpulse-datalake-admin-api |
| 어디서 도나 | plantpulse-datalake 컨테이너 안 — 마스터 · 워커 노드 모두 |
| 주소 (TLS) | https://<서버IP>:4950/ |
| 주소 (평문) | http://<서버IP>:4949/ — 같은 콘솔 · 같은 API |
| 로그인 | PP_DATALAKE_ADMIN_USER(기본 admin) / PP_DATALAKE_ADMIN_PASSWORD |
| 기본 언어 | 영문. ?lang=ko 를 붙이면 한국어 |
이 절의 문서
| 화면 | 무엇을 하나 |
|---|---|
| 이 페이지 | 콘솔 전반 — 접속 · 로그인 · 화면 구성 |
| 배치 | 배치 잡의 상태와 이력 |
| 웨어하우스 | 웨어하우스 적재 현황 |
| 어시스턴트 | 지금 뭐가 문제고, 왜 그렇고, 뭘 하면 되나 — 자연어 질문과 승인 카드 |
접속
브라우저에서 두 주소 중 하나로 들어갑니다. 같은 콘솔이고 스킴만 다릅니다.
https://<서버IP>:4950/?lang=ko # TLS — 권장
http://<서버IP>:4949/?lang=ko # 평문 — 4950 으로 리다이렉트하지 않습니다
로그인 비밀번호와 세션 쿠키가 그대로 흐릅니다. 신뢰할 수 없는 망에서는 반드시 4950 을 쓰세요. 4949 를 남겨 둔 것은 실수가 아니라 선택입니다 — 자체 서명 인증서 경고가 실제로 운영자를 막아 세우는 상자가 있기 때문입니다.
TLS 로 접속하면 자체 서명 인증서 경고가 뜰 수 있습니다. 실제 인증서로 바꾸는 방법은 보안 설정에 있습니다.
로그인
로그인 화면에는 이 노드의 이름과 역할(마스터 / 워커) 이 함께 표시됩니다. 여러 노드를 열어 놓고 작업할 때 어느 상자인지 확인하세요.
| 변수 | 기본값 | 설명 |
|---|---|---|
PP_DATALAKE_ADMIN_USER | admin | 로그인 이름 |
PP_DATALAKE_ADMIN_PASSWORD | 2026-09-05 이후 설치본은 개발용 기본값, 그 전은 비어 있음 | 비어 있으면 콘솔이 열리지 않습니다 |
PP_DATALAKE_ADMIN_API_KEY | 없음 | 로그 엔드포인트를 기계가 호출할 때의 X-API-Key |
비밀번호를 바꾸거나 처음 넣는 방법은 웹 화면 로그인 계정 — 관리 콘솔에 있습니다.
PP_DATALAKE_ADMIN_PASSWORD 가 비어 있다는 뜻입니다. 콘솔만 안 켜지고 데이터레이크는 정상 기동합니다. 장애가 아니라 커미셔닝에서 빠뜨린 것이니, 값을 넣고 재시작하세요.
화면 구성 — 레일과 사이드바

| 번호 | 무엇 |
|---|---|
| ① | 아이콘 레일 — 그룹 사이를 옮깁니다. 대시보드 아이콘의 점 하나가 이 노드의 종합 판정입니다(아래) |
| ② | 한 줄 요약 — 「컴포넌트 N개 모두 정상 · 서비스 N/N · 알람 없음」. 이 줄만 초록이면 더 볼 것이 없습니다. 아래 줄은 이 노드의 이름 · 역할 · 주소 · 노드 수이고, [노드 목록] 이 토폴로지의 노드 탭으로 갑니다 |
| ③ | 데이터 경로 — 기동 순서대로 놓인 단계(메시징 → CEP → 시계열 → 스토리지 → 워크플로 → 분석 → 데이터 게이트웨이)와 단계마다 «실행 중 / 전체» 서비스 수. 화살표는 선언된 경로이지 실제 처리량이 아닙니다 — 실측 처리율은 더 아래 유입 흐름 카드에 있습니다 |
| ④ | 서비스 — ③ 의 단계에 속한 서비스를 같은 순서로 펼쳐 봅니다. «메시징 3/4» 처럼 빈 단계는 여기서 어느 서비스인지 찾습니다 |
| ⑤ | 컴포넌트 헬스 — 전체 · 비정상 · 주의 · 미측정 · 정상 · 멈춤. 미측정은 «정상» 이 아닙니다 |
| ⑥ | 타임라인 — 컴포넌트별로 시간축에 상태를 칠합니다(24시간 / 48시간). 빗금은 기록이 없는 구간입니다 |
| ⑦ | 언어 전환 — EN / KO. 주소에 ?lang=ko 를 붙여도 같습니다 |
알람 카드는 걸린 알람이 있을 때만 ② 와 ③ 사이에 나타납니다(연속 세 번 임계를 넘은 것만). 알람이 없으면 카드 자체를 그리지 않으므로 그림에는 없습니다. ⑥ 아래로는 시스템 게이지 · 유입 흐름 · 부하 · 스토리지 · 최근 이벤트가 이어집니다.
왼쪽의 좁은 세로 띠가 레일이고 그룹 9개가 아이콘으로 놓입니다. 레일은 아이콘만 보여줍니다 — 이름은 마우스를 올리면 툴팁으로 나옵니다.
그룹을 고르면 그 그룹의 화면들이 사이드바로 펼쳐집니다. 단, 화면이 하나뿐인 그룹은 사이드바가 없습니다 — 고를 것이 없는데 칸만 차지하기 때문입니다.
레일의 순서는 장애 때 사람이 묻는 순서입니다 — «지금 이상이 있나» → «어디가» → «무엇이 참인가» → «누구에게 알리나» → «무엇을 바꾸나» → «명령» → «다른 화면으로» → «무슨 일이 있었나».
화면은 모두 22개, 그룹은 9개입니다.
| 그룹 | 구역 | 화면 | 무엇을 답하나 |
|---|---|---|---|
| 개요 | — | 대시보드 | 지금 이상이 있는가 |
| 토폴로지 | — | 토폴로지 (탭: 데이터 흐름 · 노드) | 파이프라인의 어디가 막혔나, 나머지로는 데이터가 흐르나 |
| 관측 | 상태 | 상태 · 메트릭 | 지금의 판정과, 지난 한 시간~이레의 추이 |
| 자원 | 스토리지 · 보존 | 볼륨 · WAL · 복제 슬롯 · 저장소 크기 / 무엇이 언제 지워지는가 | |
| 활동 | 워크플로우 · 이벤트 · 로그 · 진단 · 작업 | 야간 잡이 돌았나, 무슨 일이 있었나 — 이벤트 저널, 서비스 로그, pd doctor, 잡 이력 | |
| 알람 | — | 알람 | 누구에게, 언제 알리는가 |
| 운영 | 설정 | 설정 · API 키 · 인증서 | 템플릿과 렌더 결과의 diff, 템플릿 편집과 되돌리기 · 콘솔이 발행한 API 키 · 인증서 |
| 유지 | 업그레이드 · 워커 | 모듈별 버전, 클러스터 워커에 대해 무엇을 바꿔야 하나 | |
| 백업 | 백업 | 백업 세트 · 스케줄 편집 · 실행 · 복원 | |
| 명령 | — | 명령 | 허용된 pd 동사를 화면에서 실행 |
| 도구 | — | 도구 | 다른 제품 웹 UI 로 가는 카드 |
| 기록 | — | 감사 | 이 콘솔에서 누가 무엇을 바꿨나 |
| 어시스턴트 | — | 어시스턴트 | 지금 뭐가 문제고, 왜 그렇고, 뭘 하면 되나 — 게이트웨이 설정과 승인 카드까지 |
레일의 점 읽는 법
레일의 점은 대시보드 아이콘에 하나뿐입니다. 어느 화면에 있든 「이 노드에 이상이 있나」를 보여 주고, 값은 /api/health 의 status, 즉 서버가 컴포넌트를 종합한 판정 그대로입니다. 자세한 내용은 대시보드에서 봅니다.
| 점 | 뜻 |
|---|---|
| OK | 서버의 종합 판정이 정상 |
| WARN | 서버의 종합 판정이 경고 |
| FAIL | 서버의 종합 판정이 실패 |
| UNKNOWN (회색) | 판정을 믿을 수 없음 — 폴링이 멈췄거나, 서버의 수집기가 멈췄거나, 응답이 없거나, 모르는 판정 |
회색 점은 「정상」이 아니라 「못 쟀다」 입니다. 다른 그룹의 아이콘에는 점이 없습니다. 그 그룹이 정상이라는 뜻이 아니라, 그룹별 상태를 레일에 그리지 않는다는 뜻입니다.
조용한 것은 정상이 아닙니다. 음소거 · 규칙 꺼짐 · 최소 심각도 미만 · 억제 구간 · 채널 없음 — 알람이 소리를 내지 않는 이유는 다섯 가지이고, 콘솔은 그 다섯을 각각 다른 문장으로 알려 줍니다.
화면별로 알아 둘 것
| 화면 | 알아 둘 것 |
|---|---|
| 토폴로지 | 두 탭은 한 시스템의 두 그림입니다 — 데이터 흐름(MQTT → Kafka → 소비자)과 노드(마스터 · 워커). 대시보드가 «이상이 있다» 고 하면 여기서 어느 구간인지 봅니다 |
| 상태 및 정보 → 컴포넌트 | 행을 누르면 컴포넌트 상세로 들어갑니다. pd status 표와 같은 행이고 15초마다 갱신됩니다. 기동 직후 몇십 초의 STOPPED 는 창(window)입니다 |
| 로그 | pd logs --list 가 선언한 파일만 보여 줍니다. 앱 컨테이너(서버 · 배치 · 웨어하우스)의 로그는 여기 없습니다 — 호스트의 logs.sh 를 쓰세요 |
| 진단 | pd doctor 의 결과. «검사 실행» 버튼이 즉시 한 번 더 돌립니다. 한 번에 하나만 받으므로 «busy» 가 뜨면 잠깐 뒤 다시 누릅니다 |
| 작업 | 백업 · 아카이브 · 유지 작업의 이력을 한 곳에서. 백업 화면은 백업만 따로 봅니다 |
| 설정 | «지금 렌더하면 무엇이 바뀌나»(pd config diff)와 «내 템플릿이 이미지 기본값과 다른가»(pd config diff --templates). 템플릿을 화면에서 고치면 리비전이 남아 되돌릴 수 있습니다. 값(비밀번호 · 주소)의 정본은 여전히 호스트입니다 → 설정 바꾸는 법 |
| 업그레이드 | 이미지 태그(/etc/plantpulse-image.env)와 모듈별 버전·리비전(/etc/plantpulse-modules.json). 보고만 하고 올리지 않습니다 → 아래 |
| 워커 | 클러스터 워커에 대해 무엇을 바꿔야 하는지 명령을 보여 줄 뿐, 실행하지는 않습니다. 실행은 호스트에서 합니다 → 클러스터 설치 |
| 백업 | 세트 목록 · 스케줄 · 지금 도는 것. «Schedule editor» 가 pd backup schedule set 을 부릅니다. 일정은 systemd 타이머가 아니라 backup_schedule 표 + Quartz 입니다 → 백업 · 복원 |
| 명령 | 서버가 정한 허용 목록의 pd 동사만 실행됩니다(목록이 화면 오른쪽에 그대로 보입니다). 그 밖의 명령은 컨테이너 셸에서 → pd CLI · 아래 |
| 도구 | 다른 제품의 웹 UI 를 카드로 모아 새 탭으로 엽니다. 주소의 호스트는 지금 접속한 호스트를 따라가므로 어느 상자에서 열든 그 상자의 도구로 갑니다. 이 노드에 없는 서비스의 카드는 그려지지 않습니다 |
| 워크플로우 | Temporal 과 Kestra 둘을 함께 봅니다. 읽기 전용 — 이 화면은 실행·트리거·일시정지·종료를 하지 않습니다. "대상 아님" 은 아직 실행 기록이 없어 판정할 것이 없다는 뜻입니다 |
| 보존 | 테이블 TTL · 토픽 보존 · 콜드 티어 · 아카이브 잡을 한곳에. 「없음」은 만료가 없는 표(카운터·현재값)입니다 |
| 자격증명 | 따로 화면이 없습니다. 상태 및 정보 → 컴포넌트 상세의 카드에서 그 컴포넌트의 값을 한 건씩 보고 바꿉니다 → 아래 |
| 어시스턴트 | 이 노드에 대해 말로 묻고, 승인 카드로 실행합니다. LLM 게이트웨이를 직접 연결해야 합니다 → 어시스턴트 |
| 감사 | 이 콘솔에서 누가 무엇을 바꿨는지. 워커 노드에는 감사 저장소가 없어 항상 «읽을 수 없음» 으로 나옵니다 — 조용한 한 주가 아닙니다 |
주요 화면
토폴로지 — 파이프라인의 어디가 막혔는지. 데이터 흐름과 노드, 두 탭입니다.

상태 및 정보 — 컴포넌트별 판정. pd status 와 같은 행이고 15초마다 갱신됩니다. 맨 아래 컴포넌트 버전 표는 이 노드가 아니라 이 판의 구성입니다 — 공식 버전 · 우리 버전 · 포트 · 라이선스 · 출처 · 모듈. - 는 해당 없음입니다(그대로 쓰는 컴포넌트에는 우리 버전이 없고, 듣는 포트가 없는 것도 있습니다). 컴포넌트 상세에도 같은 값이 나옵니다.

워크플로우 — 야간 아카이브와 배치 플로우가 제때 돌았는지. 엔진 둘을 함께 봅니다: Temporal(Aster TSDB → Iceberg 아카이브)과 Kestra(배치 플로우).

실행은 엔진이 합니다. 이 화면은 트리거 · 일시정지 · 종료를 하지 않습니다 — 보기만
합니다. 스케줄을 바꾸는 자리는 백업 화면(또는 pd backup schedule set)입니다.
보존 — 무엇이 언제 지워지는가. Aster TSDB 테이블 TTL 과 크기, Kafka 토픽 보존, 콜드 티어와 그것을 채우는 아카이브 잡을 한 화면에 모읍니다.

pp.tm_tag_point 의 TTL 이 3650일로 보입니다. 값을 바꾸는 방법은
데이터 보존 기간에 있습니다.
설정 — 「지금 렌더하면 무엇이 바뀌나」와 「내 템플릿이 이미지 기본값과 다른가」.

백업 — 세트 목록 · 일정 · 지금 도는 것.

도구 — 다른 제품 웹 UI 를 카드로 모아 새 탭으로 엽니다.

감사 — 이 콘솔에서 누가 무엇을 바꿨는지.

아직 데이터를 제공하지 않는 화면은 비어 있다고 알려 주면서, 그것이 «이상 없음» 이라는 뜻이 아니라고 함께 적습니다. 빈 화면을 정상으로 읽지 마세요.
관측 그룹의 네 화면
앞의 「주요 화면」이 «무엇이 잘못됐나» 를 다뤘다면, 관측 그룹의 네 화면은 «왜 그런가» 를 답합니다. 넷 다 관측 → 상태 / 자원 / 활동 사이드바에서 옵니다.
메트릭 — 컴포넌트 하나의 측정 이력

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 사이드바 | 관측 그룹의 화면들 — 상태 및 정보 · 메트릭 / 스토리지 · 보존 / 워크플로우 · 이벤트 · 로그 · 진단 · 작업 |
| ② | 좌측 | 컴포넌트 목록 — 하나를 고릅니다 |
| ③ | 목록 아래 | 회색으로 칠해진 컴포넌트의 뜻과, 한 번에 하나만 조회한다는 안내 |
| ④ | 우측 위 | 구간 — 1시간 · 6시간 · 24시간 · 48시간 · 7일 |
| ⑤ | 본문 | 단위별로 묶인 차트 (% · B/S · BYTES · LOAD …) |
대시보드는 아무것도 고르지 않고 읽는 분류 화면이라 하루보다 긴 구간이 없습니다. 이 화면은 반대로 컴포넌트 하나 · 구간 하나를 골라 파고드는 자리입니다.
7일보다 긴 구간과, 데이터레이크 자신이 아닌 «플랜트 데이터» 는 PlantPulse Dashboard 의 몫입니다. 이 화면에 「PlantPulse Dashboard 에서 열기」 링크가 없는 것은 일부러입니다 — 있는지 확인되지 않은 대시보드로 보내는 링크는 링크가 없는 것만 못합니다.
컴포넌트가 회색으로 칠해지는 것은 그 컴포넌트에 대해 응답이 도착했고 그 응답이 「수집 안 됨」이었을 때뿐입니다. 아직 아무도 열어 보지 않은 컴포넌트에는 아무 표시도 하지 않습니다 — 짐작해서 칠하면 그것이 또 하나의 «지어낸 판정» 이 되기 때문입니다.
한 번에 한 컴포넌트만 조회합니다. 다른 컴포넌트를 고르면 요청이 옮겨 갈 뿐 늘지 않습니다.
스토리지 — 디스크에 무엇이 있고 얼마나 머무나

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 사이드바 | 자원 구역 — 스토리지 · 보존 |
| ② | 맨 위 | 볼륨 — 런타임 트리 · 데이터 · 임시 · 백업 각각의 사용률과 판정 |
| ③ | 그 아래 | PostgreSQL WAL 과 복제 슬롯 — PG_WAL · MAX_SLOT_WAL_KEEP_SIZE · MAX_WAL_SIZE · 역할, 그리고 슬롯 표 |
| ④ | 좌측 아래 | Aster TSDB 디스크 — 데이터 · 커밋 로그 · 스냅샷과 키스페이스별 크기 |
| ⑤ | 우측 아래 | Kafka 디스크 — 설정 파일 · 로그 디렉터리 · 크기 · 보존 · 가장 오래된 세그먼트 · 다음 정리 예상 |
2026-09-03 에 실제로 있었던 일입니다. 복제 슬롯 replica_worker_1 이 비활성인 채로
1.4 GB 의 WAL 을 붙잡고 있었고 max_slot_wal_keep_size 는 -1(무제한)이었습니다.
제품의 어느 화면도 그것을 말해 주지 않아, 운영자가 알아챌 방법은 디스크가 가득 차는
것뿐이었습니다.
그래서 화면 순서가 이렇습니다 — 볼륨(차고 있나) → WAL·슬롯(무엇이 붙잡고 있나) → 저장소 크기와 보존(줄어들기는 하나). 슬롯 표의 «활성» 과 «붙잡은 WAL» 을 함께 보세요.
이벤트 — 이 노드에서 일어난 일

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 상단 | 범위 — 24시간 / 7일 |
| ② | 그 옆 | 종류 필터 — 알람 발생·해소 · 시작·시작됨 · 정지·정지됨 · 재시작 · 백업 시작·종료 · 작업 시작·종료 · 부팅 · 배포 · 운영자 · PD |
| ③ | 카드 머리 | 이벤트 (N) — 지금 범위에 걸린 건수 |
| ④ | 표 머리 | 시각 · 종류 · 컴포넌트 · 심각도 · 메시지 |
| ⑤ | 본문 | 실패한 백업처럼 ERROR 인 줄은 빨강으로 갈립니다 |
감사 기록이 같은 화면 아래에 붙습니다. 「무슨 일이 있었나」와 「우리가 무엇을 했나」는 장애 중에는 같은 질문이라, 두 화면에 나눠 두면 시계를 두 번 읽어야 합니다. 같은 시간 범위로 아래에 이어 붙여, 01:25 의 재시작과 그것을 시킨 운영자가 나란히 놓입니다.
저장소가 memory 인 노드는 최근 수백 건만 RAM 에 들고 있다가 재시작하면 잃습니다.
화면이 그렇다고 한 줄로 알려 줍니다 — 반쪽짜리 이력을 온전한 것처럼 읽지 마세요.
읽지 못한 이벤트 저장소를 «조용한 밤» 처럼 그리지 않습니다. 로딩 · 이벤트 있음 · 범위가 빈 것 · 아직 제공되지 않는 엔드포인트 · 못 잰 것(이유 포함) 다섯을 각각 다르게 그립니다.
알람 — 무엇을 알람으로 셀지, 그리고 어디로 알릴지

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 맨 위 | 활성 알람 — 지금 걸린 것. 없으면 「활성 알람이 없습니다」 |
| ② | 가운데 | 규칙 카드 |
| ③ | 표 머리 | 컴포넌트 · 알림 · 연속 · 억제(초) · 이상일 때 · 출처 · 동작 |
| ④ | 한 줄 | 컴포넌트 하나의 규칙. [고치기] 로 그 줄만 바꿉니다 |
| ⑤ | 아래 | 채널 카드 + [채널 추가] — 「켜진 채널 N개」 |
| ⑥ | 그 아래 | 채널이 없으면 그렇다고 말합니다 |
세 카드가 한 화면에 있는 것은 한 질문을 세 번 묻는 것이기 때문입니다 — 지금 이상이 있나(활성) · 무엇을 이상이라 부르기로 했나(규칙) · 누가 그것을 듣나(채널). 셋을 나누면 조용히 비어 있을 수 있는 세 번째를 아무도 열어 보지 않습니다.
활성 알람이 소리를 내지 않는 이유는 다섯이고, 화면은 각각을 다른 문장으로 적습니다.
| 화면 문구 | 뜻 |
|---|---|
| 음소거됨 | 그 알람을 사람이 껐다 |
| 규칙이 꺼져 있음 | 규칙 표의 «알림» 이 꺼짐 |
| 최소 심각도 미만 | 규칙의 «이상일 때» 기준에 못 미침 |
| 억제 구간 안 | 규칙의 «억제(초)» 창 안에 있음 |
| 채널이 없음 | 내보낼 곳이 없음 |
머리에 「그중 N개가 조용합니다」 가 함께 나옵니다. 하나의 «무음» 뱃지로 뭉뚱그리지 않는 이유는, 다섯 가지 대처가 각각 다르기 때문입니다.
그리고 설정을 읽지 못한 것을 «설정이 없다» 로 그리지 않습니다. 서버가
store: "NA" 와 이유를 주면 표 위에 그 문장을 적습니다 — 갓 설치한 것처럼 빈 화면을
그리지 않습니다. 설정을 저장할 수 없는 노드에서는 편집 버튼이 아예 사라집니다.
눌리는 회색 버튼은 「저장했다」고 답하고 아무것도 바꾸지 않기 때문입니다.
활동 그룹의 네 화면 — 무슨 일이 있었나
작업 — 오래 걸린 일 전부를 한 원장에

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 맨 위 | 지금 실행 중 — 없으면 없다고 말합니다 |
| ② | 그 아래 | 종류 · 상태 필터 — 백업 · 복원 · 복원 계획 · 덤프 · 진단 · 시작 · 정지 · 재시작 · 설정 렌더 · PD / 실행 중 · 성공 · 실패 · 알 수 없음 |
| ③ | 카드 머리 | 이력 (N) |
| ④ | 표 머리 | 상태 · 종류 · 대상 · 시작 · 소요 · 주체 · 출처 · 메시지 |
| ⑤ | 실패 행 | 실패는 이유까지 한 줄에 — 예: 「exit 0 인데 저장소가 자라지 않았다 — 아무것도 쓰이지 않았다」 |
| ⑥ | 알 수 없음 행 | 「pd restart 는 완료 줄을 쓰지 않는다 — 결과가 저널에 없다」 |
| ⑦ | 출처 열 | 백업 원장 / pd 저널 — 어느 장부에서 온 줄인지 |
백업 · 복원 · 덤프 · pd doctor · 서비스 조작은 모두 몇 분씩 걸리는데, 끝나면 서로 다른
곳에 기록이 남았습니다 — 콘솔의 작업 원장, 백업 원장, 그리고 브라우저에서 시작하지
않은 실행에 대한 pd 자신의 저널. 화면마다 자기 몫만 보여 주니 「오늘 이 상자에서 무엇이
돌았고 잘 됐나」 는 감사 로그로만 답할 수 있었는데, 감사 로그는 HTTP 호출을 적지
결과를 적지 않습니다.
별도의 결과로 그립니다. 예컨대 pd restart 는 완료 줄을 남기지 않아 결과가 저널에
없습니다 — 그것을 성공으로 칠하면 거짓말이고 실패로 칠해도 거짓말입니다.
여기서는 아무것도 시작·취소·재시도하지 않습니다. 그 일들은 확인 절차와 영향 범위가 이미 적혀 있는 화면(백업 · 진단)에 있습니다. 취소 버튼이 없는 것은 이 서버에 실행을 취소하는 엔드포인트가 없기 때문입니다.
로그 — 이 노드에 «있는» 로그

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 좌측 머리 | 로그목록 |
| ② | 첫 줄 | 기동 뱃지가 붙은 부팅 로그 |
| ③ | 목록 | 컴포넌트 · 파일명 · 크기 · 마지막 갱신 |
| ④ | 우측 머리 | 로그내용 |
| ⑤ | 찾기 | 문자열 — 리터럴이고 정규식이 아닙니다 · 레벨 칩 (TRACE · DEBUG · INFO · WARN · ERROR) |
| ⑥ | 기간 | 부터 ~ 까지 · [검색] · [지우기] |
| ⑦ | 우상단 | 줄바꿈 토글 |
클라이언트는 경로를 말하지 않습니다. 서버가 발급한 id 를 보내고 경로는 서버가
들고 있습니다 — 빠져나갈 ?path= 같은 파라미터가 아예 없습니다.
로그 본문은 텍스트로만 그려집니다. 로그 한 줄에 <script> 가 들어 있을 수 있고,
그것을 실행하는 로그 뷰어는 운영 콘솔에 뚫린 구멍이기 때문입니다.
결과가 둘이 아니라 셋입니다 — 읽었다 / 서버가 pd 에게 물어보지 못했다 /
선언은 됐는데 파일이 없다. 뒤의 둘은 「이 노드에 로그가 없다」 나 「빈 파일」 이 아니라
못 쟀다로 그립니다.
목록에 나오는 것은 pd logs --list 가 선언한 파일뿐입니다. 앱 컨테이너(서버 · 배치 ·
웨어하우스)의 로그는 여기 없습니다 — 호스트의 logs.sh 를 쓰세요.
진단 — pd doctor 가 잰 것

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 제목 옆 | 모드 — MASTER / 워커 |
| ② | 안내 | 「마지막 실행」이라는 것과 [검사 실행] 버튼 |
| ③ | 그 아래 | 진단 결과 (언제 잰 것인지) |
| ④ | 요약 | 실패 · 대상 아님 · 통과 · 검사 수 |
| ⑤ | 그룹 카드 | inputs · tools · … 그룹별로 갈라 놓습니다 |
| ⑥ | 표 머리 | 판정 · 검사 · 내용 |
pd doctor 는 검사를 전부 돌려 3초쯤 걸리므로 주기적으로 돌리지 않습니다. 화면의
결과는 이 노드가 들고 있는 마지막 실행이고, ③ 의 시각이 그것을 언제 쟀는지 말합니다.
다시 재려면 [검사 실행] 을 누르세요 — 한 번에 하나만 돌아서 「busy」가 뜨면 잠깐 뒤
다시 누릅니다.
답이 다섯이고 각각 다르게 그립니다 — 엔드포인트가 아직 없음 / 세션 끊김 / 요청 실패 / 명령이 아예 돌지 못함(사유 필수) / 명령은 돌았는데 검사가 0건.
특히 뒤의 둘이 중요합니다. 문서 상태가 na 인 것은 「전부 통과」가 아닙니다 — 아무것도
재지 못한 것이고 사유가 반드시 붙습니다. 검사 목록이 빈 것은 또 다른 셋째입니다.
둘 중 어느 것이든 빈 패널로 그리면 아무것도 재지 않은 화면에서 「이상 없음」을 읽게
됩니다.
「대상 아님」 항목에는 행마다 사유가 붙습니다 — 화면이 그렇게 안내합니다.
워커 — 명령을 «보여 줄» 뿐입니다

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 카드 머리 | 워커 (잰 시각) |
| ② | 표 머리 | 워커 · 주소 · 명부 · 링 · POSTGRESQL · 슬롯 · REDIS · 헬스 · 상태 |
| ③ | 한 줄 | 워커 하나. 복제 슬롯 이름과 뒤처진 양까지 한 줄에 |
| ④ | 그 아래 | 워커 헬스 — 펼치면 상세 |
| ⑤ | 다음 카드 | 무엇을 쟀나 |
| ⑥ | 통과 항목 | 워커 명부(/etc/kopens/workers.roster) · Aster TSDB 링 · PostgreSQL · Redis 복제본 · 워커 헬스 에이전트 · 이 노드 자신의 주소 |
| ⑦ | 대상 아님 | 워커 컨테이너 · 워커 볼륨 — 사유가 그대로 적힙니다 |
워커를 넣고 빼는 명령(worker-add.sh · worker-decommission.sh · worker-remove.sh)은
Docker 데몬 · 명부 파일 · compose 오버레이를 건드리는데, 그 셋은 전부 호스트에
있습니다. 이 화면 뒤의 API 는 데이터레이크 컨테이너 안에서 돌고 Docker 소켓이 없습니다.
그래서 넷으로 구분을 지켜 둡니다 —
- 동사 모양의 컨트롤이 없습니다. 화면의 유일한 버튼은 복사입니다
- 모든 명령은 「호스트에서 실행」 이라는 제목과 작업 디렉터리를 달고 나옵니다
- 명령이 화면에 있는 동안은 읽기 전용 안내가 늘 함께 있고, 그 문구는 서버의 것 입니다 — 화면이 API 의 주장과 어긋날 수 없게
- 위 셋이 깨지면 빌드가 실패합니다
바꿀 것이 없으면 명령 카드 자체가 나오지 않습니다 — 위 그림이 그 상태입니다.
위 그림의 워커 컨테이너 · 워커 볼륨이 그렇습니다. 사유가 그대로 적혀 있습니다 — Docker 소켓이 이 컨테이너에 마운트되지 않아 여기서는 들여다볼 수 없다는 뜻이지, 문제가 없다는 뜻이 아닙니다.
운영·명령 두 화면과 자격증명
이것들은 바꾸는 쪽에 가까워, 「무엇을 보여 주는가」보다 **「무엇을 하지 않는가」**가 더 중요합니다.
업그레이드 — 보고만 한다

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 사이드바 | 운영 그룹 — 설정 / 업그레이드 · 워커 / 백업 |
| ② | 카드 머리 | 지금 이 노드 |
| ③ | 이미지 태그 | 빌드된 이름 · build.version · 굽기 커밋 · 빌드 날짜 · 읽은 곳(/etc/plantpulse-image.env) · 판정 |
| ④ | 그 아래 | 이미지 다이제스트는 호스트에서 확인한다는 설명 — 이미지 안에서는 알 수 없습니다 |
| ⑤ | 다음 카드 | 이 이미지를 이루는 프로젝트 — 「N 중 M 개가 여기서 리비전을 밝힙니다」 |
| ⑥ | 표 | 프로젝트 · 판정 · 버전 · 리비전 · 읽은 곳(MANIFEST · build-info.json · dist.env … 프로젝트마다 다릅니다) |
서버로 나가는 유일한 버튼은 사전 점검이고 그것도 읽기 전용 진단(pd doctor)입니다.
명령 블록에 달린 컨트롤은 복사 하나뿐이며, 그 버튼의 이름은 어떤 언어에서도
「복사」입니다 — 「실행」도 「적용」도 아닙니다.
그리고 「최신입니다」 류의 문장은 번들에 아예 들어 있지 않습니다. 이 노드는 자기가 돌고 있는 이미지 태그를 볼 수도, 나와 있는 버전을 조회할 수도 없습니다. 안심시키는 문장은 지어낸 말이 되고, 그것을 읽은 운영자는 더 찾아보기를 그만둡니다 — 이 화면이 할 수 있는 가장 위험한 거짓말이라 아예 만들지 않았습니다.
pd doctor는 측정에 3초 남짓 걸려 주기적으로 돌리지 않습니다. 버튼을 누르면 잡으로 돌고 그 잡을 폴링합니다.
명령 — 셸이 아니다

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 맨 위 | 상시 안내 — 「정해진 명령만 실행합니다」 |
| ② | 터미널 머리 | 콘솔 이름과 상태 점 — 준비 · 전송 중 · 스트리밍 · 끊김 |
| ③ | 본문 | 출력(스크롤백 · ANSI 색) |
| ④ | 맨 아래 줄 | 프롬프트 — Tab 완성 · ↑↓ 기록 · Ctrl+L 지우기 |
| ⑤ | 우측 머리 | 「읽기 전용 N개, 노드를 바꾸는 것 M개」 |
| ⑥ | 우측 | 읽기 전용 동사들 (help version status storage flow env doctor config list config diff node status logs --list backup list backup status backup schedule) |
| ⑦ | 그 아래 | 노드를 바꿈 — 빨간 테두리로 갈라 둡니다 (config render) |
느낌만 터미널입니다 — 기록 · 스크롤백 · ANSI 색 · Tab 완성. 실제로 도는 것은 서버가
강제하는 pd 허용 목록뿐입니다.
이것을 셸로 오해한 사람은 거절을 «버그» 로 읽습니다. 그래서 안내가 스크롤백의 색깔 있는 한 줄이 아니라 화면에 늘 떠 있는 요소입니다 — 스크롤로 밀려 올라간 경고는 더 이상 경고가 아닙니다.
허용 목록은 화면이 뜰 때마다 서버에서 받아옵니다. 문서나 코드에 사본을 두지 않습니다 — 사본은 언젠가 어긋나고, 그때 운영자가 읽는 것은 어긋난 쪽입니다. 목록을 못 받으면 자동완성이 꺼지고 그렇다고 말합니다 — 짐작한 목록으로 대신하지 않습니다.
노드를 바꾸는 명령은 확인을 받고서야 실행됩니다. 그리고 거절당하면 서버가 준 거절 사유가 그대로 화면에 나옵니다 — 「실패」로 뭉뚱그리면 제품의 안전장치가 원인 모를 오류로 보이기 때문입니다.
화면 안내 그대로입니다 — 「이 출력의 자격증명은 서버를 떠나기 전에 가려집니다」. 브라우저가 받아서 감추는 것이 아니라, 애초에 오지 않습니다.
자격증명 — 컴포넌트 상세의 카드
자격증명은 그 값을 쓰는 컴포넌트의 페이지에서 보고 바꿉니다. 별도의 자격증명 화면은 없습니다. 상태 및 정보 화면에서 컴포넌트 행을 눌러 상세로 들어가면 자격증명 카드가 있고, 서버가 그 컴포넌트에 대어 주는 자격증명이 없으면 카드도 나오지 않습니다.
| 열 | 내용 |
|---|---|
| 항목 | 그 값이 무엇인가 — 관리자 계정 · 내부 API 키 등 |
| 환경변수 | 변수 이름 |
| 계정 | 계정 이름. 읽기 전용입니다 |
| 비밀번호 / 키 | 점으로 가려져 있고, 값 보기로 그 한 건만 드러냅니다 |
| 접속 확인 | 접속 확인됨 · 값이 맞지 않음 · 확인 못 함 (연결 안 됨) · 접속 확인 대상 아님 |
| 마지막 변경 | 마지막으로 바뀐 시각 |
| 끝 | [변경], 또는 바꿀 수 없는 사유(잠김) |
카드 아래에는 이 컴포넌트의 최근 변경 요청 셋이 나오고, 실패한 요청은 [다시 실행] 할 수 있습니다. 전체 기록은 감사 화면에 있습니다.
목록에는 민감한 값이 실려 있지 않습니다. 값 보기를 누르면 그 변수 이름 하나로 따로 요청을 보내 값 하나만 받아 옵니다. 이 요청은 POST 이므로 감사에 남고, 이름이 주소에 실리지도 않습니다.
[변경] 은 값을 바로 바꾸지 않습니다. 패널이 진행 순서를 먼저 보여 주고, 생성 (32자) 또는 값 입력을 고른 뒤 콘솔 비밀번호와 변수 이름을 다시 입력해야 대기열에 들어갑니다.
- 새 값을 암호화해 저장하고 변경을 대기열에 넣습니다
- 데이터레이크 안에서, 이 값을 확인하거나 읽는 곳에 적용합니다
- 데이터레이크의 모든 서비스를 새 값으로 다시 띄웁니다 — 수 분 중단됩니다. 이 값을 받아 쓰는 다른 제품은 자기 컨테이너를 다시 만들 때 새 값을 받습니다
- 각 컴포넌트가 새 값으로 접속되는지 확인합니다. 단계가 실패하면 요청은 실패로 남고, 같은 값으로 다시 실행합니다
콘솔은 계정이 하나이고 역할이 없어, 로그인한 사람은 모든 자격증명을 바꿀 수 있습니다. 비밀번호와 변수 이름을 다시 받는 것이 그 대신의 안전장치입니다. 비밀번호와 새 값이 지나가므로 4950(TLS) 에서 하세요.
생성된 값은 요청했을 때 한 번만 보입니다. 다시 표시할 수 없습니다.
값 칸의 빈 값은 정말로 비어 있다는 뜻이고, 여기서 못 읽음은 이 콘솔이 그 값을 읽지 못했다는 뜻입니다. 잠긴 행에는 사유가 붙습니다 — 계정 이름은 바꾸지 않음, 다른 값에서 계산됨, 바꿀 현재 값이 없음, 바꾸는 도구가 아직 없음.
호스트에서 바꾸는 절차는 비밀번호 바꾸기에 있습니다.
도구 화면의 카드
| 카드 | 주소 | 무엇 |
|---|---|---|
| CEP | https://<호스트>:7401/ | EQL 규칙과 그것이 매칭한 이벤트 |
| PlantPulse Dashboard | https://<호스트>:3000/ | 시계열 데이터의 대시보드 |
| Timeseries Engine | https://<호스트>:7801/ | 시계열 데이터가 아니라 엔진 자체의 관리 화면 |
| Spark | http://<호스트>:4440/ | Spark 마스터 · 워커 · 실행 중인 애플리케이션 |
| Temporal | http://<호스트>:8233/ | 워크플로우 실행과 이력 |
| Kestra | https://<호스트>:8380/ | 데이터 파이프라인 — 플로 · 실행 · 로그 |
| RustFS | http://<호스트>:9001/ | 오브젝트 스토리지 — 버킷 · 객체 · 액세스 키 |
| Data Gateway | https://<호스트>:5501/ | SQL 실행 콘솔. 옛 SQL 도구 카드는 이것으로 합쳐졌습니다(2026-09-07) |
카드가 여는 도구 중 셋은 사용법을 따로 정리해 두었습니다 — 데이터 게이트웨이 콘솔 · 시계열 분석기 · CEP 콘솔.
TLS 쌍둥이 포트가 있는 화면은 TLS 쪽으로 링크됩니다. 이 콘솔이 TLS(4950)라, 평문 주소를 건네지 않기 위해서입니다.
콘솔이 pd 를 얼마나 자주 부르나
콘솔의 화면은 요청마다 pd 를 돌리지 않습니다. 백엔드의 수집 루프가 한 번에 하나씩 돌리고 마지막 문서를 캐시하며, 화면은 그 캐시를 읽습니다.
| 동사 | 주기 |
|---|---|
pd status --json · pd logs --list | 15초 |
pd node status --json · pd storage --json | 30초 |
pd flow --json · pd config diff --json · pd env --json | 60초 |
pd doctor --json · pd retention --json · pd config diff --templates --json | 300초 |
주기대로면 60초 중 약 46초가 pd 를 돌리는 데 쓰입니다. 그래서 콘솔이 떠 있는 상자에서 pd status 가 가끔 느린 것은 정상입니다.
헬스 API
콘솔이 그리는 화면은 전부 /api/* 위에 있고, 전체 목록과 스키마는 콘솔이 /api/openapi.json 을 읽어 API 표로 보여 줍니다.
curl -kfsS https://<서버IP>:4950/api/health | jq # TLS
curl -fsS http://<서버IP>:4949/api/health | jq # 평문 — 같은 API
docker exec plantpulse-datalake curl -kfsS https://127.0.0.1:4950/api/health | jq # 컨테이너 안 — 어떤 구성에서도
curl -kfsS https://<서버IP>:4950/api/services | jq # 서비스 목록과 상태
호스트의 status.sh · ops-check.sh · doctor.sh · stack-verify-boot.sh 가 모두 이 /api/health 를 읽습니다. /api/health 는 인증 없이 답하고, 그 밖의 API 는 로그인 세션이나 X-API-Key(로그 엔드포인트)가 필요합니다.
Prometheus 연동
https://<서버IP>:4950/metrics 를 스크레이프합니다. 자체 서명 CA 면 insecure_skip_verify 를 켭니다. 플랫폼 동봉 PlantPulse Dashboard(3000)나 외부 Grafana 에서 데이터 소스로 연결하세요.
자주 발생하는 문제
| 증상 | 원인 | 조치 |
|---|---|---|
| 콘솔이 열리지 않음 · «설정되지 않았습니다» | PP_DATALAKE_ADMIN_PASSWORD 가 비어 있음 | 웹 화면 로그인 계정 |
| 4949 는 되는데 4950 이 안 됨 | 인증서 문제 | 브라우저 경고를 확인하거나 보안 설정에서 인증서 교체 |
| 헬스 엔드포인트 응답 없음 | 데이터레이크 컨테이너 이상 | 호스트에서 status.sh → logs.sh plantpulse-datalake |
| 화면 전체가 «Not measured» | 폴링이 멈췄거나 옛 이미지 | pd env 의 IMAGE_BUILT_AT 을 봅니다. 2026-09-04 이전 admin-api 는 «Another job is already running» 을 자주 냈습니다 |
| 도구 카드가 안 그려짐 | 그 서비스가 이 노드에 없음(워커) 또는 폴링 미응답 | 마스터 노드의 콘솔로 |
| Prometheus 스크레이프 5xx | 백엔드 모듈 다운 | status.sh 로 의존 모듈 확인 |
| 감사 화면이 «읽을 수 없음» | 워커 노드 | 정상 — 마스터에서 보세요 |
관련 문서
- 웹 화면 로그인 계정
pdCLI — 콘솔이 보여 주는 것의 원본- 시스템 모니터링 — 각 웹앱의 readiness 헬스체크
- 포트 및 서비스 관리