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

量産ライン設置 (factory.sh)

生産ラインでボックス 100 ~ 1000 台を処理する際に使用します。オペレーターが 1 画面の prompt を埋めるだけで、 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. ホスト名の同期hostnameedge-<hex6> (RFC 1123、小文字+ハイフン) に変更。
  3. 5 フィールドの prompt — 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 — ライン末端で回収 → 社内 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.mdSecrets 節):

変数長さ場所
ADMIN_PASS (UI ログイン)random 14 文字+!/etc/kopens/credentials.txt
API_KEY (REST)random 16 文字上記ファイル + env.sh.generated
MQTT_PASS (HiveMQ)random 14 文字+!上記ファイル
OPCUA_PASSrandom 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.mdCosign 節を参照してください。


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 でない仮想 NICLAN1_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 failedcontainer 内で実行 / 権限なしfactory.sh は root 必須 — sudo bash factory.sh
prompt が表示されない (ラベルが印刷されない)install.sh が mid-way で失敗journalctl -u plantpulse-edge.service -n 50 を確認後、トラブルシューティング

8. 関連ドキュメント