コンテンツにスキップ

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_TYPErasp / 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.jsonlJSON Lines で追記します。

  • 実行環境:bash ≥ 4、systemdpython3
  • 依存:scripts/lib/config.shUSERNAMELOG_FILE 等)、scripts/lib/functions.shinstall_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.envEVENTS_* を参照)
  • 配置方法:install_or_linkリンク or コピーで冪等設置)
  • 所有者:${USERNAME}:${USERNAME}config.sh に準拠)
  • 環境変数ファイル
  • /etc/signage/io.env(無ければデフォルトを書き込み/0644
  • ログディレクトリ
  • /var/log/signage${USERNAME} 所有、0755
  • systemd ユニット
  • /etc/systemd/system/call-button.service
  • systemctl 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.envIoT 接続設定(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/certsCERT_SRC
証明書配置先:/etc/signage/certsCERT_DST
環境ファイル:/etc/signage/metrics.envENV_FILE
対象サービス:xignage-metrics.serviceSERVICE

処理の流れ

1) 証明書を安全に配置(冪等)
- 先に CERT_DST700 で作成
- 各ファイルは 差分がある場合のみ 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.envASSUME_ROLE_ARN追記/更新(アップサート)します。
存在しない場合は作成し、変更があれば自動でバックアップ(.bak.<epoch>)を残します。

  • 参照/入力: 引数(任意)ASSUME_ROLE_ARN 環境変数(任意)ASSUME_ROLE_ARN
  • 出力/変更: /etc/signage/signage.env0644)に ASSUME_ROLE_ARN=アップサート
    (変更があれば ${SIGNAGE_ENV}.bak.<epoch> を作成)

解決順序(最初に見つかった値を採用)

  1. コマンド引数ASSUME_ROLE_ARN
  2. シェル環境変数ASSUME_ROLE_ARN
  3. 既定値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 -Dsignage.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.envDEVICE_ID を取得 /etc/signage/metrics.envIOT_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
  • 権限:ディレクトリ 0700cert.pem/private.key0600AmazonRootCA1.pem0644
  • 所有者:ubuntu:ubuntu
  • 既存と同一内容なら更新スキップcmp -s
  • 環境ファイル/etc/signage/events.env0644、差分時のみ原子的置換/ .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-reloadrestart(失敗してもスクリプトは継続)

自動プロビジョニング(任意)

  • 変数 CREATE_THING=1既定:1)のとき、per-device Thing + certs を自動作成試行
  • 依存コマンド:aws, jq, curl(未インストールならエラー終了)
  • 既に Thing が存在する場合は作成をスキップ
  • 利用ポリシー名:POLICY_NAME(未指定時 xignage-device-events-publish-v1

処理の流れ

  1. 前提読み込みsignage.env から DEVICE_IDmetrics.env から IOT_ENDPOINT を取得(未定義ならエラー終了)。
  2. プロビジョニング(任意)CREATE_THING=1 の場合のみ、Thing/証明書/ポリシーを自動作成 or 既存スキップ
  3. 証明書検査/tmp/aws-iot-certs優先、なければ /tmp/events-certs を使用。3ファイルが揃っていなければエラー終了。
  4. 安全配置/etc/signage/events-certs/<DEVICE_ID>/install -d -m700 で作成し、各ファイルを差分更新します。
  5. 環境ファイル生成 テンポラリに書き出してから install -m644 -T で原子的に置換。差分時のみ .bak.<epoch> を作成。
    出力先:/etc/signage/events.env(0644)
  6. サービス反映(任意) call-button.service が存在すれば daemon-reload + restart を実行(失敗しても続行)。
  7. 完了ログ DEVICE_ID を出力して終了。

注意

  • 前提/etc/signage/signage.env/etc/signage/metrics.env を事前に用意。
  • 証明書入力/tmp/aws-iot-certs または /tmp/events-certscert.pem, private.key, AmazonRootCA1.pem を配置。
  • 権限:秘密鍵 0600、CA 0644、ディレクトリ 0700、所有者 ubuntu:ubuntu
  • 冪等性:同一内容の再投入時は スキップcmp -s / diff -q)。
  • サービス依存call-button.service が無い環境でも安全に実行可能(存在チェックあり)。