MeTubeをyt-dlpの管理画面として安全に運用する
YouTube およびその他のサイト用の自己ホスト型ビデオ ダウンローダー (yt-dlp の Web UI)。
ひと目でわかる
- これは何?
- Dockerで動かすセルフホスト型のダウンロードUIについて、保存先、オプションの重ね合わせ、SSRFとコマンド実行の注意を確認します。
- 誰に向いている?
- 向いているのは、自分が管理する環境で動画、音声、字幕、サムネイルを取得し、保存先と同時実行数を管理したい人です。一般公開のダウンロードサービスや、取得後のメディアライブラリ管理を一つで済ませたい用途には不向きです。
- 商用利用できる?
- 厳しい条件付きでできます。AGPL-3.0 はネットワーク型コピーレフトのライセンスで、改変版をホスティングサービスなどとしてネットワーク越しに利用させる場合、その利用者にソースコードを同じライセンスで提供する必要があります。
- 今もメンテナンスされている?
- されています。最後のコミットは 6 日前です。
- 何の言語で書かれている?
- 主に Python です(GitHub の言語統計による)。
回答はプロジェクトの GitHub データ(最終同期:2026年9月15日)と当サイトの分析に基づくもので、法的助言ではありません。
オープンソース詳細解説
yt-dlpをブラウザから使う薄いUI
MeTubeはyt-dlpのセルフホスト型Web UIです。YouTubeとyt-dlpが対応する多数のサイトから、動画、音声、字幕、サムネイルをブラウザでダウンロードできます。プレイリストやチャンネルにも対応し、購読した対象を定期的に確認して新しい項目をキューへ追加できます。Dockerイメージはamd64とarm64のマルチアーキテクチャです。
役割は取得とキュー管理に絞られています。READMEはタグ付けや再生ライブラリ、検索インデックスを提供するとは説明していません。ダウンロード後の整理は別のツールや自分の保存規則が担当します。利用規約や著作権など、取得先ごとの条件もMeTubeが判断するものではありません。
Dockerの最小構成と保存先
READMEの最小コマンドは`docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube`です。Composeでは同じポートとボリュームを使い、`restart: unless-stopped`を指定します。READMEに記載された導入入口はDockerです。
コンテナを起動したら、UIへアクセスして短いテスト動画を一つ取得し、ホスト側の`/path/to/downloads`にファイルが作られることを確認します。保存先だけでなく、状態ファイルの置き場、コンテナ再起動後のキュー、書き込みユーザーも確認します。PUIDは既定1000、PGIDは既定1000、UMASKは022です。ホストの権限と一致しない場合は、導入直後にエラーを観察します。
環境変数で運用境界を決める
同時実行数は`MAX_CONCURRENT_DOWNLOADS`で制御し、既定値は3です。完了項目を自動で消す`CLEAR_COMPLETED_AFTER`、ゴミ箱からファイルを削除する`DELETE_FILE_ON_TRASHCAN`、購読確認間隔、プレイリストの上限も設定できます。`DOWNLOAD_DIR`と`AUDIO_DOWNLOAD_DIR`で動画と音声の保存先を分け、`STATE_DIR`には`queue.json`、`pending.json`、`completed.json`、`subscriptions.json`が保存されます。
一時ファイル用の`TEMP_DIR`をSSDやtmpfsに置けますが、RAMファイルシステムでは再開できない可能性があります。`DOWNLOAD_DIRS_INDEXABLE`の既定値はfalseです。ディレクトリをWebから閲覧可能にする設定を有効にする前に、ファイルの公開範囲と認証を確認します。
yt-dlp設定は三層で合成される
MeTubeはyt-dlpの設定を、全ダウンロードに適用するグローバルオプション、UIで選ぶ名前付きプリセット、個別ダウンロードの上書きという三層で扱います。最初にグローバル、次に選択したプリセット、最後に個別上書きが結合され、衝突時は具体的な後段が優先されます。`YTDL_OPTIONS`はJSONオブジェクトで、ファイルやプリセットファイルを指定する環境変数もあります。
ファイル名は`OUTPUT_TEMPLATE`、プレイリストとチャンネルは個別テンプレートで制御できます。個別上書きは既定で無効ですが、`ALLOW_YTDL_OPTIONS_OVERRIDES`を有効にするとUI利用者が任意のyt-dlp APIオプションを入力でき、コンテナ内の任意コマンド実行につながる可能性があります。信頼できる利用者だけの閉じた環境で扱う設定です。
SSRF対策、Cookie、CORSの扱い
`ALLOW_PRIVATE_ADDRESSES`は既定falseで、内部ホストへ解決されるURLを拒否し、SSRFを抑止します。trueにすると保護が無効になるため、READMEは信頼できる環境だけで使うよう求めています。CookieはAdvanced Optionsからブラウザで書き出した`cookies.txt`をアップロードできますが、ファイル自体が認証情報です。保管先と削除手順を決めます。
ChromeやFirefoxの拡張、ブックマークレット、iOSショートカット、Raycast拡張からURLを送れます。ブラウザ連携には`CORS_ALLOWED_ORIGINS`の設定が必要で、HTTPSページから使うならMeTubeもHTTPSで提供します。許可するオリジンを広く設定せず、必要な連携元だけに限定します。
WebSocketを通すHTTPS構成と更新
直接HTTPSを使う場合は`HTTPS=true`、`CERTFILE`、`KEYFILE`を設定できます。リバースプロキシの背後に置く場合、リアルタイム更新に使うWebSocketのためにUpgradeとConnectionヘッダーを転送します。サブディレクトリで公開するなら`URL_PREFIX`を設定します。
yt-dlpは頻繁に更新されるため、新しい安定版が出ると新しいMeTube Dockerイメージが自動公開されるとREADMEにあります。夜間版を使う`YTDL_NIGHTLY_UPDATE_TIME`もありますが、取得サイト側の変化で動作が変わる可能性を考え、更新前のイメージと設定を記録します。自動更新を有効にする場合は、失敗したダウンロード、出力ファイル、WebSocket接続を更新前後で比較します。
購読と保存状態を再起動後に確認する
MeTubeの購読機能を試すなら、対象を一つのプレイリストに限定し、`SUBSCRIPTION_DEFAULT_CHECK_INTERVAL`と`SUBSCRIPTION_SCAN_PLAYLIST_END`を小さく設定して新規項目のキュー投入を観察します。状態は`STATE_DIR`の`subscriptions.json`とキュー関連ファイルに保存されるため、コンテナを再起動して登録と完了履歴が戻るかを確認します。
動画と音声を分ける場合は`AUDIO_DOWNLOAD_DIR`と`OUTPUT_TEMPLATE`を設定し、実ファイルの拡張子とフォルダを照合します。`DELETE_FILE_ON_TRASHCAN`を有効にする前にはテストファイルで削除結果を確認し、Cookieを使った取得では処理後に認証ファイルが残っていないことを調べます。MeTubeのキュー、保存、認証の三つを別々に確認できる手順です。実施記録には対象版と入力条件を残し、成功した結果だけでなく失敗した場合の出力も保存します。設定を変更した前後で同じ確認を繰り返せるようにし、READMEに書かれた機能と自分の環境で確認できた事実を分けます。採用判断では、導入できたかだけでなく、更新、障害、切り戻し、権限、ライセンスを同じ担当者が追跡できるかを確かめます。
編集部の結論
向いているのは、自分が管理する環境で動画、音声、字幕、サムネイルを取得し、保存先と同時実行数を管理したい人です。一般公開のダウンロードサービスや、取得後のメディアライブラリ管理を一つで済ませたい用途には不向きです。最初に`127.0.0.1:8081`相当の閉じた公開範囲で起動し、保存先、状態ファイル、Cookie、URLの許可範囲を確認してください。
コミュニティノート