湯ったり〜な昼神様 デジタルサイネージ配信システム

依頼
現地へ行かずに中身を差し替えられるデジタルサイネージが欲しい、という話から始まった。1つの施設のために作成したものではないため、端末を追加すれば別の場所にもそのまま入れられる。
いまは湯ったり〜な昼神様に置かせてもらっている。運用も、流す動画の制作と日々の差し替えも、サーチャーの社員が行っている。
再生する端末(Androidアプリ)、配信APIとWeb管理画面を兼ねるサーバー、VPS上の実行基盤まで自分で作成した。
プレイヤー(Androidアプリ)
動画と静止画を1つの再生リストにまとめ、全画面でループさせる。
- コンテンツの取り込みは2系統。「USBメモリを挿すだけで同期する」方式と「サーバーから取得する」方式を持ち、設定ファイルの有無で自動的に切り替わる
- 取得したメディアは内部ストレージへ複製してから再生するため、通信が切れてもサーバーが止まっても再生は続く
- 曜日・時間帯で再生内容を切り替えられる
- 無人で置くため画面を固定(キオスク化)した。固定したままでも担当者が保守用の画面から一時解除・再固定できる導線を、タッチとリモコンの両方に用意した
- Google TV では、縦置き設置に合わせた表示の固定回転、動画の音声再生、TVのアプリ一覧への表示とリモコンからの起動に対応している
サーバー(Next.js)
Android端末向けの配信APIと、運用者が使う管理画面を1つのサーバーで動かしている。
- 配信APIは、コンテンツフォルダの状態とDB上のスケジュール定義から再生定義(JSON)を自動生成して返す
- 通信量を抑えるため、内容が変わっていなければ再ダウンロードさせない
- 動画はストリームで配信し、容量が大きくてもサーバーのメモリを圧迫しない
- 端末ごとにAPIキーを発行し、検証の強度を切り替えられる
管理画面では、動画と静止画のドラッグ&ドロップでのアップロード、サムネイルとプレビュー、再生順の並べ替え、静止画の表示秒数の一括変更、曜日・時間帯スケジュールの編集、端末の登録と管理、管理者/編集者のロール管理、操作の監査ログ閲覧ができる。
運用
- DB上で失効させられるセッション認証、ログイン試行のレート制限とアカウントロック、API全体のレート制限を入れている
- ディスク使用率を監視し、閾値を超えたらアップロードだけ拒否して、配信は続ける
- データベースとメディアは世代管理付きで自動バックアップしている
- ConoHa VPS 上に Docker Compose(Caddy・Next.js・PostgreSQL)で常駐させている。HTTPS証明書の取得と更新は Caddy が自動で行う
品質
端末やネットワークに依存しない部分(再生定義の解釈、スケジュール判定、設定ファイルのパース、レート制限の判定など)を意図的に切り出して、自動テストで検証している。実機がないと確かめられない範囲を、設計の段階で狭くした。
設計方針・進捗・実機検証の記録はリポジトリ内のドキュメントに残し続けている。
現在も機能追加と保守を続けている。
写真と動画

