閉域網インストール
インターネットが届かない網にはバンドルでインストールします。インターネット側でバンドルを受け取り(または焼いて)、 署名を検証した後メディアに移し、閉域網で展開します。
バンドルは2種類です — arm64(GB10系列)・amd64(AWS g7e など)。対象サーバーで uname -m を見て
選んでください(aarch64 → arm64、x86_64 → amd64)。異なるアーキテクチャのバンドルはイメージが起動しません。
搬入スクリプトはバンドルの MANIFEST.txt に記されたアーキテクチャとこのホストをDockerインストール前に照合し、
食い違えば停止します。
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つでも食い違えばそこで止まります。
- cosignを実行できるか —
COSIGN_BIN→ PATHのcosign→ バンドルのtools/cosign-linux-<arch>の順 - サイドカー(
.sha256・.sha256.sig・公開鍵)がバンドルの側にあるか。レポジトリの公開鍵と受け取った.pubが 両方ある場合バイト単位で一致しなければなりません - 署名がチェックサムファイルに対して有効か
- チェックサムファイルに記された名前がこのバンドルの名前か
- バンドルのバイトが署名されたチェックサムと一致するか
| 終了コード | 意味 |
|---|---|
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) |
| 1 | Dockerオフラインインストール — Dockerがない場合のみ。既にある場合はレポジトリ・設定をそのままにして再起動しません(ALLOW_DOCKER_RECONFIGURE=1 で許可) |
| 2 | イメージロード — 全て docker load した後、バンドルのイメージ参照が全て名前で解決できるか確認します |
| 3 | install.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 に
届く必要があります → インストール概要
搬入後の起動手順
- 残っているプレースホルダーを埋めます。 搬入時の出力が
CHANGE_ME_*として残ったキーを表示します(管理者・Neo4jパスワード、 プラットフォームトークン、プラットフォーム資格情報キーなど)。sudoで/etc/kopens/plantpulse-ai.envを修正し権限は0600のままにします。 - vLLMモデルを配置します — 下記「モデルはバンドルに含まれていません」。
bin/up.shで起動します。
cd /opt/kopens/plantpulse-ai-images/repo
sudo bin/up.sh
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 → rpm | rpm・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 が終了コード2 | cosignがないかサイドカーが欠けている | 通過ではありません。サイドカー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 でもう一度実行する |
関連ドキュメント
- インストール概要 — 何がどこに配置されるか
- ワンラインインストール — インターネットが使える環境
- システム要件