量産ライン設置
生産ラインでボックス100〜1000台を処理する場合に使用します。オペレーターが画面上のプロンプトを1つ埋めるだけで、EDGE_ID / hostname / 資格情報 / Docker / cosign verify / コンテナ起動までを自動化します。 1台あたり30秒で完了します。
単一ボックスまたは現場設置(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 が以下を自動的に実行します:
- LAN1 NIC MAC 自動検知 — MACの下6桁で
EDGE_<HEX6>を生成(例:EDGE_3F8A21)。 - ホスト名同期 —
hostnameもedge-<hex6>(RFC 1123, 小文字+ハイフン) に変更。 - 5フィールドプロンプト — SITE_ID / SERVER_HOST / SERVER_API_KEY / LAN1 NIC / LAN2 NIC。
install.sh委任 — Docker / cosign / random secret / app.properties / コンテナ起動。- factory-label.txt 出力 — ボックス貼付用。印刷後に封印。
- 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 確認後 設置トラブルシューティング |