テレビ録画メディアサーバー構築入門(第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を利用するなどの場合は、サーバーを分離しての運用をおすすめします。
構築手順
サーバー構成
録画サーバー EPGStation: PC名 pidgeot22
m2ts出力先: ~/docker-mirakurun-epgstation/recorded/メディアサーバー Jellyfin: PC名 fearow22
作業フォルダ: ~/pidgeot22/work/
mp4出力先: /buffalo/media/
やること
録画サーバーpidgeot22 のm2ts出力先を、メディアサーバーfearow22 の同期フォルダ に同期する。
pidgeot22の ~/docker-mirakurun-epgstation/recorded/ と
fearow22の ~/pidgeot22/work/recorded/ を同期するメディアサーバーでは、同期フォルダを監視して、新たに動画が追加されたら変換処理をする。
作業内容はこれまで(単一サーバー構成)と同じだが、これまでとは異なり、録画中かどうか、次の録画まで時間が十分あるか、など、気にする必要はなく、ファイル同期完了後すぐに作業に移行できる。
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 syncthinguser モードで使用する。
systemctl --user enable syncthing.service
systemctl --user start syncthing.servicesystemctl --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ですら、バイトの手作業なのでしょう。)



コメント