plantpulse-workflow (워크플로우)
역할
장시간 실행 작업과 데이터 파이프라인의 오케스트레이션입니다. 엔진 둘을 함께 운영합니다.
| 엔진 | 용도 |
|---|---|
| Temporal | 분산 워크플로우, 장시간 실행 작업(재시도 · 보상 트랜잭션). 관리 콘솔 자신의 durable 워크플로우도 여기서 |
| Kestra | 선언형 데이터 파이프라인 · 스케줄. 웨어하우스 아카이버가 잡을 제출합니다 |
| 항목 | 값 |
|---|---|
| 모듈명 | plantpulse-workflow |
| 설치 경로 | /opt/kopens/plantpulse-platform/plantpulse-workflow/ |
| Temporal | 7233 (gRPC) · 8233 (웹 UI, HTTP) |
| Kestra | 8380 (웹 UI + API, TLS 전용) · 8391 (관리 엔드포인트, 내부) |
pd 서비스 | workflow — MASTER 만. temporal → kestra |
아카이브 워커는 여기 없습니다 (2026-09-06)
Cassandra → Iceberg 아카이버는 잠시 이 서비스의 세 번째 컴포넌트였다가 플랫폼 이미지의 plantpulse-warehouse 컨테이너로 옮겨졌습니다. 데이터레이크는 인프라이고, «어느 테이블을 언제 어떻게 아카이브하는가» 는 비즈니스 로직이라서입니다 → warehouse 모듈
구성
디렉토리 구조
plantpulse-workflow/
├── temporal/
│ ├── bin/
│ ├── config/workflow.yaml # 생성물 ← /etc/kopens/conf/workflow.yaml.template
│ └── logs/
└── kestra/
├── bin/
├── config/application.yaml # 생성물 ← /etc/kopens/conf/application.yaml.template
└── logs/
Temporal
| 항목 | 값 |
|---|---|
| 포트 | 7233 (frontend gRPC) · 8233 (웹 UI) · 7243 (HTTP API) · 7234/7235/7239 (내부 서비스) |
| 백엔드 | PostgreSQL DB temporal · temporal_visibility, 계정 temporal (PP_TEMPORAL_USER / PP_TEMPORAL_PASSWORD) |
| 광고 주소 | broadcastAddress = PP_TEMPORAL_HOST — 루프백이면 렌더가 거부 |
| 메트릭 | 8244 (127.0.0.1 에만, 관리 콘솔이 읽음) |
PP_TEMPORAL_PASSWORD 는 Temporal 자체 계정이 아니라 백엔드 PostgreSQL 계정입니다. passwd.sh 가 ALTER ROLE 로 바꿉니다.
웹 UI http://<서버IP>:8233/ 에는 로그인이 없습니다. 사설망에서만 열어 두세요.
docker exec plantpulse-datalake bash -c 'cd /opt/kopens/plantpulse-platform/plantpulse-workflow/temporal && ./bin/temporal --address 127.0.0.1:7233 workflow list'
Kestra
| 항목 | 값 |
|---|---|
| 포트 | 8380 — TLS 전용, http:// 는 답하지 않음. / 는 /ui/ 로 리다이렉트 |
| 로그인 | PP_KESTRA_ADMIN_EMAIL / PP_KESTRA_ADMIN_PASSWORD (basic-auth) |
| 백엔드 | PostgreSQL DB kestra, 계정 kestra (PP_KESTRA_DB_USER / PP_KESTRA_DB_PASSWORD) — 로그인 계정과 다른 값 |
| 저장소 | /data1/pp-data/kestra/storage |
두 비밀번호 다 passwd.sh 대상이 아닙니다 → 웹 화면 로그인 계정 — Kestra, 회전되지 않는 값
예제 Flow
id: daily-report
namespace: plantpulse
description: 매일 새벽 2시에 보고서 스크립트 실행
triggers:
- id: every-2am
type: io.kestra.plugin.core.trigger.Schedule
cron: "0 2 * * *"
tasks:
- id: run
type: io.kestra.plugin.scripts.shell.Commands
commands:
- echo "report"
운영 명령
docker exec plantpulse-datalake pd status workflow
docker exec plantpulse-datalake pd restart workflow # Temporal + Kestra
docker exec plantpulse-datalake pd logs --lines 100 workflow
자주 발생하는 문제
| 증상 | 원인 | 조치 |
|---|---|---|
| Temporal 시작 실패 | PostgreSQL 미준비 · temporal 역할 비밀번호 불일치 | pd status storage, passwd.sh PP_TEMPORAL_PASSWORD |
| Kestra 시작 실패 | kestra 역할 비밀번호 불일치 | 사이드카의 PP_KESTRA_DB_PASSWORD — 부팅 때 pd 가 역할에 맞춥니다 |
http://…:8380 이 안 열림 | TLS 전용 | https:// |
| 아카이브가 안 돎 | 웨어하우스 쪽 | pd retention 의 cold_tier · archive_job, 웨어하우스 컨테이너 로그 |
Temporal broadcastAddress 오류 · 렌더 exit 8 | 루프백 주소 | 노드 파일 → 설정 바꾸는 법 |