Skip to main content

plantpulse-workflow (Workflow)

Role

Orchestration of long-running tasks and data pipelines. Two engines operate together.

EnginePurpose
TemporalDistributed workflows, long-running tasks (retry · compensation transactions). The management console's own durable workflows run here too
KestraDeclarative data pipelines · scheduling. The warehouse archiver submits jobs here
ItemValue
Module nameplantpulse-workflow
Installation path/opt/kopens/plantpulse-platform/plantpulse-workflow/
Temporal7233 (gRPC) · 8233 (web UI, HTTP)
Kestra8380 (web UI + API, TLS only) · 8391 (admin endpoint, internal)
pd serviceworkflow — MASTER only. temporal → kestra
Archive worker is not here (2026-09-06)

The Cassandra → Iceberg archiver was briefly a third component of this service, then moved to the plantpulse-warehouse container in the Platform image. The data lake is infrastructure; "which table to archive, when, and how" is business logic → warehouse module

Architecture

Directory Structure

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

ItemValue
Port7233 (frontend gRPC) · 8233 (web UI) · 7243 (HTTP API) · 7234/7235/7239 (internal services)
BackendPostgreSQL DB temporal · temporal_visibility, account temporal (PP_TEMPORAL_USER / PP_TEMPORAL_PASSWORD)
Advertise addressbroadcastAddress = PP_TEMPORAL_HOST — render rejects loopback
Metrics8244 (127.0.0.1 only, read by management console)

PP_TEMPORAL_PASSWORD is not a Temporal account itself but a PostgreSQL backend account. passwd.sh substitutes ALTER ROLE.

The web UI http://<server-ip>:8233/ has no login. Open it only on private networks.

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

ItemValue
Port8380 — TLS only, http:// does not respond. / redirects to /ui/
LoginPP_KESTRA_ADMIN_EMAIL / PP_KESTRA_ADMIN_PASSWORD (basic-auth)
BackendPostgreSQL DB kestra, account kestra (PP_KESTRA_DB_USER / PP_KESTRA_DB_PASSWORD) — different from login credentials
Storage/data1/pp-data/kestra/storage

Both passwords are not passwd.sh targets → Web console login account — Kestra, non-rotatable values

Example 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"

Operations Commands

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

Common Issues

SymptomCauseAction
Temporal startup failsPostgreSQL not ready · temporal role password mismatchpd status storage, passwd.sh PP_TEMPORAL_PASSWORD
Kestra startup failskestra role password mismatchSidecar's PP_KESTRA_DB_PASSWORD — on boot pd aligns the role
http://…:8380 does not openTLS onlyhttps://
Archive not runningWarehouse sidepd retention of cold_tier · archive_job, warehouse container logs
Temporal broadcastAddress error · render exit 8Loopback addressNode file → How to change configuration