量産ライン設置 (factory.sh)
生産ラインでボックス 100 ~ 1000 台を処理する際に使用します。オペレーターが 1 画面の prompt を埋めるだけで、 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 フィールドの prompt — 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 — ライン末端で回収 → 社内 inventory 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
Why MAC?
- hostname は OS install ごとに変わる可能性があり (cloud-init /
hostnamectl)、衝突もあり得る - MAC は hardware に焼き付けられているため、ボックスごとの unique が保証される
- 24-bit 末尾 6 文字 → 約 1670 万通り。1000 台の量産で衝突確率は約 0.003% (Birthday paradox 基準で安全)
ドメイン規則(製品リポジトリの 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 (silent な重複を防止)。同一ボックスを 2 回 provisioning した場合や MAC 衝突ケースを自動検出します。 - MAC がないボックス (仮想 NIC など) —
derive_edge_id_from_macが fail → install.sh が hostname ベースの fallback。ラインではほぼ発生しません。
2. Prompt 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 分 (初回イメージ pull 3 GB を含む) 動作した後、ラベルを出力します。
3. 自動生成された資格情報 (G2)
install.sh がボックスごとに異なる random パスワードを生成します (詳細はダウンロードした plantpulse-edge-docker/README.md の Secrets 節):
| 変数 | 長さ | 場所 |
|---|---|---|
ADMIN_PASS (UI ログイン) | random 14 文字+! | /etc/kopens/credentials.txt |
API_KEY (REST) | random 16 文字 | 上記ファイル + env.sh.generated |
MQTT_PASS (HiveMQ) | random 14 文字+! | 上記ファイル |
OPCUA_PASS | random 14 文字+! | 上記ファイル |
CERT_PASS (SSL keystore) | random 14 文字+! | 上記ファイル |
/etc/kopens/env.sh.generated (chmod 0600 root) は、後続のすべてのスクリプト (upgrade.sh / restart.sh)
が source するサイドカーです — 再起動後も同じ資格情報を維持します。
4. イメージ署名の verification (G3)
install.sh が cosign を自動インストールし、cosign.pub を配置して、docker pull 直後に自動で verify します。
[install] Installing cosign ...
[install] OK — cosign installed (cosign version 2.4.1)
[install] cosign.pub installed — image verification enabled
[install] docker pull — docker.kopens.io/pe/plantpulse-edge:2026-20260523
[install] OK — Pull complete
[cosign] OK — signature verified for docker.kopens.io/pe/plantpulse-edge:2026-20260523
cosign.pub がまだ placeholder (運用チームが keypair 未生成) の場合は 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 されます。ライン末端でオペレーターが回収 → 社内 inventory 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 — 社内 provisioning REST API 導入時)。
7. よく陥る落とし穴
| 症状 | 原因 | 対応 |
|---|---|---|
EDGE_ID '...' fails ^EDGE_[A-Z0-9_]{1,60}$ | LAN1 NIC の MAC が ASCII でない仮想 NIC | LAN1_IFACE=enp1s0 bash factory.sh のように明示 |
already_in_inventory: EDGE_3F8A21 already provisioned | 同一ボックスの再実行または MAC 衝突 | vi /data1/factory-inventory.csv で該当行を削除して再実行。MAC 衝突の場合はライン stop + 報告 |
cosign verify FAILED (COSIGN_REQUIRE=1) | image が未署名 OR cosign.pub が誤り | ビルドサーバーで sign-image.sh の呼び出し漏れを確認、cosign.pub を更新 |
hostnamectl set-hostname failed | container 内で実行 / 権限なし | factory.sh は root 必須 — sudo bash factory.sh |
| prompt が表示されない (ラベルが印刷されない) | install.sh が mid-way で失敗 | journalctl -u plantpulse-edge.service -n 50 を確認後、トラブルシューティング |
8. 関連ドキュメント
plantpulse-edge-docker/README.md— 運用シナリオ(量産 / SI / CI)の節(配布物に同梱されています)plantpulse-edge-docker/README.md— Cosign 節(keypair 生成 · rollout · rotation)- クイックインストール (単一ボックス、現場 SI 用)
- 設置直後のチェックリスト
- 閉域網 / Airgap 設置