Docker インストール
概要
このページでは、PlantPulse プラットフォームを Docker Compose スタックとして手動(ステップバイステップ)でインストールする方法を案内します。
一般的な環境では、ワンラインインストールを推奨します。ワンラインインストールは、パッケージのダウンロードから環境の自動検知、インストール、ブート検証までを一括で処理します。以下の場合にのみ、このページの手動手順を使用してください。
- 各インストールステップを直接レビューおよび承認して進行する必要がある場合(セキュリティ審査、変更管理手続きなど)
- 環境変数(
bin/env.sh)を自動検知値ではなく、任意の値で直接指定する必要がある場合 - インターネットが遮断された閉域網環境にインストールする場合 → 閉域網インストール
インストール構成 — 9つのコンテナ
プラットフォームは docker compose スタック1つで動作します。正本は compose/docker-compose.yml であり、運用スクリプトもすべてこのファイルを通じてコンテナを操作します。
| コンテナ | レイヤ | 役割 |
|---|---|---|
plantpulse-certs | 証明書 | TLS資材を生成し、常時起動して有効期限を監視します。(healthy) が正常です |
plantpulse-datalake | インフラ | ストレージ・メッセージング・分析・CEP・SQL・モニター |
plantpulse-server-web | アプリケーション | Webコンソール |
plantpulse-batch-web | アプリケーション | バッチ |
plantpulse-warehouse-web | アプリケーション | データウェアハウス |
plantpulse-plugin-opcua | アプリケーション | OPC-UA サーバプラグイン (11004 / 11005) |
plantpulse-plugin-aasx | アプリケーション | AASX サーバプラグイン |
plantpulse-ha | アプリケーション | 二重化リカバリデーモン (10210) |
plantpulse-proxy | 엣지 | ユーザーがアクセスする唯一の入口 (80 / 443 / 1883 / 1884) |
docker ps で 9つすべてが (healthy) と表示されれば正常です。
この他にミラーリング用の plantpulse-mirror-maker が compose に定義されていますが、mirror プロファイルに紐付いているため、デフォルトでは起動しません。
2026-08-29 以前は、すべての構成要素が plantpulse-platform コンテナ1つで動作する「モノリス」構成を選択できましたが、この構成は廃止され、選択変数(PP_TOPOLOGY)と compose ファイルもあわせて削除されました。現在は選択肢はありません — bin/up.sh が上記のスタックを起動します。
旧ランブックに残っている docker logs plantpulse-platform のようなコマンドは、その名称のコンテナが存在しないため動作しません。 代替コマンドは 運用コマンド要約 にあります。
アプリごとにコンテナを分けた最大の目的は OOM 隔離です。あるアプリがメモリを使い切っても、他のアプリとインフラは生存し、アプリ単位での再起動やロールバックが可能です。
事前準備
インストールを開始する前に、以下の事項を確認してください。
| 項目 | 要求事項 |
|---|---|
| アカウント権限 | root (または sudo 権限)。インストールスクリプトが OS 設定と Docker デーモンを構成します |
| オペレーティングシステム | RHEL · Rocky Linux · Oracle Linux 8.x · 9.x · 10.x, Ubuntu 20.04+, Amazon Linux 2/2023 |
| Docker | Compose v2 が必要です (docker compose — ハイフンなしの形式)。install.sh がなければインストールします |
| データディスク | /data1 パスに大容量ディスクのマウントを推奨 — Docker データ(/data1/docker-data)とプラットフォームデータボリュームがこのパスを使用します |
| レジストリアクセス | docker.kopens.io (イメージレジストリ)、product.kopens.io (インストールパッケージ) に HTTPS アクセス可能である必要があります。アクセスが遮断された環境は 閉域網インストール を利用してください |
| レジストリ認証情報 | docker.kopens.io ログイン認証情報 (KOPENS 運用チームより発行) |
ディスクパス案内: 別途データディスクがない場合、ルートディスクに
/data1ディレクトリを作成しても動作しますが、運用環境では専用ディスクを/data1にマウントすることを推奨します。
手動インストール手順
ステップ 1: インストールパッケージのダウンロード
ダウンロードサーバからインストールパッケージ (tar.gz) を取得し、標準パスに展開します。Git clone や別途ツールのインストールは不要です。
sudo -i
# 표준 설치 경로 생성 후 패키지 다운로드 + 압축 해제
mkdir -p /opt/kopens/plantpulse-platform-docker
curl -fsSL "https://product.kopens.io/plantpulse-platform/plantpulse-platform-docker.tar.gz" \
| tar -xz -C /opt/kopens/plantpulse-platform-docker --strip-components=1
cd /opt/kopens/plantpulse-platform-docker/bin
chmod +x *.sh tools/*.sh
パッケージ内で実際に使用する箇所は2つです。
| 場所 | 内容 |
|---|---|
bin/ | すべてのインストール・運用スクリプト |
compose/ | スタック正本 docker-compose.yml とクラスターワーカーオーバーレイ |
ステップ 2: 事前点検 (preflight)
preflight.sh は システムを一切変更せず、インストール可能かどうかの確認のみを行います。
./preflight.sh
点検項目:
- Docker インストール/デーモン動作状況 (未インストールでも問題なし —
install.shがインストールします) - Docker data-root 上位パス(
/data1)の存在確認 - シークレットサイドカー(
/etc/kopens/plantpulse-platform.env)の存在確認 - 主要運用ポート (80, 443, 4949, 4950) の使用状況
OK のみが表示されれば次ステップへ進みます。ERROR がある場合は 問題解決 を参照してください。(WARN は参考用であり、インストールを妨げません。)
ステップ 3: 環境変数の確認 (env.sh)
bin/env.sh がホスト側値の デフォルト値 を決定し、運用者が変更する値は サイドカー
/etc/kopens/plantpulse-platform.env に記述します。コンテナが実際に参照する値は
compose/docker-compose.yml によって決定されます — 詳細な関係は
環境変数リファレンス を参照してください。
vi /etc/kopens/plantpulse-platform.env
bin/env.sh に記述した値は、再インストールやアップグレード時に消失します。 インストールスクリプトがインストールツリーを削除し、再度取得するためです。
env.sh はホストを検知し、CPU・メモリ・ディスクを自動で決定します。固定のデフォルト値ではないため、手を加えなくても小規模な構成では小さい値が割り当てられます。ボックスごとに指定した値が常に優先されます。
| 変数 | 決定方法 | 修正タイミング |
|---|---|---|
DOCKER_PP_CPUS | nproc (読み取り失敗時は 8) | コンテナに割り当てるコア数を減らしたい場合 |
DOCKER_PP_CLUSTER_CORES | DOCKER_PP_CPUS - 2, 最小 4 · 最大 30 | 通常はそのままにします |
DOCKER_PP_MEMORY | ホスト RAM の 90%, 最小 8G | OS 分のメモリをより多く残したい場合 |
DOCKER_DATALAKE_MEMORY | 96G (最小値)。ホスト RAM の 90% を超えないよう切り捨て — ホスト 107G 未満は要件不足 | 増やす場合のみ。96G 未満には下げません |
DOCKER_PP_DATA_DISK_NAME | / を支える実ディスクを自動逆追跡 (失敗時は sda) | 自動検知が誤っている場合 |
PP_LANG | en | 日本語運用の場合は ko |
PP_TZ | Asia/Seoul | 海外ボックス |
DOCKER_PP_EXTERNAL_IP | 空の値 | NAT 環境で外部公認 IP を通知する必要がある場合のみ |
DOCKER_PP_EXTERNAL_IP に無効な IP を入力しないでくださいこの値は PP_SERVICE_IP を経て TLS 証明書の SAN リストに組み込まれます。形式が正しくない IP が1つでも混在すると、openssl が拡張ファイル全体を拒否し、証明書が1枚も生成されず、スタックが起動しません。NAT 環境でない場合は 空にしておいてください — それがデフォルトです。
現在のサーバの値は、以下のコマンドで確認できます。
hostname -I | awk '{print $1}' # 서버 IP
free -g | awk '/^Mem:/{print $2"G"}' # 전체 메모리
nproc # CPU 코어 수
lsblk # 디스크 이름 (sda, sdb, nvme0n1 …)
日本語運用ボックスで通常変更するのは2行のみです。
export PP_LANG=ko
export PP_TZ=Asia/Seoul
PP_LANG / PP_TZ は JVM ブート時に固定されます。既に動作しているスタックで変更するには ./restart.sh が必要です。また、Aster TSDB 時系列が KST epoch で蓄積されるため、日本語運用では Asia/Seoul を維持してください。
ステップ 4: インストール実行 (install.sh)
sudo ./install.sh
install.sh ひとつでインストール全工程を自動的に 수행します。
- OS 検知およびシステム設定 — ファイル制限 (limits)、カーネルパラメータ (sysctl)、時刻同期 (chrony)、SELinux permissive への転換、swap の無効化
- Docker Engine インストール — OS 別パッケージマネージャでインストール + data-root を
/data1/docker-dataに構成 (Compose v2 がなければ同時にインストール) - ファイアウォール設定 — 公開ポート (80/443/4949/4950) を開放し、内部ポートは私設網帯域からのみアクセス可能に制限
- サービス認証情報の生成 —
/etc/kopens/plantpulse-platform.envシークレットサイドカーを生成 (権限 0600, 再実行しても既存値を上書きしない) - レジストリログイン —
docker.kopens.io認証情報を入力 (既にログイン済みであれば自動的に省略) - スタック起動 — ネットワーク/ボリューム生成 → イメージ pull → 設定テンプレートシード →
docker compose up -d
インストール時の1回限りのオプション (必要な場合のみ環境変数で指定):
| オプション | 効果 |
|---|---|
SKIP_OS=1 | OS 設定・Docker インストールを省略 (Docker が既にインストール・運用中の場合) |
SKIP_LOGIN=1 | レジストリログインを省略 (既にログイン済みか、イメージがローカルにある場合) |
SKIP_FW=1 | ファイアウォール設定を省略 (ファイアウォールを別途管理する場合) |
DOCKER_DATA_DIR=<path> | Docker data-root を変更 (デフォルト /data1/docker-data) |
# 예: Docker가 이미 설치된 서버
SKIP_OS=1 sudo -E ./install.sh
シークレットサイドカー(/etc/kopens/plantpulse-platform.env)は export VAR=값 形式の無条件代入であるため、シェル export に優先します。 インストールが完了したノードで PP_PG_PASSWORD=... ./up.sh は無視されます。納品時の変更はインストール前に export PP_*_PASSWORD=... で、インストール完了後は パスワードローテーション の passwd.sh で行ってください。
ステップ 5: 起動とブート検証
install.sh はスタックを起動して戻ってきます。ブートが完了したかは別途確認する必要があります。
./up.sh
up.sh はべき等であるため、既に起動していても安全であり、準備が整うまで待機します。 終了コード 0 は「コマンドが成功した」のではなく、「今から利用可能である」 という意味です。
| 環境変数 | デフォルト値 | 意味 |
|---|---|---|
PP_READY_TIMEOUT | 900 | 準備待機上限 (秒) |
PP_READY_INTERVAL | 15 | 確認間隔 (秒) |
PP_WAIT=0 | — | 待機しない。この時の 0 は準備完了を意味しません |
プロセス起動自体は 3〜5 分 (JVM ウォームアップ) ですが、全コンポーネントが安定するまで 15〜18 分かかります。Aster TSDB スキーママイグレーションと安定化が最も時間を要します。再起動はスキーマが既に存在するため、大幅に早くなります。
実測基準 (2026-08-31, 32 vCPU / 128GiB): データレイク 217秒, Webサーバ 316秒。
準備判定を直接実行することも可能です。
./stack-verify-boot.sh
このスクリプトは 単一のコンテナではなくスタック全体 を確認します — 9つすべてが running・healthy であるか、プロキシが 443 をサービスしているかまでを確認します。
ステップ 6: 状態・運用点検
./status.sh # 0 = 정상 / 2 = 비정상
./ops-check.sh
status.sh はサービスリスト・コンテナ状態・health・ボリュームを要約します。終了コードが契約です — 自動化処理でそのまま利用できます。
| 判定 | 何を異常と見なすか |
|---|---|
| サービスリストを読み取れない | compose 解析失敗 または Docker アクセス不可 |
| compose が宣言したサービスにコンテナがない | 起動していない |
コンテナが running ではない | 9つすべて常時動作します — 除外対象はありません |
常時起動コンテナの health が unhealthy | starting / none は判定保留 |
| ヘルス API が OK ではない | データレイク内での probe |
ボリュームと conf は 報告のみを行い、終了コードには含めません — インストール構成によっては一部が存在しないことが正常であるためです。
ops-check.sh はこれに加え、直近の致命的なログ (OOM, FATAL, SSL エラーなど) までスキャンします。
ヘルス確認
モニター API は plantpulse-datalake コンテナがサービスします。どこから問い合わせるかによってコマンドが異なります。
# 컨테이너 안에서 — 어떤 구성에서도 동작하는 방법
docker exec plantpulse-datalake curl -kfsS https://127.0.0.1:4950/api/health | jq
# 호스트/외부에서 — 4950 이 publish 되어 있습니다
curl -kfsS https://<server-ip>:4950/api/health | jq
"status" が OK または WARN であれば正常範囲であり、FAIL であれば障害です。
コンソールとヘルス API は 2つのポートすべて でサービスされます — 4950 (HTTPS) と 4949 (平文 HTTP)。同じコンソール・同じ API でスキームのみが異なります。4949 はもはや 4950 へリダイレクトしません。
4949 は平文です — ログインパスワードとセッションクッキーがそのまま流れます。信頼できないネットワークでは 4950 を使用してください。4949 は自己署名証明書警告が実際に運用者の妨げとなる環境向けの選択肢です。
インストール結果物
ネットワークとボリューム
| リソース | 名称 | 用途 |
|---|---|---|
| ネットワーク | pp-net | プラットフォーム専用 Docker ネットワーク (デフォルト 10.99.0.0/24, ゲートウェイ 10.99.0.1) |
| ボリューム | pp-data | データの永続保存 (Aster TSDB, PostgreSQL, Kafka など) |
| ボリューム | pp-temp | 一時データ (Spark, Hive 作業空間) |
| ボリューム | pp-backup | バックアップストレージ |
| ボリューム | pp-security | TLS 証明書・キーストア。plantpulse-certs が書き込み、その他は読み取り専用で参照 |
| ボリューム | pp-proxy-certs | プロキシが 443 で使用する証明書 |
ボリュームはコンテナを停止または削除しても 常に保存 されるため、アップデートや再インストール時でもデータが維持されます。
ホストディレクトリ
| パス | 用途 |
|---|---|
/opt/kopens/plantpulse-platform-docker | インストール・運用スクリプトと compose 正本 |
/etc/kopens/conf | プラットフォーム設定テンプレート (ホストバインドマウント)。初回実行時にイメージから自動シードされ、以降は運用者がホストで直接編集でき、再インストールしても保存されます |
/etc/kopens/plantpulse-platform.env | サービス認証情報シークレットサイドカー (権限 0600) |
/etc/kopens/platform.node.env | ノード別アイデンティティ (IP・ディスクなどそのボックス固有の値)。ノード間コピー禁止 |
/etc/kopens/ca | 共有クラスター CA (2ノード分離インストールで使用) |
接続アドレス
| 用途 | アドレス |
|---|---|
| Web コンソール | http://<server-ip>/ · https://<server-ip>/ — plantpulse-proxy が受信します |
| 管理 UI | https://<server-ip> (Web コンソールと同じアドレス) |
| モニター UI · ヘルス | https://<server-ip>:4950/api/health |
| MQTT | <server-ip>:1883 (平文) · <server-ip>:1884 (TLS) |
| OPC-UA | <server-ip>:11004 · <server-ip>:11005 |
セキュリティ案内: Web コンソール初回ログイン後は、必ずデフォルト管理パスワードを変更してください。 → 初期パスワード
運用コマンド要約
日常運用で使用するコマンドです。すべて /opt/kopens/plantpulse-platform-docker/bin/ で実行します。すべての動詞は --help をサポートします。
| 作業 | コマンド | 備考 |
|---|---|---|
| 状態点検 | ./status.sh | サービス / health / ボリューム要約。0=正常 / 2=異常 |
| 運用点検 | ./ops-check.sh | コンテナ health + ヘルス API + 直近の致命的ログ |
| 起動 | ./up.sh | べき等。0 = 準備完了 |
| 停止 | ./down.sh | 状態保存 |
| 再起動 | ./restart.sh | graceful drain → 停止 → 起動 → 準備待機 |
| ログ参照 | ./logs.sh [서비스] | 最後の 200 行を表示して終了。追跡する場合は -f。引数がない場合は 全コンテナ。リストは --list |
| コンテナ進入 | ./shell.sh [서비스] | 引数がない場合はデータレイク |
| 再インストール | インストールワンライナーを再実行 | ./update.sh ではありません — アップグレード |
| 完全削除 | ./remove.sh | コンテナのみ削除 (ボリューム・設定は保存)。RM_IMAGE=1 / RM_NETWORK=1 |
| バックアップ | ./backup.sh [볼륨 …] | デフォルト pp-data · pp-security |
| ブート検証 | ./stack-verify-boot.sh | スタック全体の準備判定 |
| 診断バンドル | ./doctor.sh | サポート依頼用 tarball。機密値はマスキングされます |
| パスワード変更 | ./passwd.sh --list | 変更可能なキーリスト |
# 운영 중 빠른 점검 루틴
cd /opt/kopens/plantpulse-platform-docker/bin
./status.sh
./ops-check.sh
# 문제가 의심되면 진단 번들 생성
./doctor.sh
stack-run.sh · stack-stop.sh · stack-bash.sh · stack-update.sh · stack-remove.sh は削除されていません。直接実行すると新名称を1行で案内するだけで、動作は同一です。既存顧客のランブックを一斉に修正する必要はありません。
注意 — 全ボリューム削除:
./tools/remove-all-volumes.shはすべてのデータを永久的に削除します。必ずバックアップ完了後にのみ使用してください。
閉域網インストール
閉域網インストールは 閉域網インストール へ移動しました。バンドルに何が含まれるか、airgap-bundle.sh の環境変数、および airgap-load.sh がインストール前に遮断する事項についてそちらに記載されています。
問題解決
preflight 点検が失敗する場合
| メッセージ | 対応 |
|---|---|
docker is installed but daemon is not ready while SKIP_OS=1 | Docker デーモンを先に起動してください: systemctl start docker。または SKIP_OS なしで実行すれば install.sh が Docker を構成します |
| ポートが既に使用中 (WARN) | 当該ポートを他のサービスが使用しています。ss -tlnp | grep :<port> でプロセスを確認し、プラットフォームインストール前に整理してください |
| Docker data-root 上位パスなし (WARN) | /data1 ディレクトリがありません。データディスクを /data1 にマウントするか、ディレクトリを作成してください |
スタックが起動しない場合
docker compose up -d は depends_on 条件をすべて待機するため、ヘルスチェックを通過できないコンテナが1つでもあると、コマンド全体が1行のみ残して失敗します。
dependency failed to start: container plantpulse-server-web is unhealthy
この1行はコンテナ名以外に何も教えません。運用スクリプトはこの際、コンテナリスト・状態・health probe 出力・各ログ末尾を自動的にあわせて出力するため、その出力を先に確認してください。直接確認する場合は以下を実行します。
cd /opt/kopens/plantpulse-platform-docker/bin
# 어떤 컨테이너가 어떤 상태인가
./status.sh
# 문제가 있는 컨테이너의 로그
./logs.sh --list # 볼 수 있는 서비스 목록
./logs.sh plantpulse-server-web -n 200
# 자원 상황
df -h
docker stats --no-stream
よくある原因:
| 原因 | 確認事項 |
|---|---|
| メモリ不足 (OOM) | docker inspect <컨테이너> --format '{{.State.OOMKilled}}'。アプリ別 mem_limit は 環境変数リファレンス を参照 |
| ディスクフル | /data1 空き容量 |
| 必須認証情報の不足 | compose がパスワードを :? で要求します。空の場合、スタックは 中途半端に起動せず完全に起動しません — install.sh を先に実行してサイドカーを作成してください |
| DB 初期化遅延 | 初回インストールはスキーマ生成に時間がかかります。ログにエラーなく進行している場合は、しばらくお待ちください |
原因特定が困難な場合は、./doctor.sh で診断バンドルを生成し、技術サポートに添付してください。診断バンドルには すべてのコンテナ の状態とログが含まれます。
TLS ハンドシェイクが TimeoutException とだけ表示される場合
アプリがバックエンドに接続する際に使用する名称が証明書の SAN リストにない場合、エラーメッセージに証明書の記述が現れず、タイムアウトのように見えます。コンテナ名を変更したか、バックエンドホストを直接指定した場合はこのケースを疑ってください。証明書を再生成する方法は セキュリティ管理 にあります。
レジストリ認証失敗
# unauthorized 오류 시 재로그인
docker login docker.kopens.io
- ログイン認証情報がないか、期限切れの場合は KOPENS 運用チームに発行を依頼してください。
- 社内ファイアウォールがレジストリへの接続を遮断している可能性があります。ネットワーク管理者に
docker.kopens.io,product.kopens.ioドメインへの HTTPS アクセス許可を依頼してください。 - 外部アクセスが根本的に遮断された環境であれば、閉域網インストール を利用してください。
技術サポート
インストールおよび運用過程でヘルプが必要な場合は、いつでもお問い合わせください: webmaster@kopens.com