デジタルサイネージ配信システム

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

