setup(100-199)¶
100_install_node.sh¶
このスクリプトは、既存の Node.js を削除して Nodesource から指定バージョン($NODE_VERSION)を導入し、signage-server の最新リリースと signage-admin-ui を GitHub Releases から取得・検証(SHA256)・設置します。サーバはタイムスタンプ付きの releases/<YYYYmmdd_HHMMSS> に展開し、current シンボリックリンクを新リリースへ更新します。
$NODE_VERSION が見つからない場合は 20.x にフォールバックします。
処理の流れ
1) 既存 Node.js の削除
2) Node.js の導入
3) signage-server ディレクトリの準備
- "$SIGNAGE_CORE_DIR" に対して chown -R "$USERNAME:$USERNAME" / chmod -R 755
4) signage-server の最新リリース取得・展開
- API: https://api.github.com/repos/tstaisyu/signage-server/releases/latest
- 取得アセット: signage-server.tar.gz / signage-server.tar.gz.sha256
- sha256sum -c で検証 → releases/<TIMESTAMP> に展開 → npm ci --omit=dev --ignore-scripts
- current を新リリースへ ln -sfn → 新リリースを chown -R "$USERNAME:$USERNAME"
5) signage-admin-ui の最新リリース取得・展開
- API: https://api.github.com/repos/tstaisyu/signage-admin-ui/releases/latest
- 取得アセット: admin-ui.tar.gz / admin-ui.tar.gz.sha256
- 既存の $ADMIN_UI_DIR を削除→再作成→展開→chown -R "$USERNAME:$USERNAME"
6) 設定完了後、tmp/の一時ファイルを削除
注意
npm ci --ignore-scripts: postinstall 等のスクリプトは実行されません。必要な場合は運用方針に応じて外してください。
101_install_edge_detection.sh¶
このスクリプトは、Raspberry Pi 以外の環境で、xignage-edge-detection の最新リリースを GitHub Releases から取得→検証(SHA256)→展開→current 切替まで自動実行します。
/etc/nv_tegra_release ではなく BOARD_TYPE による判定で、rasp / pi を含む場合は 安全にスキップします。
処理の流れ
1) Raspberry Pi 判定
BOARD_TYPE に rasp / pi を含む場合は スキップ。
2) releases & staging ディレクトリの準備
releases/<TIMESTAMP> を作成し、以後の展開先を staging として利用。
3) xignage-edge-detection の最新リリース取得・展開
- API: https://api.github.com/repos/tstaisyu/xignage-edge-detection/releases/latest
- 取得アセット: xignage-edge-detection.tar.gz / xignage-edge-detection.tar.gz.sha256 で検証 → releases/<TIMESTAMP> に展開
- current を新リリースへ ln -sfn → 新リリースを chown -R "$USERNAME:$USERNAME"
4) 設定完了後、tmp/の一時ファイルを削除
5) (任意)Python 依存パッケージのインストール
requirements-full.txt があれば pip3 install -r を実行。
105_install_metrics_service.sh¶
このスクリプトは、xignage-metrics(デバイス指標を MQTT 等へ送信する Node.js アプリ)を配置・依存導入・サービス常駐化します。
主な処理は以下のとおりです。
1) アプリコードを rsync(--delete) で METRICS_SRC → METRICS_DST に同期
2) 状態保存用ディレクトリ /var/lib/xignage-metrics を作成(700)
3) 本番依存を npm ci --omit=dev で導入
4) 環境変数ファイル /etc/signage/metrics.env を未存在時にサンプルから 600 で配置
5) systemd ユニット /etc/systemd/system/xignage-metrics.service を生成し 有効化 & 起動
Note
metrics.env には MQTT 接続情報など秘密情報を記載します(自動生成は 未 編集のサンプル配置のみ)。
Warning
初回実行後は /etc/signage/metrics.env を編集して資格情報を設定してください。
106_install_call_button_service.sh¶
呼び鈴(インターホン)ボタン常駐デーモンを導入し、call-button.service を作成・起動します。
Raspberry Pi / Jetson の双方で動作(Python 側で GPIO ライブラリを自動選択)。プルアップ構成の物理ピン5(既定)をデバウンス処理し、
状態スナップショットを /run/signage/io_state.json に原子的に書き込み、イベントを /var/log/signage/io_events.jsonl へ JSON Lines で追記します。
- 実行環境:
bash≥ 4、systemd、python3 - 依存:
scripts/lib/config.sh(USERNAME・LOG_FILE等)、scripts/lib/functions.sh(install_or_link) - 既定の環境変数ファイル:
/etc/signage/io.env(存在しなければ本スクリプトが生成)
生成/変更されるもの
- 実行ファイル群(/opt/local/bin)
/opt/local/bin/app.py(エントリポイント・実行ビット付与)/opt/local/bin/button.py(ローカルモジュール)/opt/local/bin/tof.py(ToF オプション用モジュール)/opt/local/bin/aws_iot_pub.py(AWS IoT 送信用モジュール/events.envのEVENTS_*を参照)- 配置方法:
install_or_link(リンク or コピーで冪等設置) - 所有者:
${USERNAME}:${USERNAME}(config.shに準拠) - 環境変数ファイル
/etc/signage/io.env(無ければデフォルトを書き込み/0644)- ログディレクトリ
/var/log/signage(${USERNAME}所有、0755)- systemd ユニット
/etc/systemd/system/call-button.servicesystemctl daemon-reload && systemctl enable --now call-button.service
/etc/signage/io.env(既定・抜粋)¶
BUTTON_BOARD_PIN=5
BUTTON_DEBOUNCE_MS=30
STATE_PATH=/run/signage/io_state.json
EVENTS_PATH=/var/log/signage/io_events.jsonl
# ToF (optional)
# TOF_ENABLE=1
# TOF_MODEL=auto # auto|vl53l0x|vl53l1x|none
# TOF_ADDR=0x29
# TOF_BUS=1
# TOF_THRESHOLD_MM=1200
# TOF_DISTANCE_MODE=2 # 0/1/2 = SHORT/MEDIUM/LONG
# TOF_TIMING_BUDGET_MS=50
systemd ユニット(要点)¶
- User/Group:
${USERNAME}実行(GPIO / I2C へのアクセス前提) - EnvironmentFile:
/etc/signage/io.envと(任意の)/etc/signage/events.envを読み込み - RuntimeDirectory=signage(
/run/signageを systemd 側で用意) - ハードニング:
NoNewPrivileges=true,ProtectSystem=full,ProtectHome=true,PrivateTmp=true
(GPIO/I2C 要件に応じて調整可)
GPIO ピンとプルアップ構成
既定の BUTTON_BOARD_PIN=5(物理ピン 5)は BOARD 番号です(BCM とは異なる番号体系)。
Python 側の入力モード設定・プルアップ/プルダウン指定がハード配線と一致していることを確認してください。
ToF の利用(任意)
ToF を使う場合は上記 TOF_* を有効化。使用ドライバ(vl53l0x/vl53l1x)に応じて Python 依存を追加してください。
権限まわり
/var/log/signage は ${USERNAME} 所有、/run/signage はユニットの RuntimeDirectory で作成されます。
権限エラーが出る場合はユニットの User/Group とディレクトリ所有を確認してください。
110_write_iot_certs_and_env.sh¶
このスクリプトは、AWS IoT 用の X.509 証明書 3 点(cert.pem, private.key, AmazonRootCA1.pem)を安全な権限で所定パスへ配置し、/etc/signage/metrics.env に IoT 接続設定(ENDPOINT と証明書パス)を追記/更新、稼働中なら xignage-metrics サービスを再起動して反映します。
前提条件
1) 事前に /tmp/certs/ に以下のファイルがあること:
cert.pem(デバイス証明書)
private.key(秘密鍵)
AmazonRootCA1.pem(ルートCA)
2) 環境変数:
IOT_ENDPOINT(例:a1b2c3d4e5-ats.iot.ap-northeast-1.amazonaws.com)
3) 主要パス(スクリプト内定義):
証明書コピー元:/tmp/certs(CERT_SRC)
証明書配置先:/etc/signage/certs(CERT_DST)
環境ファイル:/etc/signage/metrics.env(ENV_FILE)
対象サービス:xignage-metrics.service(SERVICE)
処理の流れ
1) 証明書を安全に配置(冪等)
- 先に CERT_DST を 700 で作成
- 各ファイルは 差分がある場合のみ 600 で上書き(cmp -s で比較)
2) metrics.env をキー単位で更新(冪等)
- 一時ファイルに編集後、差分があればバックアップ作成 → install -m600 で置換
- 追記/更新されるキー:
IOT_ENDPOINT(環境変数の値)
IOT_CERT_PATH=/etc/signage/certs/cert.pem
IOT_KEY_PATH=/etc/signage/certs/private.key
IOT_CA_PATH=/etc/signage/certs/AmazonRootCA1.pem
注意
入力検証: IOT_ENDPOINT が未設定だと metrics.env に空値が書き込まれる可能性があります。実行前に必ず設定してください。
111_set_assume_role_arn.sh¶
目的:/etc/signage/signage.env に ASSUME_ROLE_ARN を追記/更新(アップサート)します。
存在しない場合は作成し、変更があれば自動でバックアップ(.bak.<epoch>)を残します。
- 参照/入力:
引数(任意):
ASSUME_ROLE_ARN環境変数(任意):ASSUME_ROLE_ARN - 出力/変更:
/etc/signage/signage.env(0644)にASSUME_ROLE_ARN=をアップサート
(変更があれば${SIGNAGE_ENV}.bak.<epoch>を作成)
解決順序(最初に見つかった値を採用)
- コマンド引数:
ASSUME_ROLE_ARN - シェル環境変数:
ASSUME_ROLE_ARN - 既定値:
arn:aws:iam::<ACCOUNT_ID>:role/iot-provisioner-role
実行方法¶
# 任意:明示指定
sudo bash scripts/setup/111_set_assume_role_arn.sh arn:aws:iam::123456789012:role/iot-provisioner-role
# または、環境変数で指定
export ASSUME_ROLE_ARN=arn:aws:iam::123456789012:role/iot-provisioner-role
sudo bash scripts/setup/111_set_assume_role_arn.sh
# 何も指定しない場合は既定値(<ACCOUNT_ID> を含むプレースホルダ)を書き込み
sudo bash scripts/setup/111_set_assume_role_arn.sh
動作詳細
install -m644 -Dでsignage.envを安全に新規作成(存在しない場合)- 一時ファイルにコピーして
ASSUME_ROLE_ARN=を置換 or 追記 - 差分がある場合のみ
install -m644 -Tで原子的に置換し、旧ファイルを.bak.<epoch>に保存
112_write_events_iot_env.sh¶
目的:イベント送信用の AWS IoT 接続情報と 証明書を端末へ安全配置し、/etc/signage/events.env を生成します。
call-button.service(インターホン常駐)を検出した場合は daemon-reload + restart を実行(冪等)。
- 参照ファイル:
/etc/signage/signage.env… DEVICE_ID を取得/etc/signage/metrics.env… IOT_ENDPOINT を取得/tmp/aws-iot-certs/{cert.pem,private.key,AmazonRootCA1.pem}… 優先/tmp/events-certs/{cert.pem,private.key,AmazonRootCA1.pem}… フォールバック - 生成/変更:
証明書ストア:
/etc/signage/events-certs/<DEVICE_ID>/ - 内容:
cert.pem,private.key,AmazonRootCA1.pem - 権限:ディレクトリ
0700、cert.pem/private.keyは0600、AmazonRootCA1.pemは0644 - 所有者:
ubuntu:ubuntu - 既存と同一内容なら更新スキップ(
cmp -s) - 環境ファイル:
/etc/signage/events.env(0644、差分時のみ原子的置換/.bak.<epoch>) 内容例:
AWS_IOT_ENDPOINT=<from metrics.env>
EVENTS_THING_NAME=<DEVICE_ID>
EVENTS_CERT_PATH=/etc/signage/events-certs/<DEVICE_ID>/cert.pem
EVENTS_KEY_PATH=/etc/signage/events-certs/<DEVICE_ID>/private.key
EVENTS_CA_PATH=/etc/signage/events-certs/<DEVICE_ID>/AmazonRootCA1.pem
- systemd(任意)
call-button.serviceが存在すればdaemon-reload→restart(失敗してもスクリプトは継続)
自動プロビジョニング(任意)
- 変数
CREATE_THING=1(既定:1)のとき、per-device Thing + certs を自動作成試行 - 依存コマンド:
aws,jq,curl(未インストールならエラー終了) - 既に Thing が存在する場合は作成をスキップ
- 利用ポリシー名:
POLICY_NAME(未指定時xignage-device-events-publish-v1)
処理の流れ
- 前提読み込み:
signage.envからDEVICE_ID、metrics.envからIOT_ENDPOINTを取得(未定義ならエラー終了)。 - プロビジョニング(任意):
CREATE_THING=1の場合のみ、Thing/証明書/ポリシーを自動作成 or 既存スキップ。 - 証明書検査:
/tmp/aws-iot-certsを優先、なければ/tmp/events-certsを使用。3ファイルが揃っていなければエラー終了。 - 安全配置:
/etc/signage/events-certs/<DEVICE_ID>/をinstall -d -m700で作成し、各ファイルを差分更新します。 - 環境ファイル生成
テンポラリに書き出してから
install -m644 -Tで原子的に置換。差分時のみ.bak.<epoch>を作成。
出力先:/etc/signage/events.env(0644) - サービス反映(任意)
call-button.serviceが存在すれば daemon-reload + restart を実行(失敗しても続行)。 - 完了ログ
DEVICE_IDを出力して終了。
注意
- 前提:
/etc/signage/signage.envと/etc/signage/metrics.envを事前に用意。 - 証明書入力:
/tmp/aws-iot-certsまたは/tmp/events-certsにcert.pem,private.key,AmazonRootCA1.pemを配置。 - 権限:秘密鍵 0600、CA 0644、ディレクトリ 0700、所有者 ubuntu:ubuntu。
- 冪等性:同一内容の再投入時は スキップ(
cmp -s/diff -q)。 - サービス依存:
call-button.serviceが無い環境でも安全に実行可能(存在チェックあり)。