大家好,我是你们熟悉的技术老友。
今天这篇内容,其实是上一篇“飞牛fnOS实用Docker推荐”的续集。自从上次分享了几个基础必装容器后,后台留言和私信几乎被问爆了,问得最多的一句话就是:“能不能整一个全自动追剧的方案?我不想再到处找资源、手动下载、手动改名了。”
确实,手动追剧的痛苦,经历过的人都懂。尤其是在NAS上,下载、刮削、字幕、播放,每一步都可能成为劝退点。
今天这篇文章,我就把自己在飞牛fnOS上折腾了大半个月的“全自动追剧观影流”完整拆解出来。这篇保姆级教程会告诉你:
- 全自动观影链路的核心组件是什么。
- 为什么要用这套组合,而不是传统手动流程。
- 每一步在飞牛fnOS上怎么操作,命令和配置全部给出。
- 常见的坑和排错思路,都是真实经验。
友情提示:本文所有工具均为开源或免费软件,请务必遵守所在地区的法律法规,尊重知识产权,只下载和观看你拥有合法版权的资源。
1. 全自动追剧观影方案的核心概念
1.1 什么是全自动追剧链路?
所谓“全自动”,不是你点一下播放器那么简单,而是从剧集更新到下载入库再到客户端可播放,整个流程无需人工干预。
一个完整的自动追剧链路通常包含以下四个环节:
- 订阅/监控:告诉系统你想看哪部剧。
- 资源检索:系统自动从公开的索引器中搜索可下载的资源。
- 下载入库:命中订阅规则后,通知下载工具下载资源。
- 刮削整理:下载完成后,自动重命名、整理目录、抓取海报和简介,最终展示在媒体库中。
这四步环环相扣,任何一环断了,自动追剧就变成了半自动。
1.2 为什么选择 Docker 方案?
飞牛fnOS自带应用中心虽然也提供了一些影音应用,但为了可移植性、可定制性和生态丰富度,Docker 部署是更优解。
- 版本可控:Docker 官方镜像跟随上游更新,修复 Bug 更快。
- 环境隔离:每个容器独立运行,不污染宿主机系统。
- 数据迁移方便:所有容器的数据都挂在指定目录下,备份、迁移、灾难恢复都更方便。
- 生态丰富:LinuxServer.io、hotio 等第三方镜像组织提供了大量预配置镜像,开箱即用。
1.3 链路组件速览
| 组件 | 功能 | 推荐镜像 |
|---|---|---|
| qBittorrent | 下载工具,负责 BT/PT 下载 | linuxserver/qbittorrent |
| Jackett | 索引器聚合,统一检索各大资源站 | linuxserver/jackett |
| Prowlarr | 新一代索引器管理工具(推荐) | linuxserver/prowlarr |
| Sonarr | 剧集订阅管理,自动匹配下载 | linuxserver/sonarr |
| Radarr | 电影订阅管理,自动匹配下载 | linuxserver/radarr |
| Jellyfin | 媒体服务器,统一刮削和播放 | linuxserver/jellyfin |
| Bazarr | 字幕下载工具,自动匹配中文字幕 | linuxserver/bazarr |
这套组合可以简称为“Arrs 套件 + Jellyfin”,是国内外 NAS 玩家最主流的组合之一。
2. 环境准备与版本说明
2.1 硬件环境
本文示例基于飞牛fnOS 0.8.x 版本,硬件为常规 x86_64 平台 NAS(Intel J4125 以上即可流畅运行)。ARM 设备(如玩客云、斐讯N1)也能装,但建议单开 qBittorrent + Jellyfin,资源检索套件比较吃内存。
2.2 软件准备
- 飞牛fnOS 系统已安装并可以正常访问。
- 系统已开启 SSH 或可直接在飞牛后台 Docker 界面操作。
- 准备一个存储影视资源的目录,例如任意盘下创建的
/vol1/1000/Media(具体盘符根据你的 NAS 实际布局调整)。
2.3 目录规划
强烈建议在建容器前先规划好目录结构,否则后面换 Volume 迁移非常痛苦。
Media/ ├── Downloads/ # 下载临时目录 │ ├── complete/ # 下载完成 │ └── incomplete/ # 下载中 ├── Movies/ # 电影库 ├── TV/ # 剧集库 │ ├── 美剧/ │ └── 日韩剧/ └── anime/ # 动漫库在飞牛fnOS 的文件管理器中先建好这些文件夹,并记录下它们的绝对路径。在容器中习惯把路径映射为/downloads、/movies、/tv等,方便配置。
3. 核心组件原理与配置拆解
3.1 下载工具:qBittorrent
qBittorrent 是目前 NAS 上最受欢迎的下载工具,支持 BT/PT,有完整的 Web UI,API 对接能力强,资源占用也比 transmission 更可接受。
推荐镜像linuxserver/qbittorrent,其环境变量和路径映射相对规范。
version: "2.1" services: qbittorrent: image: lscr.io/linuxserver/qbittorrent:latest container_name: qbittorrent environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai - WEBUI_PORT=8080 volumes: - /path/to/config:/config - /path/to/Media/Downloads:/downloads ports: - "8080:8080" - "6881:6881" - "6881:6881/udp" restart: unless-stopped关键参数说明:
PUID/PGID:指宿主机用户和用户组 ID,为了避免容器内创建的文件无法在宿主机编辑,建议通过命令id username查看具体值,设置为你常用的用户。WEBUI_PORT:Web 管理界面端口,固定为 8080,修改后需相应映射端口。- 端口
6881是 BT 下载的监听端口,如果启用了防火墙,记得放行 TCP 和 UDP。
首次配置:启动后访问http://NAS_IP:8080,默认用户名admin,密码需要查看容器日志(LinuxServer 镜像首次启动会随机生成一个密码,日志中会输出)。
3.2 索引器管理:Prowlarr 还是 Jackett?
Jackett 是老牌索引器聚合器,但它通过网站爬虫方式抓取,延迟高且容易被反爬。Prowlarr 作为 Sonarr/Radarr 官方团队的新一代产品,支持原生 API 索引器,兼容性更好,推荐直接使用 Prowlarr。
Prowlarr 安装很简单:
version: "2.1" services: prowlarr: image: lscr.io/linuxserver/prowlarr:latest container_name: prowlarr environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - /path/to/config:/config ports: - "9696:9696" restart: unless-stopped启动访问http://NAS_IP:9696,在Settings -> Indexers中点击Add Indexer,会看到可用的公开索引器列表。选择你所在地区可访问的公共索引器,并填入正确的 API Key。
注意:如果你使用的站点需要特殊网络条件才能访问,Prowlarr 支持配置代理(Settings -> Apps -> Proxy),但请自行确认相关行为的合法性。
3.3 订阅管理:Sonarr + Radarr
Sonarr 负责剧集,Radarr 负责电影,两者使用逻辑一致,你只需要懂一个,另一个自然融会贯通。
这里以 Sonarr 为例。
version: "2.1" services: sonarr: image: lscr.io/linuxserver/sonarr:latest container_name: sonarr environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - /path/to/config:/config - /path/to/Media/TV:/tv - /path/to/Media/Downloads:/downloads ports: - "8989:8989" restart: unless-stopped启动后访问http://NAS_IP:8989,按以下顺序配置:
- Settings -> Media Management:勾选 “Rename Episodes” 和 “Use Hardlinks instead of Copy”,硬链接可以节省空间,同时避免做种中断。
- Settings -> Download Clients:添加 qBittorrent,填入地址
http://NAS_IP:8080以及用户名密码。 - Settings -> Indexers:这里可以直接添加 Prowlarr 的索引器,或在 Prowlarr 的Settings -> Apps中添加 Sonarr 并开启同步,推荐后者。
- Series -> Add New Series:搜索剧名并订阅。
什么是硬链接?
硬链接是同一文件的多个引用路径,只占用一份存储空间。比如下载到/downloads的文件,硬链接到/tv/剧集目录后,删除/downloads里的链接,文件仍然存在。这比复制省一半空间,比移动安全(不影响做种)。
3.4 媒体服务器:Jellyfin
Jellyfin 是开源免费版媒体服务器,也是整个链路的最终展示端。它不仅能在同一局域网内播放,还支持通过飞牛自带的远程访问、Tailscale 等方式在外网观看。
version: "2.1" services: jellyfin: image: lscr.io/linuxserver/jellyfin:latest container_name: jellyfin environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - /path/to/config:/config - /path/to/Media/Movies:/movies - /path/to/Media/TV:/tv - /path/to/Media/anime:/anime ports: - "8096:8096" restart: unless-stopped启动后访问http://NAS_IP:8096,按向导设置媒体库路径即可。Jellyfin 会自动刮削海报、演员、简介。如果刮削不了,多半是元数据源访问受限,可以在 JDBC 元数据下载器中手动指定可访问的元数据源地址。
3.5 字幕工具:Bazarr
看剧没字幕等于半聋,Bazarr 就是为了解决这个问题。它可以配合 Sonarr/Radarr 自动下载对应语言的字幕。
version: "2.1" services: bazarr: image: lscr.io/linuxserver/bazarr:latest container_name: bazarr environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - /path/to/config:/config - /path/to/Media/Movies:/movies - /path/to/Media/TV:/tv - /path/to/Media/anime:/anime ports: - "6767:6767" restart: unless-stopped使用步骤:
- 访问
http://NAS_IP:6767。 - 在 Settings 中开启 Sonarr / Radarr 连接,填入对应 API 地址和密钥。
- 字幕提供商中添加上传资源站点(如国内常见的字幕网站地址),填好 API Key。
- 开启 “Upgrade Previously Downloaded Subtitles”,Bazarr 会自动为已下载的剧集补充字幕。
4. 完整实战:飞牛 fnOS 从零搭建全自动观影系统
前面讲了原理和组件,接下来进入完整实操环节。先在飞牛 fnOS 文件管理器中创建基础目录,再按照 Docker Compose 或 Web UI 方式逐个创建容器。
4.1 创建项目目录结构
打开飞牛 fnOS 的“文件管理”应用,在任意共享文件夹下建立以下目录:
/vol1/1000/Docker/arrs/ ├── qbittorrent/ ├── prowlarr/ ├── sonarr/ ├── radarr/ ├── jellyfin/ └── bazarr/ /vol1/1000/Media/ ├── Downloads/ │ ├── complete/ │ └── incomplete/ ├── Movies/ ├── TV/ └── anime/这里的
/vol1/1000/只是示例,你需要进入文件管理器右键查看实际绝对路径。
4.2 方式一:通过飞牛 Web UI 添加 Docker 容器(适合新手)
飞牛 fnOS 的 Docker 管理界面做得比较完整:
- 打开“Docker”应用,点击“镜像”->“拉取镜像”,依次输入
lscr.io/linuxserver/qbittorrent:latest、lscr.io/linuxserver/prowlarr:latest等。 - 拉取完成后点击“创建容器”,按界面对照前面 YAML 中的配置填写端口、目录和环境变量。
- 路径映射时,请勾选 “映射真实路径”,并正确选择宿主机绝对路径。
缺点是每创建一个容器都要手动填一遍,略显繁琐。如果你熟悉 SSH,更推荐方式二。
4.3 方式二:通过 SSH 使用 Docker Compose(推荐)
如果你已经开启 SSH,可以直接用飞牛的终端功能登录或外部工具连接,然后创建一个arrs-stack.yaml文件,将所有服务一次性启动。
# 进入要存放 compose 文件的目录 cd /vol1/1000/Docker/arrs # 使用 nano 或 vim 编辑 nano docker-compose.yml填入以下完整配置(记得将/vol1/1000/替换为你的实际路径):
version: "2.1" services: qbittorrent: image: lscr.io/linuxserver/qbittorrent:latest container_name: qbittorrent environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai - WEBUI_PORT=8080 volumes: - /vol1/1000/Docker/arrs/qbittorrent/config:/config - /vol1/1000/Media/Downloads:/downloads ports: - "8080:8080" - "6881:6881" - "6881:6881/udp" restart: unless-stopped prowlarr: image: lscr.io/linuxserver/prowlarr:latest container_name: prowlarr environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - /vol1/1000/Docker/arrs/prowlarr/config:/config ports: - "9696:9696" restart: unless-stopped sonarr: image: lscr.io/linuxserver/sonarr:latest container_name: sonarr environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - /vol1/1000/Docker/arrs/sonarr/config:/config - /vol1/1000/Media/TV:/tv - /vol1/1000/Media/Downloads:/downloads ports: - "8989:8989" restart: unless-stopped radarr: image: lscr.io/linuxserver/radarr:latest container_name: radarr environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - /vol1/1000/Docker/arrs/radarr/config:/config - /vol1/1000/Media/Movies:/movies - /vol1/1000/Media/Downloads:/downloads ports: - "7878:7878" restart: unless-stopped jellyfin: image: lscr.io/linuxserver/jellyfin:latest container_name: jellyfin environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - /vol1/1000/Docker/arrs/jellyfin/config:/config - /vol1/1000/Media/Movies:/movies - /vol1/1000/Media/TV:/tv - /vol1/1000/Media/anime:/anime ports: - "8096:8096" restart: unless-stopped bazarr: image: lscr.io/linuxserver/bazarr:latest container_name: bazarr environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - /vol1/1000/Docker/arrs/bazarr/config:/config - /vol1/1000/Media/Movies:/movies - /vol1/1000/Media/TV:/tv - /vol1/1000/Media/anime:/anime ports: - "6767:6767" restart: unless-stopped然后执行:
docker compose up -d等待镜像拉取完成后,输入docker ps应该能看到 6 个容器全部处于Up状态。
4.4 初始化配置与联动
容器启动后,按以下顺序完成初始化:
第一步:配置 qBittorrent
访问http://NAS_IP:8080,默认用户名admin,密码查看日志:
docker logs qbittorrent | grep -i password找到临时密码登录后,在工具 -> 选项 -> Web UI中修改密码,建议同时开启 “对本地主机以外的来源进行认证”。
第二步:配置 Prowlarr 并连接 Sonarr / Radarr
- 访问
http://NAS_IP:9696,在Settings -> Indexers中添加你所用到的索引器。 - 在
Settings -> Apps中点击Add Application,类型选择Sonarr,填入 Sonarr 的 URLhttp://sonarr:8989(在同一 Docker 网络中可以直接用容器名)以及 API Key。 - 重复添加 Radarr。
- 回到 Sonarr 的
Settings -> Indexers,点击Test All Indexers,应该能看到所有索引器测试通过。
在同一 Compose 网络内,服务之间访问建议使用容器名(如
http://sonarr:8989),这样可以避免因为 IP 变化导致配置失效。
第三步:Sonarr / Radarr 配置下载客户端
在 Sonarr 中进入Settings -> Download Clients,添加 qBittorrent:
- Host:
http://qbittorrent:8080或http://NAS_IP:8080 - Username / Password:填入刚修改的 qBittorrent 账号密码
测试通过后,再到Settings -> Media Management开启硬链接:
- Enable Rename Episodes:开启
- Use Hardlinks instead of Copy:开启
第四步:Jellyfin 添加媒体库
访问http://NAS_IP:8096,创建管理员账号后,按向导添加媒体库:
- 电影库:
/movies - 剧集库:
/tv - 动漫库:
/anime
媒体库类型如果默认识别不对,可以手动选择对应的 Media Type。
第五步:测试全链路
在 Sonarr 中添加一部剧:
- 点击
Series -> Add New Series。 - 输入英文名,选择对应条目。
- 选择根目录为
/tv。 - 勾选 “Monitor” 为 “All Episodes” 或 “Future Episodes” 均可。
保存后,Sonarr 会自动去索引器搜索已有资源,匹配完成后发送下载任务到 qBittorrent。
等下载完成后,打开 Jellyfin,刷新媒体库,你就能看到这部剧已经被自动刮削整理好了,点击即可播放。
4.5 预期结果说明
如果一切顺利,你会看到:
- qBittorrent 中出现下载任务。
- 下载完成后
/tv/剧名/季数/剧名.S01E01.mkv文件自动出现。 - Jellyfin 首页出现带海报墙的剧集条目。
- Bazarr 日志显示为对应剧集下载了中文字幕。
5. 常见问题与排查思路
5.1 容器日志中找不到 qBittorrent 默认密码
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 日志里没有 password 信息 | 已修改过密码,或镜像版本变化 | 暂停并删除容器,删除 config 目录内容后重建,按日志输出获取初始密码 |
| 日志显示 password is temporary | 临时密码已生成 | 复制其后字母数字串即为密码 |
5.2 Sonarr 添加下载客户端时测试失败
先从这几个方面排查:
- 确认 qBittorrent 的 Web UI 是否可以从宿主机访问。
- 确认填写的用户名密码正确。
- 确认 Sonarr 能访问到
qbittorrent:8080这个地址(Compose 网络内)。可以在 Sonarr 所在的容器里测试:
docker exec -it sonarr bash curl http://qbittorrent:8080如果容器内没有 curl,可以先安装或在宿主机直接curl http://NAS_IP:8080验证宿主机层面。
5.3 Jellyfin 刮削不到海报和简介
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 媒体库为空或海报不显示 | 元数据源访问不了 | 在 Jellyfin 后台将默认元数据服务器改为可访问的地址,或在 DNS 层面配置适合当前网络的解析 |
| 部分剧集无法刮削 | 剧集命名不规范 | 先通过 Sonarr 统一整理,确认媒体库内文件路径符合剧名/季/集规范 |
5.4 Bazarr 不在线或字幕下载失败
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| Bazarr 显示 Provider 错误 | 字幕站点 API Key 失效 | 重新到对应字幕网站获取 API Key 并更新 |
| 字幕一直不下载 | Sonarr / Radarr API 同步没开启 | 在 Bazarr 的 Settings 中点击 Test,确认能成功读取到剧集列表 |
5.5 硬链接没有生效
硬链接生效需要满足一个前提:下载目录和媒体库目录必须在同一个文件系统(同一个挂载卷)内。
如果你的Downloads和TV在飞牛的不同存储空间(比如一个是系统盘、一个是数据盘),硬链接就会失败,Sonarr 会自动退化为复制或移动,属于正常现象。
解决方式:确保下载临时目录和最终媒体库在同一个存储空间或同一个共享文件夹下。
6. 最佳实践与工程建议
6.1 用 Docker Compose 统一管理
在飞牛 Web UI 上手动逐个创建容器虽然直观,但不利于日后迁移和灾备。强烈推荐把 Compose 文件存放到 NAS 里,必要时一条命令全部拉起来:
docker compose down # 停掉所有服务 docker compose up -d # 重新拉起所有服务Compose 也是一种文档,记录了你的所有端口映射、环境变量和路径,方便二次排查。
6.2 合理规划 PUID/PGID
不要在图省事的情况下把容器都用 root 运行。在飞牛 fnOS 中,建议创建一个专门用户(如media),并将PUID、PGID统一设为该用户的 ID。这样可以避免各容器文件互相读写权限混乱,也能防止一些下载文件由于归属 root 导致宿主机无法删除。
查看当前用户 ID:
id media6.3 做种与硬链接的取舍
如果你是 PT 用户,下载完成后需要保持做种直到达到分享率要求。强烈建议不要把资源直接移到其他目录,而是保持 qBittorrent 的保存路径不变,同时让 Sonarr/Radarr 硬链接到媒体库。
丢弃了硬链接而依赖复制,不仅浪费磁盘,还会造成空间迅速被填满,在 NAS 上是典型的新手操作。
6.4 容器数据备份
容器本身没有数据,需要备份的是config目录。建议在飞牛中创建一个定期任务(或者用宿主机cron),将/vol1/1000/Docker/arrs/压缩备份到另一块磁盘或云盘。
备份命令参考:
tar -czf /vol1/1000/Backup/arrs-backup-$(date +%Y%m%d%H%M%S).tar.gz -C /vol1/1000/Docker arrs6.5 安全边界
- qBittorrent、Sonarr、Radarr 等 Web 服务尽量不要直接暴露到公网,除非你能控制好访问策略。
- 飞牛自带远程访问功能,使用时注意为每个应用设置独立的访问 Token。
- 各服务的默认端口和密码不要采用可猜测的弱口令,尤其是你通过路由器做了端口转发时。
- 保持容器版本更新,LinuxServer 等镜像会定期重建,建议每月执行一次:
docker compose pull docker compose up -d7. 总结与下一步方向
到这一步,你已经拥有了一个完整的 NAS 全自动追剧观影系统:
- qBittorrent 负责下载。
- Prowlarr 负责聚合资源检索。
- Sonarr / Radarr 负责订阅和自动匹配。
- Jellyfin 负责库存展示和播放。
- Bazarr 负责自动匹配字幕。
整个链路打通下来,你只需要在 Sonarr 里点一下“订阅”按钮,其余工作系统会自己完成。
下一步可以继续折腾的方向还有很多:
- 在 Jellyfin 中部署客户端 App,实现电视、手机、平板多端播放。
- 通过飞牛自带的远程访问或 Tailscale 方案,实现外网随时看剧。
- 结合 Cloudflare Tunnel 等方案,给家里的 NAS 加上安全的外部访问入口。
- 为电视剧建立分类规则,比如新剧、完结剧、每周更新的综艺,按不同目录自动入库。
追剧自动化是一个涉及“下载、数据整理、元数据刮削、多端播放”的完整链路,每个环节都有其细节与坑点。建议你先按文中这套主链路跑通最小闭环,再逐步加功能。
如果你在这套方案中遇到了其他奇怪的问题,欢迎在评论区带上你的报错日志和 Compose 文件来讨论。折腾 NAS 本来就是一件有成就感的事,把自己的自动化影音库一点点搭起来,那种顺畅体验真的会让人上瘾。
觉得有用的话,记得点赞收藏,方便后面实操时随时翻出来对照。