見出し画像

テレビ録画メディアサーバー構築入門(第25回)

サーバー分離

録画サーバー(EPGStation)メディアサーバー(Jellyfin) を物理的に、異なるPCで運用することには、次のようなメリットがあります。

1. 負荷分散と安定性:

  • 録画の安定性: トランスコード処理に起因する、チューナーの不安定化リスクをなくせます。重要:PX-S1UD/Q1UDなどのUSBチューナーを利用する場合は動作が格段に安定化します。(追記:設置後1ヶ月連続稼働中)

  • 運用上の自由度: 録画とトランスコードの作業を分けることにより、高負荷のかかる動画編集処理を常時無制限に実行可能になります。画質オプションを妥協する必要性が軽減されます。

  • システム全体の安定性: 一方のサーバーで問題が発生した場合でも、もう一方のサーバーは影響を受けません。

  • リソースの最適化: 各サーバーに最適なハードウェア構成を選択できます。録画サーバーは必要最小構成にて運用し、メディアサーバーには高速なCPUやGPU、大容量外部保存領域を搭載するなど、用途に合わせてリソースを割り当てられます。

2. メンテナンスとアップグレードの柔軟性:

  • 独立したメンテナンス: 一方のサーバーをメンテナンスやアップグレードのために停止しても、もう一方のサーバーは引き続き利用できます。とりわけ重要な点として、録画サーバーには、チューナーに対応した「古い」バージョンのカーネルを利用し続けざるを得ない状況が生じえますが、メディアサーバーはこれとは独立にアップデート可能になります。

  • 段階的なアップグレード: 古いサーバーをEPGStation専用として使い続け、新しいサーバーをJellyfin専用として導入するなど、段階的なアップグレードが可能です。

3. セキュリティ:

  • セキュリティリスクの軽減: 万が一、一方のサーバーがセキュリティ侵害を受けた場合でも、もう一方のサーバーへの影響を最小限に抑えられます。

4. 拡張性:

  • 将来的な拡張: 将来的に録画チャンネル数を増やしたり、Jellyfinの同時接続数を増やしたりする場合に、それぞれのサーバーを独立して拡張できます。

5. その他:

  • 設置場所の自由度: 各サーバーを最適な場所に設置できます。例えば、チューナーカードを搭載したEPGStationサーバーは、アンテナに近い場所に設置し、Jellyfinサーバーは、ネットワーク環境の良い場所に設置するなど、柔軟な配置が可能です。録画サーバーだけを、放送エリアの異なる、遠隔地に設置することも可能です。

  • 電源管理: 各サーバーの電源を個別に管理できます。例えば、録画時間帯以外はEPGStationサーバーの電源をオフにすることで、消費電力を削減できます。

デメリット:

  • 初期費用: 2台のPCを用意する必要があるため、初期費用が高くなります。

  • 管理の複雑さ: 2台のPCを管理する必要があるため、管理がやや複雑になります。

  • ネットワーク設定: 2台のPC間で録画データを共有するために、ネットワーク設定が必要になります。

まとめ:

録画サーバーとメディアサーバーを分離することは、負荷分散、安定性、メンテナンス性、セキュリティ、拡張性など、多くのメリットがあります。特に、PX-S1UD互換チューナーを利用する場合や、複数の異なる放送エリアにサーバーを置く、録画を頻繁に行う、複数のユーザーが同時にJellyfinを利用するなどの場合は、サーバーを分離しての運用をおすすめします。

構築手順


画像
サーバー構成とクライアントアクセスをしめす。白抜きの2重矢印 ⇔ が今回のテーマ

サーバー構成

  1. 録画サーバー EPGStation: PC名 pidgeot22
    m2ts出力先: ~/docker-mirakurun-epgstation/recorded/

  2. メディアサーバー Jellyfin: PC名 fearow22
    作業フォルダ: ~/pidgeot22/work/
    mp4出力先: /buffalo/media/

やること

  1. 録画サーバーpidgeot22 のm2ts出力先を、メディアサーバーfearow22 の同期フォルダ に同期する。
    pidgeot22の ~/docker-mirakurun-epgstation/recorded/ と
    fearow22の ~/pidgeot22/work/recorded/ を同期する

  2. メディアサーバーでは、同期フォルダを監視して、新たに動画が追加されたら変換処理をする。
    作業内容はこれまで(単一サーバー構成)と同じだが、これまでとは異なり、録画中かどうか、次の録画まで時間が十分あるか、など、気にする必要はなく、ファイル同期完了後すぐに作業に移行できる。

SyncThing

複数のデバイス間でファイルを安全に同期できる無料のオープンソースソフトウェア、SyncThingを、同期するサーバー両方にインストールする。

sudo mkdir -p /etc/apt/keyrings  
sudo curl -L -o /etc/apt/keyrings/syncthing-archive-keyring.gpg https://syncthing.net/release-key.gpg
echo "deb [signed-by=/etc/apt/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list
sudo apt-get update  
sudo apt-get install syncthing

user モードで使用する。

systemctl --user enable syncthing.service
systemctl --user start syncthing.service

systemctl --user status syncthing.serviceで動作確認できる。

GUI待ち受けアドレスを、デフォルト127.0.0.1:8384から、サーバーのIPアドレス 100.x.y.z:8384 に変更します。

待ち受けアドレス確認

$ syncthing cli config gui raw-address get
127.0.0.1:8384

変更& 確認

syncthing cli config gui raw-address set "100.x.y.z:8384"
syncthing cli config gui raw-address get

ディスプレーがつながっているなら、127.0.0.1:8384にアクセスして、設定-GUIパネルから変更も可能です。

ちなみに、サーバー機は、プライベートネットワーク経由で外部から操作するので、キーボードやマウス、ディスプレーをつなぐ必要はありません。むしろ、
「チューナーは作動時に大きな電力を消費するので、他のUSB機器とは離れたポートにつなぐ。」(第23回)。不要なUSB 機器は常時接続しない方が良い。

設定した待ち受けアドレスhttp://100.x.y.z:8384 にアクセスして設定画面を確認。日本語(Japanese)にします。

画像

今後は、ネットワーク経由でアクセスするので、homepage設定~/homepage/config/services.yaml にリンクを追記しておきます(第14回)。

こんな感じ:

---
# For configuration options and examples, please see:
# https://gethomepage.dev/configs/services/

- fearow22:
    - jellyfin:
        icon: jellyfin.png
        href: http://100.69.15.44:8096/
        description: 

    - metube:
        icon: metube.png
        href: http://100.69.15.44:8081/
        
    - ntfy:
        icon: ntfy.png
        href: https://fearow22.taile153a7.ts.net/
        description: 

    - syncthing:
        icon: syncthing.png
        href: http://100.69.15.44:8384
        description: 

- pidgeot22:
    - epgstation:
        icon: https://assets.st-note.com/img/1751109675-nCc2aTtduIWEP7by81A5wRVz.png
        href: http://100.82.31.61:8888/
        description: 

    - mirakurun:
        icon: https://assets.st-note.com/img/1751109684-ogPh76t9JIj2QHKAW3ylfacs.png
        href: http://100.82.31.61:40772/
        description:

    - syncthing:
        icon: syncthing.png
        href: http://100.82.31.61:8384
        description: 

以下では、フォルダを同期するまでの設定方法を、ステップごとに詳しく説明します。

前提条件:

  • SyncThingが同期するデバイス双方にインストール済みであること。

  • 各デバイスが同じtailscale ネットワークに接続されていること。

手順:

1. 最初のデバイス(例:録画サーバーpidgeot22)での設定:

  • SyncThingを起動:SyncThingのWebインターフェース(設定)にアクセスします。

  • デバイスIDの確認: Webインターフェースの右上、メニュー、「IDを表示」より表示される、秘密のデバイスIDをメモしておきます。例:デバイスID - pidgeot22: A3SIVSA-BBQ7CTN-5HAWZ2H-AKTB8IO-HYYP8QQ-YVHABSY-AVBXP8V-TBB8DAN (公開すべきではない)

  • フォルダの共有設定:

    • Webインターフェースの左下にある「フォルダを追加」ボタンをクリックします。

    • フォルダー名とフォルダーパス: 同期したいフォルダのパスを指定します。フォルダー名は任意の識別用です。例:
      フォルダ名recorded, フォルダパス~/docker-mirakurun-epgstation/recorded

    • フォルダID: フォルダを識別するためのIDを確認し、メモしておきます。例:フォルダID xyzab-fkwce

    • 保存: 設定が終わったら「保存」ボタンをクリックします。

  • デバイス名の設定 (推奨):

    • Webインターフェース右上のメニュー「設定」「一般」タブで、「デバイス名」を分かりやすい名前に変更します。(例:pidgeot22)

    • 「保存」をクリックします。

2. 2番目のデバイス(例:メディアサーバーfearow22)での設定:

  • SyncThingを起動: インストールしたSyncThingを起動します。

  • デバイスの追加:

    • Webインターフェースの右下にある「接続先デバイスを追加」ボタンをクリックします。

    • デバイスID: 最初のデバイス(pidgeot22)でメモしたデバイスIDを入力します。

    • デバイス名: 分かりやすい名前を入力します。(例:fearow22)

    • 保存: 設定が終わったら「保存」ボタンをクリックします。

3. 最初のデバイス(pidgeot22)に戻って設定:

  • デバイスの承認: 2番目のデバイス(fearow22)を追加すると、最初のデバイス(pidgeot22)のWebインターフェースに「デバイスの接続要求」という通知が表示されます。

    • 通知をクリックし、「デバイスを追加」をクリックします。

    • デバイス名を確認し、「保存」をクリックします。

4. フォルダの共有設定(pidgeot22):

  • 最初のデバイス(pidgeot22)のWebインターフェースで、先ほど作成したフォルダの設定画面を開きます。(フォルダ名をクリック。編集、共有タブ)

  • 共有相手: 2番目のデバイス(fearow22)が表示されているはずです。チェックボックスをオンにして、共有を許可します。

  • 保存: 設定が終わったら「保存」ボタンをクリックします。

5. 2番目のデバイス(fearow22)での設定:

  • フォルダの承認: 最初のデバイス(pidgeot22)から共有されたフォルダの接続要求が、2番目のデバイス(fearow22)のWebインターフェースに表示されます。

    • 「新しいフォルダーとして追加しますか?」に「追加」をクリック

    • フォルダID: 最初のデバイス(pidgeot22)で設定したフォルダIDと同じものが入力されているはずです。例:フォルダID xyzab-fkwce

    • フォルダ名とフォルダパス: このデバイス(fearow22)で同期先のフォルダを指定します。 例:
      フォルダ名(任意) pidgeot22/recorded, フォルダパス~/pidgeot22/work/recorded/

    • 保存: 設定が終わったら「保存」ボタンをクリックします。

6. 同期の開始:

  • 双方の設定画面に許可申請が未完了でないか確認します。設定が完了すると、SyncThingは自動的にフォルダの同期を開始します。

  • Webインターフェースで、各デバイスのフォルダの状態を確認できます。

  • 同期が完了するまで、しばらく時間がかかる場合があります。

補足:

  • バックアップ:操作ミスによりファイルを失う可能性があります。慣れない初回接続時は、テストとして空のフォルダを同期して、一方に追加した(小サイズの)ファイルが他方に同期されるかを確認してから、本番運用に移行しましょう。

  • 競合の解決: 同じファイルを両方のデバイスで同時に編集した場合、競合が発生する可能性があります。SyncThingは競合ファイルを自動的にバックアップしますが、必要に応じて手動で解決する必要があります。

動画処理設定(メディアサーバー)

第7回にて、「未処理」の録画済みファイル名を取得するスクリプトtoprocess.py を導入しました。録画された動画の一覧は、EPGStation (localhost)に問い合わせる方式(サーバー監視型)でしたが、これを「同期フォルダ」を監視する形(フォルダ監視型)に拡張バージョンアップします。

フォルダ監視型かどうかは、環境変数 WATCHDIRで判別します。trueがフォルダ監視型、falseがサーバー監視型です。監視するフォルダは、ソースディレクトリSOURCEDIRで指定します。

さらに、処理済み動画のカタログファイルprocessed_filenames.jsonの置き場所として、作業ディレクトリWORKDIR=~/pidgeot22/workを指定します。

つまり、サーバー監視型では、単純に ./toprocess.py にて未処理ファイルが出力されましたが、フォルダ監視型では、次のように環境変数を渡す形で使用します。

takya@fearow22:~/pidgeot22/work$ WATCHDIR=true SOURCEDIR=./recorded WORKDIR=. ./toprocess.py

ここでは相対パスを使いましたが、cronで呼ぶ場合を考慮して、環境設定 env.sh には絶対パスを指定します。

takya@fearow22:~/pidgeot22/work$ cat env.sh
# ディレクトリ
export WORKDIR="$HOME/pidgeot22/work/"  # 作業ディレクトリ(このファイルのディレクトリ)
export SOURCEDIR="$HOME/pidgeot22/work/recorded/" # m2ts (変換前) のソースディレクトリ
export OUTDIR="/buffalo/media/" # mp4 (変換後) の出力先ディレクトリ

# オプション
export CMCUT=true   # CMカットしないなら false
export CHKDRP=true #動画エラーチェックしないなら false
export WATCHDIR=true # false: サーバー(EPGSTATION_URL)監視、true: ディレクトリ(SOURCEDIR) 監視
export EPGSTATION_URL="http://100.82.31.61:8888" #
export NTFY_URL="https://fearow22.taile153a7.ts.net/PX-S1UD" # ntfy.sh通知先: 未設定ならコメントアウト
# NHKチャンネルID: CMCUT=falseなら設定不要
export NHK1="GR20"
export NHK2="GR13"

EPGSTATION_URLは、録画サーバーEPGStation (pidgeot22)のアドレスポートです。前回のepg.shで録画番組情報を参照するために使用します。

メインスクリプト encode.sh の動作も、フォルダ監視型では異なります。サーバー監視型とは異なり、録画状態をチェックする必要がなくなったので、録画ファイルの同期が完了したら、すぐに変換作業を開始できます。encode.shについても、env.shに記載の環境変数 WATCHDIRがtrueかfalseかにより、フォルダ監視型か、サーバー監視型かを判定します。

GitHub

アップデートした toprocess.py, encode.shや、その他、基本部分のスクリプト一式を、GitHubに置いて管理することにしました。

インストール&使用法

端末からコマンド:
git clone https://github.com/takyaO/epg2jelly.git
でダウンロードしたepg2jelly内のファイル一式を、作業ディレクトリ ~/work/ にコピーで上書きします。

まずは、上記のとおり、env.sh を確認してください。
encode.sh を実行することで、未処理のm2tsをmp4に変換します。

スクリプトは(後方互換に配慮しながら)随時更新しています。

仕様変更

githubに公開した最新版では、「学習」が必要となる実装部分の仕様を、以下のように変更しています。

encode.sh

「空き時間に動画処理」(第8回)にて、「変数speed=2.5 は、PCの性能に応じて書き換える」としましたが、この変数の最適値を、encode.shを使用し続けているうちに、自動で調整(学習)するようにしました。

毎回の実行時に、隠しファイル .encode_stats.dat に処理情報(ファイルサイズと処理時間)を書き足していきます。実行時にこれを読み込んで、処理速度予測値を、初期値 speed=1 (1倍速)から、順次アップデートしていきます(変数はspeedのかわりに変数mingbを使うことにしました)。

ffmpegオプションの変更やCMカットをやめるなど、処理速度に影響する変更を行った際は、このファイル .encode_stats.dat を削除して、初期化します。

mvjf.sh

「ファイル名から番組名を抽出して、フォルダを掘って配置するスクリプト」(第7回)ですが、リストファイル mvjf.listに、取得した「番組名」を記録として残すことにしました。リストファイル内の「番組名」は、優先的に使用されます。不満足な結果になった場合には、このファイルmvjf.listを確認して、手作業で修正すれば、次回から正しい番組名が使用されます。

たとえば、mvjf.listに「シバのおきて~われら犬バカ編集部~」と書いてあれば、以下はすべて、この名前の同一フォルダに移動します。

【ドラマ10】シバのおきて~われら犬バカ編集部~[新]1崖っぷちに柴犬あり!?[解][字][再]
【ドラマ10】シバのおきて~われら犬バカ編集部~ 1崖っぷちに柴犬あり!?[解][字][再]
【ドラマ10】シバのおきて~われら犬バカ編集部~ 2シバが転べば、みな転ぶ[解][字][再]
【ドラマ10】シバのおきて~われら犬バカ編集部~(2)シバが転べば、みな転ぶ[解][字]
【ドラマ10】シバのおきて~われら犬バカ編集部~(5)犬温泉より愛をこめて[解][字]
【ドラマ10】シバのおきて~われら犬バカ編集部~3シバの気持ちは、シバに聞け[解][字]
【ドラマ10】シバのおきて~われら犬バカ編集部~4シバは、家族のかすがいか[解][字]

(天下のNHKですら、バイトの手作業なのでしょう。)


いいなと思ったら応援しよう!

ピックアップされています

全自動TV録画 視聴環境構築

  • 26本

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
テレビ録画メディアサーバー構築入門(第25回) |takya
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1