plantpulse-workflow (ワークフロー)
役割
長時間実行ジョブとデータパイプラインのオーケストレーションです。エンジン2つを同時に運用します。
| エンジン | 用途 |
|---|---|
| Temporal | 分散ワークフロー、長時間実行ジョブ(再試行・補償トランザクション)。管理コンソール自身のdurableワークフローもここで |
| Kestra | 宣言型データパイプライン・スケジュール。ウェアハウスアーカイバーがジョブを提出します |
| 項目 | 値 |
|---|---|
| モジュール名 | plantpulse-workflow |
| インストールパス | /opt/kopens/plantpulse-platform/plantpulse-workflow/ |
| Temporal | 7233 (gRPC) · 8233 (Web UI, HTTP) |
| Kestra | 8380 (Web UI + API、TLS専用) · 8391 (管理エンドポイント、内部) |
pd サービス | workflow — MASTER のみ。temporal → kestra |
アーカイブワーカーはここにはありません (2026-09-06)
Aster TSDB → Iceberg アーカイバーは一時的にこのサービスの3番目のコンポーネントでしたが、プラットフォームイメージの plantpulse-warehouse-web コンテナに移されました。データレイクはインフラであり、「どのテーブルをいつ・どのようにアーカイブするか」はビジネスロジックだからです → 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 (Web 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 に変更します。
Web UI http://<server-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 の対象ではありません → Web画面ログインアカウント — Kestra, ローテーションされない値
フロー例
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 | ループバックアドレス | ノードファイル → 設定を変更する方法 |