MeTube 中文教程:一条 Docker 命令搭建自己的视频下载站
2026-10-17发表于
Web 与自托管一、速览:MeTube 是什么,解决什么问题
入门
想从 YouTube 或其它视频站下载视频,常见做法是在电脑上装一个命令行工具,每次打开终端敲一串参数。MeTube 把这套命令行包装成了网页:你只需要复制链接、粘贴、点下载,视频就存到了你的服务器上。
它底层调用的是 yt-dlp(一个专门抓取各网站视频的开源程序),所以支持的网站数量和 yt-dlp 一样多,包括 YouTube、Bilibili、Vimeo 等数百个站点。
适合这几类人:有一台服务器(或家里的 NAS)、想 7×24 后台批量下载视频、想订阅某个频道自动追更的人。不需要懂编程,会复制粘贴命令就能用。
下图是它运行起来后的实际界面:

二、快速部署:Docker 一键跑起来
入门
部署前需要两样东西:一台能联网的 Linux 服务器(家里 NAS、云服务器都行,因为视频要下到"某台一直开着的机器"上,而不是你自己的笔记本),以及这台机器上装好了 Docker(一种把软件连同它需要的环境一起打包成"集装箱"的工具,装完就能直接运行,不用管依赖)。
先确认 Docker 装好了:
docker --version
有版本号输出即可。没装的话,Debian/Ubuntu 系统可以用官方脚本,或用发行版自带的包管理器安装 docker.io。
接下来是最省事的一行命令。把 /path/to/downloads 换成你服务器上真实的存放目录(先用 mkdir -p ~/downloads 建一个):
docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube
三个参数解释一下:-d 表示后台运行;-p 8081:8081 是把容器里的 8081 端口(软件对外的"门牌号")接到服务器的 8081 端口上;-v /path/to/downloads:/downloads 是把服务器目录和容器内的 /downloads 绑在一起,这样下载的文件会真实出现在你的服务器目录里,而不是关掉容器就消失。
然后浏览器打开 http://你的服务器IP:8081 就能看到界面了。
如果服务器有防火墙,记得放行 8081 端口,否则网页打不开。云服务器还需要在控制台的安全组里同样放行。
三、用 Docker Compose 部署(推荐长期使用)
入门
一行命令适合快速试用,但每次重启服务器都要重新敲。长期自建建议改用 Docker Compose(Docker 的"配置清单"工具,把端口、目录、环境变量写进一个文件,之后只需一条命令启停)。
新建一个文件夹,在里面创建 docker-compose.yml:
services:
metube:
image: ghcr.io/alexta69/metube
container_name: metube
restart: unless-stopped
ports:
- "8081:8081"
volumes:
- /path/to/downloads:/downloads
同样把 /path/to/downloads 换成你的实际目录。restart: unless-stopped 表示服务器重启后服务自动拉起,不用你手动干预。
之后的日常操作只有三条:
docker compose up -d # 启动
docker compose stop # 停止
docker compose pull && docker compose up -d # 升级到新版本
镜像同时发布在 Docker Hub 上(仓库名 alexta69/metube),并支持 amd64 和 arm64 两种 CPU 架构,家用 ARM 小主机也能跑。
四、配置详解:环境变量与权限
进阶 · 推荐细读
MeTube 全靠环境变量(程序启动时读取的一组"开关参数")来配置。在 docker run 里用 -e 名称=值 传入,在 Compose 里写在 environment: 段落中。
最常用的是这几个:
| 变量 | 默认值 | 说明 |
|---|---|---|
PUID / PGID |
1000 |
MeTube 运行和写文件时使用的用户/组 ID |
UMASK |
022 |
新建文件的权限掩码 |
CHOWN_DIRS |
true |
是否自动修正下载目录的属主 |
DOWNLOAD_DIR |
/downloads |
下载文件的存放目录 |
YTDL_OPTIONS |
无 | 全局生效的 yt-dlp 参数 |
PUID/PGID 是新手最常卡住的地方:Docker 容器里的程序默认可能以 root(超级管理员)身份写文件,导致宿主机上你的普通用户打不开或删不掉下载的视频。解决办法是把这两个值设成你自己的 ID,在服务器上执行:
id -u # 得到 PUID
id -g # 得到 PGID
Compose 里加上:
environment:
- PUID=1000
- PGID=1000
- UMASK=022
文件下载后显示属主是 root、宿主机上删不掉,几乎都是 PUID/PGID 没配对导致的。改完需要
docker compose up -d重建容器才生效。
YTDL_OPTIONS 用于给所有下载统一加 yt-dlp 参数,比如统一选择某个画质或格式;如果你的参数较多,可以改用 YTDL_OPTIONS_FILE 指向一个 JSON 配置文件,避免命令行过长。
五、功能导览:日常怎么用
入门
打开网页后,核心操作就是顶部的链接输入框:粘贴链接 → 选画质 → 点下载。任务会进入列表排队,进度条实时显示,完成后文件就在你挂载的下载目录里。
在高级选项里,每次下载都可以单独指定:视频质量与格式(最高画质、只要音频、转成 MP4 等)、存放子文件夹(比如按频道名归类)、以及播放列表条数(填 0 表示整个播放列表全下,填 5 只下前 5 个)。
除了单个视频,它还能处理整条播放列表和整个频道主页的链接——粘贴频道链接时,等于把"这个频道的全部视频"交给服务器慢慢跑。
订阅(Subscriptions)是进阶功能:把频道或播放列表添加为订阅后,MeTube 会定期检查,发现新视频自动加入下载队列,相当于给某个频道装了个"自动追更"的闹钟。
如果你在浏览器里浏览视频、想随手丢给服务器下载,还可以通过书签脚本或 API 的方式把当前页面链接直接发给 MeTube,具体配方见项目 wiki 的对应页面。
六、常见问题
进阶 · 推荐细读
1. 网页打不开?
先看容器有没有正常跑:docker ps 里应该有 metube。再依次排查:服务器防火墙和云安全组是否放行 8081、-p 参数是否与已占用端口冲突(换个端口即可,如 -p 8082:8081)、IP 是否填对。
2. 下载报错或提示需要登录?
部分站点对匿名访问有限制,可能需要用浏览器 Cookie。项目支持从浏览器导出 Cookie 提供给 yt-dlp 使用,具体步骤在 wiki 的 Cookies 章节,按说明挂载即可。不要把 Cookie 文件提交到公开仓库,它等同于你的账号凭证。
3. 文件权限不对、宿主机删不掉?
见上一节,调整 PUID/PGID/UMASK 后重建容器。若下载目录本身挂载错了,也要确认 -v 左右两边路径没写反(左边必须是宿主机绝对路径)。
4. 某些站点不支持?
MeTube 的抓取能力完全取决于 yt-dlp 的版本。站点改版后老版本经常失效,升级通常就能解决:docker compose pull && docker compose up -d。建议把升级设为定期任务。
5. 会不会下载到一半数据丢失?
不会。文件写在宿主机挂载目录里,容器删了重建也还在。只要不删宿主机目录,数据就安全。
七、运维进阶:HTTPS、反向代理与备份
深入 · 老手可选
局域网内用 HTTP 没问题,但一旦要从公网访问,建议配上 HTTPS(加密传输,防止链接和 Cookie 被中间人看到)。常用做法是在 MeTube 前面架一个反向代理(一个"前台接待",把外部请求转给后面的 MeTube),由代理统一申请和续期免费证书。
如果你已经用 Caddy,配置只需几行;用 Nginx 的话则要记得透传相关头信息。项目 wiki 的 HTTPS 与 reverse proxies 篇目里有现成模板可直接照抄。
数据备份很轻量:下载目录就是你全部有价值的文件,用 tar 打包或交给你现有的备份方案即可。配置本身写在 docker-compose.yml 里,一并纳入版本管理就行。
建议给升级加个定时任务,或开启 Docker 的自动拉取策略。yt-dlp 生态的更新频率很高,长期不升级是自托管下载服务失效最常见的原因。
到这里,你已经有了一个长期可用的自托管视频下载站。剩余的进阶玩法(输出文件名模板、硬件转码加速、订阅高级配置等)都在项目 wiki 里,遇到具体需求时再按需查阅即可。
项目信息
| 项目 | 值 |
|---|---|
| 仓库 | alexta69/metube |
| 语言 | Python |
| Star | 15,010 |
| Fork | 1,114 |
| 主页 | 无 |
参考链接
延伸阅读
想继续探索?这些同领域的教程可能也适合你:
163
72
1
3397
文章目录
评论