유틸리티 모듈
플랫폼 운영을 지원하는 보조 모듈 모음. 상시 실행되지 않고 필요 시 실행 하는 방식입니다.
컨테이너 이미지에 들어가는 모듈은 정해져 있고, 아래 표의 상당수는 현행 이미지에 포함되지 않습니다. 컨테이너 안에서 해당 경로를 찾으면 없습니다.
| 모듈 | 용도 | 현행 출하본 |
|---|---|---|
| backup | 통합 백업 (PG / Aster TSDB / 파일) | ✅ 데이터레이크 컨테이너에 포함 |
| mirror-maker | 데이터 복제 (HA / DR) | ✅ 별도 컨테이너 — mirror 프로파일로 기본 꺼짐 |
| api | REST API 클라이언트 라이브러리 | ✅ 외부 Java 프로젝트에서 쓰는 라이브러리 (컨테이너와 무관) |
| setup | 초기 모델 일괄 등록 (CSV) | ✅ 자기 이미지로 나옵니다(2026.09) — 자바·빌드 불필요 |
| recovery | 데이터 복구 | ❌ 이미지 미포함 |
| exporter | 시계열 CSV 내보내기 | ❌ 이미지 미포함 |
| migrator | Aster TSDB 데이터 마이그레이션 | ❌ 2026-08-30 제외 |
| lab | Jupyter / Metabase 분석 환경 | ❌ 2026-08-30 제외 |
migrator 와 lab 은 «오케스트레이터가 부르지 않고, 유닛도 없고, 실제로 도는 프로세스도 없다» 는 이유로 이미지에서 명시적으로 빠졌습니다(lab 은 이미지 792MB 를 차지했습니다).
아래 절차가 필요하시면 webmaster@kopens.com 으로 문의해 주세요.
데이터레이크 컨테이너에 포함된 모듈은 컨테이너 안에서 실행합니다.
cd /opt/kopens/plantpulse-platform-docker/bin
./shell.sh
plantpulse-setup
CSV 파일 기반의 사이트 / 자산 / OPC / 태그 모델을 일괄 등록합니다.
2026.09 부터 자기 컨테이너 이미지로 나옵니다 — 자바를 깔 필요도, 빌드할 필요도 없습니다.
# 내 CSV 를 마운트해서 등록
docker run --rm -v "$PWD/csv:/csv" \
docker.kopens.io/pp/plantpulse-setup:latest \
--host ${PP_HOST_IP} --port 80 --user admin --password '<비밀번호>' --dir /csv
# 이미지에 든 예제로 먼저 시험 — 마운트 없이 됩니다
docker run --rm docker.kopens.io/pp/plantpulse-setup:latest \
--host ${PP_HOST_IP} --port 80 --user admin --password '<비밀번호>' \
--dir /opt/kopens/plantpulse-platform/plantpulse-setup/model_example
docker run --rm docker.kopens.io/pp/plantpulse-setup:latest --help
| 항목 | 값 |
|---|---|
| 이미지 | docker.kopens.io/pp/plantpulse-setup:<릴리즈 태그> · :latest |
| CSV 전달 | 호스트 디렉터리를 마운트하고 --dir 에 컨테이너 안 경로를 줍니다 |
| 인코딩 | 기본 MS949. UTF-8 이면 -e CSV_CHARSET=UTF-8 |
| 필수 인자 | --host · --port · --user · --password · --dir (기본값 없음) |
| 프로토콜 | HTTP 전용 — --port 에 80 을 줍니다 |
--port 7003 은 이제 틀립니다API 커넥터 7003 은 2026-09-14 에 제거됐습니다. 지금은 웹과 같은 80 으로 붙습니다 — 7003 을 그대로 쓰면 연결되지 않습니다.
🔴 443 도 쓸 수 없습니다. 이 도구는 평문 HTTP 로만 말합니다(소스에 고정). 443 을 주면 TLS 포트에 평문으로 말을 걸어 붙지 않습니다 — 7003 과 같은 종류의 실패(설치는 끝났는데 연결이 안 됨)가 됩니다.
CSV 파일 순서:
1_SITE_LIST.csv— 사이트 목록2_ASSET_TREE.csv— 에셋 계층3_OPC_LIST.csv— OPC 서버 연결4_TAG_LIST.csv— 태그 정의
plantpulse-backup
PostgreSQL (pgBackRest), Aster TSDB (Medusa), 파일 (Restic) 통합 백업.
cd /opt/kopens/plantpulse-platform/plantpulse-backup/bin
./backup.sh --install # 초기 설정
./backup.sh --postgres # PG Differential (기본)
./backup.sh --postgres full # PG Full
./backup.sh --postgres incr # PG Incremental
./backup.sh --cassandra # Cassandra Differential
./backup.sh --cassandra full # Cassandra Full
./backup.sh --purge # 보관 정책 정리
# 파일 백업
/opt/kopens/plantpulse-platform/plantpulse-backup/etc/run_restic.sh
일정은 이 도구가 관리하지 않습니다. --cron-install · --cron-remove ·
--schedule-install · --schedule-remove 는 2026-09-08 에 은퇴해 지금은 오류를 내고
종료 코드 2 로 끝납니다. 일정은 데이터레이크 DB 의 backup_schedule 테이블에 있고
Quartz 가 발화합니다 — pd backup schedule 로 보고 pd backup schedule set 으로 바꿉니다.
이 도구가 아직 갖고 있는 것은 전체 일시 정지 스위치 하나입니다 —
PP_BACKUP_SCHEDULE_ENABLED=false(일정표는 그대로 두고 발화만 멈춥니다).
상태는 ./backup.sh --schedule-show 로 봅니다.
상세는 백업 및 복구.
plantpulse-recovery
특정 에셋의 시계열 데이터를 기간별로 재처리.
cd /opt/kopens/plantpulse-platform/plantpulse-recovery/bin
./recovery.sh EQUIPMENT_000001 20260101 20260530
plantpulse-exporter
시계열 데이터 CSV 내보내기 + 대용량 dsbulk.
cd /opt/kopens/plantpulse-platform/plantpulse-exporter/bin
# 에셋 단위 CSV 추출
./export.sh EQUIPMENT_000001 20260101 20260530 /tmp
# 테이블 전체 벌크 언로드 (dsbulk)
./bulk-unload.sh pp tm_tag_point
# → /data1/pp-backup/cassandra/bulk/tm_tag_point.gz
# 벌크 로드 (복원)
./bulk-load.sh pp tm_tag_point
plantpulse-migrator
Spark 기반 Aster TSDB 서버 간 마이그레이션 (서버 교체 / 클러스터 이전).
cd /opt/kopens/plantpulse-platform/plantpulse-migrator/bin
./run.sh 192.168.0.41 192.168.0.237 pp.tm_tag_point
plantpulse-mirror-maker
데이터 복제 (HA / DR). 자기 컨테이너로 뜨며, mirror 프로파일에 묶여 있어 기본으로는 뜨지 않습니다.
cd /opt/kopens/plantpulse-platform-docker
# 켜기
docker compose -f compose/docker-compose.yml --profile mirror up -d plantpulse-mirror-maker
# 상태 · 로그
docker compose -f compose/docker-compose.yml --profile mirror ps
bin/logs.sh plantpulse-mirror-maker
설정은 다른 컨테이너와 마찬가지로 compose 의 환경변수로 넘깁니다.
plantpulse-simulator
테스트 / 데모용 시계열 데이터 시뮬레이터입니다. RANDOM(태그 목록을 읽어 초당 N개를 고르게) 또는 CSV(시각이 든 파일을 그 순서대로 재생) 두 방식이고, 2026.09 부터 컨테이너 이미지로 나옵니다.
# 무작위 부하
docker run --rm \
-e API_HOST=${PP_HOST_IP} -e API_TOKEN=<v5 API 토큰> \
-e PP_MQ_USER=<메시징 계정> -e PP_MQ_PASSWORD=<메시징 비밀번호> \
-e SIM_TYPE=RANDOM -e SIM_MPS=1000 \
docker.kopens.io/pp/plantpulse-simulator:latest
# CSV 재생 — 파일을 마운트하고 «컨테이너 안» 경로를 줍니다
docker run --rm -v "$PWD/data:/data" \
-e API_HOST=${PP_HOST_IP} -e API_TOKEN=<토큰> \
-e PP_MQ_USER=<계정> -e PP_MQ_PASSWORD=<비밀번호> \
-e SIM_TYPE=CSV -e SIM_CSV=/data/a.csv,/data/b.csv \
-e SIM_START=TOMORROW -e SIM_SPEED=2.0 \
docker.kopens.io/pp/plantpulse-simulator:latest
API_HOST · API_TOKEN · PP_MQ_USER · PP_MQ_PASSWORD 가 없으면 컨테이너가 뜨지 않습니다 —
「토큰 없이 떠서 아무것도 안 보내는」 상태를 만들지 않기 위한 것입니다.
plantpulse-api
PlantPulse REST API 클라이언트 Java 라이브러리.
plantpulse-api/
├── lib/ # 의존 jar
└── target/
├── plantpulse-api.jar
├── plantpulse-buffer.jar
├── plantpulse-cassandra-3.0.jar
├── plantpulse-cassandra.jar
└── plantpulse-cep-api.jar
외부 Java 프로젝트의 pom.xml / build.gradle 에 의존성 추가 후 사용. 자세한 사용법은 API 사용 매뉴얼 참고.
plantpulse-lab
Jupyter · Metabase 는 오케스트레이터가 기동하지 않았고 실제로 도는 프로세스도 없어, 이미지에서 792MB 를 차지하던 채로 빠졌습니다.
웹 콘솔에 Jupyter 카드가 아직 보일 수 있지만, 그 카드는 이 변경 이전에도 동작하지 않았습니다. 분석 환경이 필요하시면 외부에 별도로 두고 Kyuubi(10000) · PostgreSQL(5432) 로 연결하시는 편을 권합니다.
데이터 사이언티스트 / 개발자를 위한 분석 환경.
plantpulse-lab/
├── jupyter/ # Jupyter Notebook
│ ├── bin/
│ ├── logs/
│ └── notebook/ # 노트북 저장소
└── metabase/ # Metabase (BI 도구)
├── bin/
└── metabase.jar
Jupyter
cd /opt/kopens/plantpulse-platform/plantpulse-lab/jupyter/bin
./start.sh
# 기본 포트 8888
PySpark / cassandra-driver / psycopg2 가 미리 설치되어 있어 즉시 분석 가능.
Metabase
cd /opt/kopens/plantpulse-platform/plantpulse-lab/metabase/bin
./start.sh
# 기본 포트 3001
비개발자를 위한 비주얼 BI 대시보드. PostgreSQL / Kyuubi 직접 연결.