メインコンテンツまでスキップ

閉域網インストール

インターネットが届かない網にはバンドルでインストールします。インターネット側でバンドルを受け取り(または焼いて)、 署名を検証した後メディアに移し、閉域網で展開します。

アーキテクチャを先に決めてください

バンドルは2種類です — arm64(GB10系列)・amd64(AWS g7e など)。対象サーバーで uname -m を見て 選んでください(aarch64 → arm64、x86_64 → amd64)。異なるアーキテクチャのバンドルはイメージが起動しません。 搬入スクリプトはバンドルの MANIFEST.txt に記されたアーキテクチャとこのホストをDockerインストール前に照合し、 食い違えば停止します。

バンドルは大きいです — 約25GB

vLLMイメージが大半です。移すメディアと対象ディスクの空きを事前に確認してください。

1段階 — バンドルを受け取る(インターネット側)​

配布サーバーから本体とサイドカー4つ、合わせて5ファイルを受け取ります。

ARCH=arm64 # 또는 amd64
B=plantpulse-ai-images-latest-$ARCH.tar.gz
for f in "$B" "$B.sha256" "$B.sha256.sig" "$B.pub" "$B.cosign.sha256"; do
curl -fL -C - --retry 10 --retry-delay 5 --retry-all-errors \
-O "https://product.kopens.io/plantpulse-ai/$f"
done
ファイル何か
<번들>.tar.gz本体
.sha256本体のチェックサム
.sha256.sigそのチェックサムに対するcosign署名 — 署名は数十GBの本体ではなくチェックサムファイルに付きます
.pub検証用公開鍵
.cosign.sha256バンドルに同梱されたcosign実行ファイルのsha256(下記「バンドル内cosign」)
途切れたら同じコマンドをもう一度実行してください

-C - が継続受信、--retry-all-errors が再試行です。大きいファイルがCDN側のエラーで途切れることが ありますが、もう一度実行すれば受け取った所から継続します。

2段階 — 署名検証​

検証していないバンドルは使いません。 受け取った5ファイルを1つのディレクトリに置いて展開し検証します。

sudo -i
mkdir -p /opt/kopens && tar -xzf "$B" -C /opt/kopens
bash /opt/kopens/plantpulse-ai-images/repo/bin/verify-bundle.sh "$B"

verify-bundle.sh が順番に確認する項目です。1つでも食い違えばそこで止まります。

  1. cosignを実行できるか — COSIGN_BIN → PATHの cosign → バンドルの tools/cosign-linux-<arch> の順
  2. サイドカー(.sha256・.sha256.sig・公開鍵)がバンドルの側にあるか。レポジトリの公開鍵と受け取った .pub が 両方ある場合バイト単位で一致しなければなりません
  3. 署名がチェックサムファイルに対して有効か
  4. チェックサムファイルに記された名前がこのバンドルの名前か
  5. バンドルのバイトが署名されたチェックサムと一致するか
終了コード意味
0検証済み
1検証失敗 — そのバンドルを使わないでください
2検証できなかった(ツールやサイドカーがない) — 通過ではありません

バンドル内cosignと信頼の限界​

閉域網にはcosignがないため、バンドルがバージョンを固定した tools/cosign-linux-<arch> を携えています。 しかしバンドル内のcosignはバンドル署名では保証されません — 署名を確認するツールがまさに それだからです。そのためそのsha256を3箇所に置きます。

どこ性質
バンドル MANIFEST.txt の tools-cosign 行私たちが作ったコピー
CDNの <번들>.cosign.sha256私たちが作ったコピー。バンドルの横に置くと verify-bundle.sh が自動で照合し、異なれば失敗します
上流sigstoreの cosign_checksums.txt唯一の独立した照合先

前の2つはバンドルとCDNを一緒に変えられる攻撃者には無力です。インターネット側で上流 チェックサムと一度照合しておいてから搬入してください。別途信頼するcosignがあれば COSIGN_BIN=/경로/cosign に渡します。

3段階 — 閉域網へ移して搬入​

バンドルの本体とサイドカーを一緒に移します — 搬入スクリプトがロード前に再度検証します。

sudo -i
mkdir -p /opt/kopens && tar -xzf "$B" -C /opt/kopens
cd /opt/kopens/plantpulse-ai-images/repo/bin
BUNDLE_TARBALL="/경로/$B" ./airgap-import.sh

展開した形はこうなります。兄弟レポジトリ2つがバンドル内に一緒に入っているので別途用意するものはありません (どのコミットかは MANIFEST.txt の sibling 行にあります)。

/opt/kopens/plantpulse-ai-images/
├── repo/ ← 설치 본체 (bin · compose)
├── plantpulse-ai-inference-server/ ← 형제 저장소
├── plantpulse-timeseries-insight-server/ ← 형제 저장소
├── images/ ← 이미지마다 docker save 한 파일 하나씩
├── pkgs/{rpm,deb}/ ← Docker CE 오프라인 설치 패키지
├── tools/cosign-linux-<arch>
└── MANIFEST.txt

airgap-import.sh が順番に処理します。各段階が失敗すればそこで止まります。

段階行う内容
0アーキテクチャ照合・バンドル署名検証(verify-bundle.sh)
1Dockerオフラインインストール — Dockerがない場合のみ。既にある場合はレポジトリ・設定をそのままにして再起動しません(ALLOW_DOCKER_RECONFIGURE=1 で許可)
2イメージロード — 全て docker load した後、バンドルのイメージ参照が全て名前で解決できるか確認します
3install.sh 呼び出し — SKIP_LOGIN=1。レジストリに接続せず、イメージpullとモデル自動受信もスキップします
バンドルが見つからなければ停止します

署名はバンドルの横にあるサイドカーで確認するため、搬入時にtar.gzが必要です。展開したディレクトリの 親(/opt/kopens)から1つを探して使い、ない場合や複数ある場合は BUNDLE_TARBALL で指定するよう求めて 停止します。検証なしで進める ALLOW_UNVERIFIED=1 がありますが使わないでください — 検証されていないバンドルを ロードするスイッチです。

デフォルトは「準備まで」です

install.sh は /etc/kopens/plantpulse-ai.env を作っておいて停止します。起動まで一度に進めたい場合は export START=1 を先に行い、airgap-import.sh を実行してください。準備だけ行ったなら下記「搬入後の起動手順」を 従ってください — インストーラの末尾にも同じ手順が表示されます。

2026.10からは埋める値にプラットフォーム資格情報取得設定(PP_DATALAKE_ADMIN_URL・PP_DATALAKE_ADMIN_API_KEY)と プラットフォーム信頼アンカー /etc/kopens/ca/root.crt が含まれます。閉域網内でもAIホストがプラットフォームホストの :4950 に 届く必要があります → インストール概要

搬入後の起動手順​

  1. 残っているプレースホルダーを埋めます。 搬入時の出力が CHANGE_ME_* として残ったキーを表示します(管理者・Neo4jパスワード、 プラットフォームトークン、プラットフォーム資格情報キーなど)。sudo で /etc/kopens/plantpulse-ai.env を修正し権限は 0600 のままにします。
  2. vLLMモデルを配置します — 下記「モデルはバンドルに含まれていません」。
  3. bin/up.sh で起動します。
cd /opt/kopens/plantpulse-ai-images/repo
sudo bin/up.sh
プレースホルダーが1つでも残っていると bin/up.sh が起動しません(2026.10)

以前のバージョンは START=1 経路でのみプレースホルダーを防いでおり、閉域網のように後から compose-up.sh で起動する経路は見ていませんでした。 そのため管理コンソールとNeo4jが公開テンプレートに記載されたパスワードで LANポートに開かれる可能性がありました。現在は bin/up.sh も 残っているキー名を表示して起動を拒否します。

bin/update.sh は使わないでください — イメージを先に取得しようとするため、レジストリのない閉域網では失敗します。

ホスト全体設定は HOST_TUNING に従います

install.sh はロケール・タイムゾーン(PP_TZ)・スワップ・chrony・limits・sysctl・tmpfiles・ファイアウォールを変更します。他の サービスのコンテナが既に動いているホストではデフォルトが plan のため変わるものだけ出力します。出力を確認し 必要であれば HOST_TUNING=apply でもう一度実行してください → インストール概要

モデルはバンドルに含まれていません​

🔴 vLLMモデル(LLM・埋め込み・リランカー、合計20GB以上)はバンドルに含まれていません。 オンラインインストールは START=1 の時にモデルを自動で受け取りますが、閉域網搬入はその段階を スキップします。

  • vLLMモデル — インターネットが使える機器で bin/fetch-models.sh で受け取ります。オンラインインストールが受け取るものと同じリリース 重み(model.kopens.ai)で、SHA256SUMS と照合した後展開します(zstd が必要です)。受け取る場所は MODEL_BASE、名前は MODELS で付けます。

    MODEL_BASE=/mnt/usb/models MODELS="Aura-Lite-NVFP4 Aura-Embedding-4B Aura-Reranker-0.6B" \
    bash /opt/kopens/plantpulse-ai-images/repo/bin/fetch-models.sh

    メディアに移し閉域網機器の /opt/kopens/models の下に同じ名前のディレクトリとして置きます(位置を変えた場合は LLM_MODEL_PATH・EMB_MODEL_PATH・RERANK_MODEL_PATH をホストenvに記載します)。

  • 時系列推論モデル — 搬入するものはありません。 plantpulse-timeseries-insight-server イメージの中に入っています。

  • 録取モデル(Aura-ASR-Turbo、約1.5GB) — 映像・音声収集と音声で質問することを使うインストールのみ搬入します。録取イメージ (plantpulse-asr-audio、録取vLLMは生成vLLMと同じイメージ)はバンドルに常に含まれているためモデルだけ移せばよいです。 インターネットが使える機器でスイッチをシェル環境として与えるとvLLMモデルと一緒に受け取ります(受け取る場所に既にあるものはスキップします)。

    PI_MEDIA_ENABLED=true MODEL_BASE=/mnt/usb/models \
    bash /opt/kopens/plantpulse-ai-images/repo/bin/fetch-models.sh

    メディアに移し閉域網機器の /opt/kopens/models/Aura-ASR-Turbo に置いた後、ホストenvに PI_MEDIA_ENABLED=true を入れて 起動します → 映像・音声収集。名前だけ受け取るには MODELS="Aura-ASR-Turbo" で与えても構いません。以前の 案内の COMPOSE_PROFILES=media を与えた実行も依然としてこのモデルを受け取ります。

download-model.sh で受け取らないでください

推論サーバーレポジトリの tools/download-model.sh は上流オリジナルの重みを受け取り Aura-* の名前だけ付けます。名前が同じで どんな検査も差を見つけられませんがリリース重みではありません。 必ず bin/fetch-models.sh を使ってください。

モデルなしで起動するとスタックは緑で立ち上がりLLMだけが落ちます。 起動前に配置を確認してください。

バンドルを自分で焼く場合​

配布サーバーのバンドルの代わりに社内で焼く必要がある場合にのみ使います。対象と同じアーキテクチャの機器で 実行します — クロスビルドは行いません。

cd /opt/kopens/plantpulse-ai-docker/bin
./airgap-export.sh
環境変数デフォルト値意味
ARCHこのホストarm64・amd64。ホストと照合し食い違えば停止します
OS_TARGETアーキテクチャに従う — arm64 → deb、amd64 → rpmrpm・deb・both — 同梱するDockerオフラインパッケージ
EXPORT_TAG今日の日付成果物の名前にのみ使われます
OUT_DIR<저장소>/dist成果物を置く場所

成果物は dist/plantpulse-ai-images-<태그>-<아키텍처>.tar.gz と .sha256 です。イメージ一覧は docker compose config --images で抽出するため手書きしません — モデルを変えたりvLLMバージョンを 上げても、スクリプトを修正する必要はありません。兄弟レポジトリ2つも焼くのに使ったチェックアウトのまま一緒に同梱されます。

自分で焼いたバンドルには署名がありません

署名(.sha256.sig)はリリースパイプラインが付けるもので、手で焼くと署名段階をスキップします(ログに 「署名スキップ」と表示されます)。署名のないバンドルは搬入0段階の検証を通過できないため、特別な理由が なければ配布サーバーのバンドルを使ってください。

インストール後​

順序行う内容コマンド・ドキュメント
1デフォルトパスワードを変更する初期パスワード変更
2スタックが生きているか確認するbin/status.sh・bin/health.sh
3どこが詰まっているか特定するbin/doctor.sh

よくある落とし穴​

症状原因対処
verify-bundle.sh が終了コード2cosignがないかサイドカーが欠けている通過ではありません。サイドカー4つをバンドルの横に置いて再検証する
搬入が「バンドルが見つからない」で止まるtar.gzを移していないか別の場所にあるBUNDLE_TARBALL=/경로/<번들>.tar.gz で指定する
搬入がアーキテクチャ不一致で止まる異なるアーキテクチャのバンドルuname -m に合うバンドルを受け取る
ロード後「名前で解決できないイメージ」で止まるバンドルの欠陥そのバンドルを使わず新しいバンドルを受け取る
スタックは緑なのにLLMだけ動かないモデルを搬入していない上記「モデルはバンドルに含まれていません」
PI_MEDIA_ENABLED=true で起動したのに plantpulse-asr だけ立ち上がらない録取モデル(Aura-ASR-Turbo)を搬入していない上記「モデルはバンドルに含まれていません」の録取モデル
スタックが準備だけされて起動しないSTART=1 を与えなかった正常な動作です。上記「搬入後の起動手順」の通り値を埋めて bin/up.sh で起動する
bin/up.sh が «still has template placeholders» で止まるプレースホルダー(CHANGE_ME_*)が残っている表示されたキーを埋めて再度起動する
bin/update.sh がイメージpullで失敗する閉域網にはレジストリがないbin/up.sh を使う
ホスト設定が変わらなかった他のコンテナが動くホストのため HOST_TUNING=plan だった出力を確認し HOST_TUNING=apply でもう一度実行する

関連ドキュメント​