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

量産ライン設置

生産ラインでボックス100〜1000台を処理する場合に使用します。オペレーターが画面上のプロンプトを1つ埋めるだけで、EDGE_ID / hostname / 資格情報 / Docker / cosign verify / コンテナ起動までを自動化します。 1台あたり30秒で完了します。

このページは量産ラインSOPです

単一ボックスまたは現場設置(SI担当者)の場合は、先に ワンライン設置 ページを参照してください。量産ラインと現場設置の違いはエントリーポイントのみであり、結果は同一です。


0. 概要​

sudo -i
mkdir -p /home/kopens
curl -fsSL https://product.kopens.io/plantpulse-edge/plantpulse-edge-docker.tar.gz \
| tar xz -C /home/kopens
cd /home/kopens/plantpulse-edge-docker/bin
sudo bash factory.sh

factory.sh が以下を自動的に実行します:

  1. LAN1 NIC MAC 自動検知 — MACの下6桁で EDGE_<HEX6> を生成(例:EDGE_3F8A21)。
  2. ホスト名同期 — hostname も edge-<hex6> (RFC 1123, 小文字+ハイフン) に変更。
  3. 5フィールドプロンプト — SITE_ID / SERVER_HOST / SERVER_API_KEY / LAN1 NIC / LAN2 NIC。
  4. install.sh 委任 — Docker / cosign / random secret / app.properties / コンテナ起動。
  5. factory-label.txt 出力 — ボックス貼付用。印刷後に封印。
  6. factory-inventory.csv append — ライン末尾で回収 → 社内インベントリDBへ。

1. ID / hostname 自動生成​

EDGE_ID — EDGE_<HEX6>​

LAN1 NIC eth1 MAC = 00:1a:2b:3f:8a:21
─────
마지막 6 자 (HEX6) = 3F8A21
EDGE_ID = EDGE_3F8A21
hostname = edge-3f8a21

なぜMACを使用するのか?

  • hostname はOSインストールごとに変更される可能性があり(cloud-init / hostnamectl)、衝突の可能性があります。
  • MAC はハードウェアに固定されており、ボックスごとに一意(unique)であることが保証されます。
  • 24-bitの下6桁 → 約1670万通りの組み合わせ。1000台の量産において衝突確率は〜0.003%(誕生日のパラドックスに基づき安全圏内)。

ドメイン規則(製品リポジトリの CLAUDE.md)を強制します:

識別子正規表現例
EDGE_ID^EDGE_[A-Z0-9_]{1,60}$EDGE_3F8A21
SITE_ID^SITE_[A-Z0-9_]{1,60}$SITE_FAB1_042
hostname (RFC 1123)小文字 + ハイフンedge-3f8a21

factory.sh が上記regexを検証した後に進行します。検証に失敗した場合は即座にabortされます。

MAC衝突 / NICなしボックス​

  • 衝突の可能性 — /data1/factory-inventory.csv に既に同じ EDGE_ID が存在する場合、即座にabortします(サイレントな重複を防止)。同一ボックスの二重プロビジョニングやMAC衝突ケースを自動検出し、停止させます。
  • MACなしボックス (仮想NICなど) — derive_edge_id_from_mac が失敗し、install.sh がhostnameベースのフォールバックを実行します。量産ラインではほとんど発生しません。

2. プロンプト 5フィールド​

オペレーターがラインで入力します:

══════════════════════════════════════════════════════════════════════
PlantPulse Edge — Factory Provisioning
══════════════════════════════════════════════════════════════════════
Detected NIC eth1 MAC : 00:1a:2b:3f:8a:21
Auto EDGE_ID : EDGE_3F8A21
Auto hostname : edge-3f8a21
══════════════════════════════════════════════════════════════════════
Site ID (^SITE_[A-Z0-9_]+) [SITE_00001]: SITE_FAB1_042
Platform server host [192.168.0.41]: 10.10.0.5
Platform API key []: kFa7bGz8pQrN3xMv9wT2sLcEjY1uV6oH
LAN1 NIC (PLC) [eth1]: ← Enter = default
LAN2 NIC (WAN) [eth2]: ← Enter = default
══════════════════════════════════════════════════════════════════════
Summary
EDGE_ID : EDGE_3F8A21
hostname : edge-3f8a21
SITE_ID : SITE_FAB1_042
SERVER_HOST : 10.10.0.5
SERVER_API_KEY : kFa7…(32 chars)
LAN1 NIC (PLC) : eth1
LAN2 NIC (WAN) : eth2
══════════════════════════════════════════════════════════════════════
Proceed with install.sh? [y/N]

y を押すと、install.sh が5〜10分(初回イメージプル 3 GBを含む)動作し、その後ラベルを出力します。


3. 自動生成された資格情報 (G2)​

install.sh がボックスごとに異なるランダムなパスワードを生成します(詳細はダウンロードした plantpulse-edge-docker/README.md の パスワード / APIキー (Secrets) 節を参照):

変数長さ保存先
ADMIN_PASS (UIログイン)ランダム14文字+!/etc/kopens/credentials.txt
API_KEY (REST)ランダム16文字上記ファイル + env.sh.generated
MQTT_PASS (HiveMQ)ランダム14文字+!上記ファイル
OPCUA_PASSランダム14文字+!上記ファイル
CERT_PASS (SSL keystore)ランダム14文字+!上記ファイル

/etc/kopens/env.sh.generated (chmod 0600 root) は、後続のすべてのスクリプト (upgrade.sh / restart.sh) がsourceするサイドカーであり、再起動後も同一の資格情報を維持します。


4. イメージ署名検証 (G3)​

install.sh がcosignを自動的にインストールし、cosign.pub を配置した後、docker pull 直後に自動的に検証(verify)を行います。

[install] Installing cosign ...
[install] OK — cosign installed (cosign version 3.1.3)
[install] cosign.pub installed — image verification enabled
[install] docker pull — docker.kopens.io/pe/plantpulse-edge:2026.11-20261103-1006
[install] OK — Pull complete
[cosign] OK — signature verified for docker.kopens.io/pe/plantpulse-edge:2026.11-20261103-1006

イメージ署名はcosign 3形式であるため、cosign 2.xでは署名を見つけることができません。install.sh と upgrade.sh は、cosignが存在しないか、またはバージョンが3未満の場合、固定バージョン 3.1.3 をgithub.comから取得してチェックサムを確認した後にインストールします(ディストリビューションパッケージは使用しません)。既に3.xがインストールされている場合は、そのまま使用します。インストール段階で取得できなかった場合は警告のみが表示されますが、アップグレードは署名を検証できなければ開始されません。

閉域網ボックス

インストールにはバンドルのcosign(tools/cosign-linux-amd64)を使用します。アップグレードは pe upgrade --bundle <파일> [--cosign <cosign-linux-amd64>] を用い、インターネット接続なしで署名を検証します — 閉域網アップグレード。

cosign.pub がまだプレースホルダー(運用チームがキーペアを未生成)である場合はWARNのみが表示され、インストールは継続されます。 ダウンロードした plantpulse-edge-docker/README.md の イメージ署名 (Cosign) 節を参照してください。


5. ラベル + インベントリ​

/etc/kopens/factory-label.txt — ボックス貼付用​

インストール完了後、画面に出力され、chmod 0600 ファイルに保存されます。ライン担当者がラベルプリンターで印刷し、ボックスを封印します:

══════════════════════════════════════════════════════════════════════
PlantPulse Edge — Factory Label
══════════════════════════════════════════════════════════════════════
EDGE_ID : EDGE_3F8A21
hostname : edge-3f8a21
SITE_ID : SITE_FAB1_042
build_date : 2026-05-19 14:25:33
──────────────────────────────────────────────────────────────────────
LAN1 (PLC) : eth1 MAC=00:1a:2b:3f:8a:21
LAN2 (WAN) : eth2 MAC=00:1a:2b:3f:8a:22
──────────────────────────────────────────────────────────────────────
UI admin : admin / aBcD1234EfGh!
REST API : kFa7bGz8pQrN3xMv9wT2sLcEjY1uV6oH
(full credentials → /etc/kopens/credentials.txt — root only)
══════════════════════════════════════════════════════════════════════

/data1/factory-inventory.csv — ライン回収用​

ボックスごとに1行をappendします。ライン末尾でオペレーターが回収し、社内インベントリDBへアップロードします:

edge_id,hostname,site_id,server_host,lan1_iface,lan1_mac,lan2_iface,lan2_mac,build_date,iso8601
EDGE_3F8A21,edge-3f8a21,SITE_FAB1_042,10.10.0.5,eth1,00:1a:2b:3f:8a:21,eth2,00:1a:2b:3f:8a:22,2026-05-19 14:25:33,2026-05-19T05:25:33Z
EDGE_5B7C03,edge-5b7c03,SITE_FAB1_043,10.10.0.5,eth1,00:1a:2b:5b:7c:03,eth2,00:1a:2b:5b:7c:04,2026-05-19 14:28:12,2026-05-19T05:28:12Z

6. ライン末尾の一括回収​

# 라인 마지막 박스 처리 후 회수 워크스테이션에서
scp root@edge-3f8a21:/data1/factory-inventory.csv ./inventory-line1-$(date +%F).csv

# 회수한 CSV 들을 사내 inventory DB 로 업로드 (예: scripts/import-inventory.py)
python3 import-inventory.py inventory-line1-2026-05-19.csv

または、ボックスが起動した時点でPlatform側へ自動的にpushするようにhookを追加することも可能です(Phase 1 — 社内プロビジョニングREST API導入時)。


7. よくある落とし穴​

症状原因対応
EDGE_ID '...' fails ^EDGE_[A-Z0-9_]{1,60}$LAN1 NICのMACがASCIIではない仮想NICであるNET1_IFACE=enp1s0 bash factory.sh のように明示
already_in_inventory: EDGE_3F8A21 already provisioned同一ボックスの再実行またはMAC衝突vi /data1/factory-inventory.csv で該当行を削除して再実行。MAC衝突の場合はライン停止 + 報告
cosign verify FAILED (COSIGN_REQUIRE=1)イメージが未署名 または 不適切なcosign.pubビルドサーバー sign-image.sh の呼び出し漏れを確認し、cosign.pubを更新
hostnamectl set-hostname failedコンテナ内で実行 / 権限不足factory.sh はrootを強制 — sudo bash factory.sh
プロンプトが表示されない (ラベル印刷不可)install.sh が途中で失敗journalctl -u plantpulse-edge.service -n 50 確認後 設置トラブルシューティング

8. 関連文書​

  • plantpulse-edge-docker/README.md — 運用シナリオ (量産 / SI / CI) 節 (配布本に同梱されています)
  • plantpulse-edge-docker/README.md — イメージ署名 (Cosign) 節 (キーペア生成 · ロールアウト · ローテーション)
  • ワンライン設置
  • 設置直後の点検
  • 閉域網設置