MeTube¶
概述¶
MeTube 是一個以網頁介面為核心的影片下載工具,底層建基於著名開源專案 yt-dlp。它讓使用者無需安裝任何命令行工具或瀏覽器擴充功能,只需在瀏覽器開啟一個簡潔的網頁,貼上 YouTube、Bilibili、Vimeo 等數以千計支援網站之連結,即可排程下載影片或音訊。MeTube 特別之處在於其「下載中」機制:它將下載任務排入佇列,並可同時處理多條連結,非常適合自架媒體庫、備份頻道,或配合 Nextcloud 等雲端儲存系統建立個人影片收藏。
MeTube 本身並不做影片轉檔或串流,它專注於「抓取」與「落地」。由於 yt-dlp 持續更新以應對各大平台反爬機制,MeTube 作為前端的好處,便是能將 yt-dlp 的能力隔離在一個獨立容器內,主機毋須安裝 Python 套件或處理依賴衝突。對香港使用者而言,若需要下載本地電視台重溫、YouTube 教學影片,或備份社交媒體內容,MeTube 提供一個相對穩定且可視化的方案。
架構¶
以本機實際部署為例,MeTube 採用單一 Docker 容器方式運行。鏡像來自 GitHub Container Registry:ghcr.io/alexta69/metube:latest。容器名稱固定為 metube,並設定 restart: unless-stopped,確保伺服器重新開機後自動恢復。
其架構非常輕量:由內建 Web 伺服器提供使用者介面,透過 yt-dlp 執行下載,將檔案寫入掛載的 ./downloads 目錄。咦?那容器與外界如何連通?參考 compose 片段,容器「不暴露 Port」,只使用 expose: "8081"。這意味著該服務並非直接對互聯網開放,而是透過反向代理或內網存取。此設計符合安全最佳實踐。部署所在的網絡為外部定義的 cf_network,容器獲分配固定 IPv4 地址 172.21.0.25。由於 cf_network 屬 external: true,可以推斷主機已有預先建立的 Docker bridge 網絡,通常用於配合 Cloudflare Tunnel 或 Nginx Proxy Manager 等組件。若需對外提供服務,可將 Cloudflare Tunnel 或反向代理指向 172.21.0.25:8081,無需向外界直接暴露任何主機連接埠。
這套架構的核心價值在於「隔離」:下載任務在容器內進行,即使 yt-dlp 被網站反制而異常,亦不會影響主機其他服務;下載目錄獨立掛載,方便之後映射至 Nextcloud 的資料夾,或由備份工具處理。
部署¶
部署步驟簡潔明瞭。首先,確認主機已安裝 Docker 及 Docker Compose Plugin。然後建立專案目錄,例如:
mkdir -p /opt/metube/downloads
cd /opt/metube
建立 docker-compose.yml,內容可參考範例,但請注意以下要點:
- 確保
cf_network已在主機存在(docker network create cf_network)。 UID: 1000與GID: 1000讓容器內進程以指定使用者執行,避免下載檔案在宿主機成為 root 擁有。TZ: Asia/Hong_Kong設定正確時區,令日誌時間及檔案時間戳符合本地習慣。DEFAULT_THEME: dark設定預設深色主題。
啟動服務:
docker compose up -d
檢查容器狀態:
docker compose ps
由於沒有直接映射連接埠,無法以 http://localhost:8081 從主機瀏覽器存取(除非透過 DNS 或 hosts 指向容器 IP)。需透過同一橋接網絡內之反向代理或另一容器存取,例如於 Cloudflare Tunnel 容器中配置 http://172.21.0.25:8081。
配置¶
MeTube 的配置主要透過環境變數完成。除上述時區、UID/GID、主題外,較常用選項包括:
OUTPUT_TEMPLATE:設定下載檔案命名格式,例如%(title)s.%(ext)s。DOWNLOAD_DIR:指定容器內下載目錄,但範例已掛載/downloads,可預設為相同路徑。URL_PATTERN:限制可提交的 URL 清單,防止開放轉發濫用。YTDL_OPTIONS:傳遞額外選項給 yt-dlp,例如--write-subs或--limit-rate。
由於 MeTube 支援將下載目錄自行指定,若要整合 Nextcloud,可將 Future 掛載點設為同一儲存位置,例如在下一層目錄建立 nextcloud-data/metube,並讓 MeTube 的 ./downloads 與 Nextcloud 的資料目錄共享。但實務上更建議只將 ./downloads 整個目錄,以 NFS 或 SMB 掛載至 Nextcloud 所在主機,再由 Nextcloud 外部儲存功能加入,避免與 Nextcloud 自身檔案資料庫產生權限衝突。
另一重要概念是「不暴露 Port」的部署策略。若想僅於內網使用,可直接透過 Docker DNS 名稱 metube 或固定 IP 存取。例如在 cf_network 上運行的 Nginx Proxy Manager,可設定 proxy host 指向 http://172.21.0.25:8081,再串接 Cloudflare Tunnel 對外提供 HTTPS。
維運與監控¶
營運 MeTube 需要注意以下數點:
- 鏡像更新:
latestTag 會持續更新,尤其 yt-dlp 經常因平台改版而需要更新。建議定期執行docker compose pull && docker compose up -d,或使用 Watchtower 自動更新。 - 磁碟空間:下載目錄可能急速膨脹,需監控宿主機空間。可使用
df -h或設定 cron 工作檢查。較簡單做法是為./downloads使用獨立分割區或 ZFS dataset,設定配額。 - 日誌:查看下載失敗原因時,使用
docker logs metube。MeTube 會輸出 yt-dlp 的 stderr,方便判斷是否因平台限制或格式問題導致失敗。 - 存取控制:因 MeTube 本身沒有使用者認證機制,若透過 Cloudflare Tunnel 對外公開,務必在 Tunnel 前加上 Access 規則(如 Cloudflare Zero Trust),否則任何知道網址的人皆可提交下載任務。
- 資源限制:下載大量影片可能令 CPU 及頻寬飽和。可在 Compose 中加入
deploy.resources.limits限制容器資源,避免影響其他服務。
實際監控方面,可使用 docker stats metube 即時觀察 CPU 與記憶體使用量。若整合 VictoriaMetrics 或 Prometheus,亦可透過 cAdvisor 收集容器指標,但對小型自架環境而言並非必要。
常見問題¶
問:為何無法透過主機 IP 直接開啟 MeTube 網頁?
因為 Compose 並未映射任何主機連接埠,服務只存在於容器網絡內。需自行設定反向代理,或臨時用 docker run 連接網絡並以 curl 測試。
問:下載的影片沒有字幕,如何設定?
在 MeTube Web UI 的「Advanced Options」中加入 --write-subs --sub-langs zh-Hant,zh-Hans,en,或透過 YTDL_OPTIONS 環境變數設定預設值。
問:容器不斷重啟,日誌顯示權限錯誤。
請確保宿主機 ./downloads 目錄的 owner UID/GID 與環境變數中的 1000 一致。執行 chown -R 1000:1000 ./downloads 即可。
問:如何與 Nextcloud 整合?
最直接方式是在 Nextcloud 中配置「外部儲存」,將 MeTube 下載目錄掛載到 Nextcloud 某個本地資料夾後,再新增為外部儲存,或者使用 Nextcloud 的 occ files:external:create。注意權限必須為 Nextcloud 使用者可讀。
相關鏈接¶
本頁面為 wiki.benhoweb.com 之條目,內容以實際部署經驗為基礎,適用於香港地區之自架環境。如有更新,歡迎共同編輯。
來源¶
自動生成(2026-08-19 容器覆蓋率補完第二批)