花了两天时间,终于在群晖NAS上把一整套电影自动下载系统跑通了。从搜索、下载、整理到电视播放,全程自动化。记录一下整个过程,也给有类似需求的朋友参考。
最终效果
在手机或电脑上打开 Jellyseerr(一个类似豆瓣电影的应用),搜索想看的电影,点一下”请求”。系统会自动:
- 在资源站搜索高清种子
- 推送到下载工具开始下载
- 下载完成后自动整理到媒体库
- 媒体服务器自动扫描入库
- 小米电视上打开 Jellyfin 就能直接看
全程零人工干预,从请求到能看大概只需要等下载完成的时间。
系统架构
整个系统由 6 个 Docker 容器组成,跑在群晖 DS420+ 上:
Jellyseerr(5055) → Radarr(7878)/Sonarr(8989) → qBittorrent(8090) → 下载
↓
Prowlarr(9696) 管理 Indexer Jellyfin(8096) → 电视播放
简单解释一下各自的角色:
- Jellyseerr:入口,像豆瓣电影一样的界面,负责搜索电影/电视剧、发请求
- Radarr:电影管理器,负责搜索电影资源、管理已下载的电影
- Sonarr:电视剧管理器,功能和 Radarr 类似,但管的是电视剧
- Prowlarr:资源索引管理器,统一管理各种种子站的接口,同步给 Radarr/Sonarr
- qBittorrent:BT 下载客户端,负责实际下载
- Jellyfin:媒体服务器,像 Netflix 一样的界面,管理所有电影/电视剧,支持各种客户端
硬件环境
- NAS:群晖 DS420+,Intel Celeron J4025 双核,10GB 内存
- 存储:两块硬盘,Volume 1 放媒体文件,Volume 2 跑 Docker 服务
- 播放设备:小米电视(安装 Jellyfin for Android TV)
搭建步骤
第一步:Docker Compose 部署
所有服务用一个 docker-compose.yaml 管理最省心。关键配置点:
- 所有容器放在同一个 Docker 网络(media-server_default),这样容器之间可以用名字互相访问
- 统一挂载 /volume1/docker/media-server/media 到各容器的 /media 目录
- 设置 PUID/PGID 匹配 NAS 用户(我用的是 1026/100)
第二步:配置 qBittorrent
坑点来了:qBittorrent 默认每次容器重启都会生成随机临时密码,导致 WebUI 登不上。解决方法是用 API 先登录临时密码,再设一个固定密码。
另外要创建下载分类(movies、tv),每个分类指定保存路径,这样 Radarr/Sonarr 下载的东西才能自动归类。
第三步:配置 Prowlarr + Indexer
Prowlarr 是资源站的管理中心。目前配了 YTS(一个公开的 HD 电影种子站,资源质量不错,体积也小)。
配好 Prowlarr 之后,需要把它作为应用同步到 Radarr 和 Sonarr,这样 Radarr/Sonarr 就能通过 Prowlarr 的接口去搜索资源了。
第四步:配置 Radarr 和 Sonarr
Radarr/Sonarr 分别管理电影和电视剧。主要配置:
- 连接 qBittorrent 作为下载客户端
- 设置质量配置(我选了 HD 720p/1080p)
- 设置根目录(电影 /media/movies,电视剧 /media/tv)
配置好之后,Indexer 会自动从 Prowlarr 同步过来。
第五步:配置 Jellyseerr
Jellyseerr 是整个系统的门面。它连接 Radarr(电影)和 Sonarr(电视剧),还连接 Jellyfin(媒体库展示)。
这里有个坑:TMDB(电影数据库)在国内被墙了,Jellyseerr 搜索不了电影。解决方案是在云服务器上用 Nginx 做反向代理,把 TMDB 的 API 和图片 CDN 反代到自己的域名下。
第六步:配置 Jellyfin
Jellyfin 是最终播放端。需要创建媒体库,指向 Radarr 和 qBittorrent 下载文件保存的目录。元数据语言设为中文。
小米电视上安装 Jellyfin for Android TV(到 GitHub 下载 APK,U 盘安装),填上 NAS 地址就能用了。
踩过的坑
1. SSH 写文件被转义
写 docker-compose.yaml 时,YAML 里的 $ 符号会被 shell 当变量解释,导致文件内容被破坏。最后改用 Python3 脚本来写文件才解决了。
2. Docker 网络互通
Docker 默认的 bridge 网络不支持容器名互相访问。必须在 docker-compose 里定义自定义网络,所有服务加入同一个网络才能用容器名互通。
3. Jellyseerr 配置不持久化
通过 API 配置的 Radarr/Sonarr 连接,容器重启后会丢失。需要通过正确的 API 路径重新配置。
4. qBittorrent 密码重置
每次容器重启密码都变,必须用 API 设固定密码。这件事我只做了一次就忘了,下次重启又得来一遍。建议在 docker-compose 里设置环境变量。
5. TMDB 被墙
Jellyseerr 依赖 TMDB 来搜索和展示电影信息,但国内直连不通。好在有云服务器,Nginx 反代一下就搞定了。
最终体验
现在整个流程是:打开手机 → 搜索电影 → 点请求 → 等下载 → 电视上看。中间完全不用管。
下载速度取决于种子和带宽,YTS 的资源一般在 1-2MB/s,一部 1080p 电影大约 2-3GB,二十来分钟就下完了。下完自动入库,Jellyfin 自动刷新,电视上立即就能看到。
整个过程最难的不是技术,而是把六七个软件的配置串起来。每个软件的文档都是英文的,API 也不太直观。但只要搞清楚了数据流向,一步一步配就对了。
下一步打算加更多 Indexer(资源站),让能搜到的电影更多。Prowlarr 支持几百个种子站,很多是公开的不需要注册。等有精力了慢慢加吧。