ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

用Docker在飞牛NAS上搭建全自动追剧观影系统

用Docker在飞牛NAS上搭建全自动追剧观影系统 这次我们来看一套跑在飞牛 fnOS 上的全自动追剧观影方案。不是单装一个播放器而是把“订阅 - 下载 - 整理 - 刮削 - 播放”整条链路用 Docker 串起来你只要维护一个订阅列表剩下的交给 NAS 自动完成。上一期聊的是飞牛 Docker 的基础玩法这一期直接进入实用组合拳重点解决“剧集更新没人提醒、下载完文件名乱、播放器海报墙空荡荡”这三个 NAS 影音玩家的高频痛点。整套方案的核心组件是 Sonarr剧集管理 Radarr电影管理 qBittorrent下载器 Jackett索引器 Jellyfin媒体服务器。它们各自是独立容器通过 Docker 网络互相通信最终在 Jellyfin 里形成自动更新的海报墙。这套组合在群晖、威联通、绿联、飞牛上都能跑本文以飞牛 fnOS 为例因为它的 Docker 管理器自带 Compose 支持部署最省事。先给结论这套方案对硬件要求不高x86 架构的 NAS 都能带得动。Jellyfin 转码建议 Intel 核显Quick Sync但如果你的播放设备支持直接解码纯下载和整理场景下 2 核 CPU 4G 内存就够用。部署完成后你只需要做两件事在 Sonarr/Radarr 里添加订阅然后打开 Jellyfin 看片。下面从架构设计开始逐步带你把这套系统搭起来。1. 核心能力速览先看这套方案整体能力方便你判断要不要继续往下读。能力项说明方案类型NAS 全自动追剧 媒体库管理 多端播放适用系统飞牛 fnOSDocker Compose群晖/威联通/绿联可平滑迁移核心组件Sonarr、Radarr、Jackett、qBittorrent、Jellyfin硬件要求x86 架构 NAS2 核 CPU 4G 内存起步Jellyfin 转码建议 Intel 核显磁盘要求建议至少 2T 空间下载盘和媒体库可分目录或分盘启动方式Docker Compose 一键创建全部容器接口能力Sonarr/Radarr 提供 REST API可对接第三方 App 或自动化脚本批量任务支持剧集/电影批量订阅下载完成后自动整理入库自动刮削Sonarr 自动重命名Jellyfin 自动抓取海报、简介、演员信息适合场景追美剧/日剧更新、电影收藏整理、家庭媒体库建设这套方案的核心逻辑是Jackett 负责对接各类资源索引站Sonarr/Radarr 根据订阅自动搜索并推送下载任务给 qBittorrent下载完成后 Sonarr/Radarr 自动整理文件并重命名最后 Jellyfin 扫描入库完成海报墙展示。2. 适用场景与使用边界这套方案最适合这几类用户追剧党美剧、日剧、韩剧按季订阅更新集数自动下载不用每天手动刷站点。电影收藏控想按 IMDB/TMDB 标准整理本地电影库自动抓取封面、简介、评分。家庭媒体库建设者希望全家人在电视、手机、平板上通过 Jellyfin 直接看 NAS 里的内容。NAS 折腾玩家已经装了飞牛 fnOS想试试 Docker 组合拳理解服务间通信和自动化流程。不适合的场景不看剧、不整理媒体文件只想要一个能播本地视频的工具那直接装飞牛自带影视即可。不懂 Docker 也不想维护想要“装完就不管”的体验这套方案需要偶尔处理索引失效、下载失败等运维问题。合规与版权边界这里必须明确提醒这套方案本身是媒体自动化管理工具链不包含任何盗版资源也不内置任何侵权内容。请确保你订阅和下载的内容拥有合法授权包括但不限于公开版权内容、已购买的数字内容备份、创作者授权分发的素材等。不要使用它批量抓取未授权内容也不要将刮削后的媒体库对外公开分享。家庭私有媒体库的使用边界是“自用”超出这个范围会有法律风险。涉及下载器的使用同样需要遵守当地法律法规和网络服务条款。本文出现的所有容器均为开源软件用途是搭建个人媒体管理流程请勿用于任何侵权场景。3. 环境准备与前置条件3.1 飞牛 fnOS 环境检查在你开始部署之前先确认 NAS 满足以下条件检查项要求说明系统版本飞牛 fnOS 0.8.x 或更新版本需要自带 Docker 管理器架构x86_64ARM 设备需单独确认镜像兼容性内存4G 起步8G 更稳5 个容器同时运行内存占用较高存储建议 SSD 做系统盘 机械盘做存储盘下载缓存建议放在机械盘网络能正常访问 Docker Hub拉取镜像需要网络通畅国内网络慢时可配置镜像加速端口7880/7881/7878/8989/8096 等端口空闲如果被占用Compose 里可自行调整3.2 目录规划这是整套方案里最重要的一步。目录规划不清晰后面文件整理就是一团乱麻。推荐按“下载暂存区”和“媒体库”分开的方式/vol1/1000/media/ ├── downloads/ │ ├── tv/ # 剧集下载暂存区 │ └── movies/ # 电影下载暂存区 ├── library/ │ ├── tv/ # 剧集最终入库目录 │ └── movies/ # 电影最终入库目录 └── docker/ ├── sonarr/ # Sonarr 配置目录 ├── radarr/ # Radarr 配置目录 ├── jackett/ # Jackett 配置目录 ├── qbittorrent/ # qBittorrent 配置目录 └── jellyfin/ # Jellyfin 配置目录飞牛 fnOS 的存储卷一般挂在/vol1/1000下具体路径以你在“文件管理”里看到的位置为准。先在文件管理里把上述目录建好建议使用英文路径避免中文路径在某些容器里出现编码问题。3.3 确认 Docker Compose 支持飞牛 fnOS 的 Docker 管理器已经内置了 Compose 功能。你在 Docker 应用里找到“项目”或“Compose”入口即可。如果找不到也可以通过 SSH 连接 NAS使用命令行直接执行docker compose up -d。下面会给出完整 Compose 文件两种方式都能用。4. 安装部署与启动方式4.1 编写 docker-compose.yml在/vol1/1000/media/docker/下创建docker-compose.yml文件内容如下。我加了详细注释便于你理解每个服务的用途和端口映射。version: 3.8 services: # ---- 索引器对接资源站点提供统一搜索 API ---- jackett: image: linuxserver/jackett:latest container_name: jackett environment: - PUID1000 # 飞牛 fnOS 默认用户 UID可用 id 命令查看 - PGID1000 - TZAsia/Shanghai volumes: - /vol1/1000/media/docker/jackett:/config - /vol1/1000/media/downloads:/downloads ports: - 9117:9117 # Jackett WebUI 端口 restart: unless-stopped # ---- 下载器负责实际下载任务 ---- qbittorrent: image: linuxserver/qbittorrent:latest container_name: qbittorrent environment: - PUID1000 - PGID1000 - TZAsia/Shanghai - WEBUI_PORT8081 volumes: - /vol1/1000/media/docker/qbittorrent:/config - /vol1/1000/media/downloads:/downloads ports: - 8081:8081 # qBittorrent WebUI - 6881:6881 # BT 下载端口 - 6881:6881/udp restart: unless-stopped # ---- 剧集自动订阅管理 ---- sonarr: image: linuxserver/sonarr:latest container_name: sonarr environment: - PUID1000 - PGID1000 - TZAsia/Shanghai volumes: - /vol1/1000/media/docker/sonarr:/config - /vol1/1000/media/downloads:/downloads - /vol1/1000/media/library/tv:/tv # 剧集媒体库 ports: - 8989:8989 # Sonarr WebUI restart: unless-stopped # ---- 电影自动订阅管理 ---- radarr: image: linuxserver/radarr:latest container_name: radarr environment: - PUID1000 - PGID1000 - TZAsia/Shanghai volumes: - /vol1/1000/media/docker/radarr:/config - /vol1/1000/media/downloads:/downloads - /vol1/1000/media/library/movies:/movies # 电影媒体库 ports: - 7878:7878 # Radarr WebUI restart: unless-stopped # ---- 媒体服务器刮削 海报墙 多端播放 ---- jellyfin: image: lscr.io/linuxserver/jellyfin:latest container_name: jellyfin environment: - PUID1000 - PGID1000 - TZAsia/Shanghai volumes: - /vol1/1000/media/docker/jellyfin:/config - /vol1/1000/media/library/tv:/data/tv - /vol1/1000/media/library/movies:/data/movies ports: - 8096:8096 # Jellyfin WebUI restart: unless-stopped将PUID和PGID换成你 NAS 实际用户的值在 SSH 执行id就能看到默认一般是 1000。如果飞牛 fnOS 的 WebUI 创建用户时有不同设定以实际为准。4.2 启动容器如果你在飞牛 WebUI 的 Docker 项目里操作选择“添加项目”把上面的 Compose 内容粘贴进去即可。如果使用命令行SSH 到 NAS 后在docker-compose.yml所在目录执行cd /vol1/1000/media/docker docker compose up -d第一次拉取 5 个镜像需要一点时间镜像大小加起来大约 2-3 GB。启动完成后执行docker ps看到 5 个容器状态都是Up部署就算成功了。4.3 访问各服务 WebUI服务地址默认端口Jacketthttp://NAS_IP:91179117qBittorrenthttp://NAS_IP:80818081Sonarrhttp://NAS_IP:89898989Radarrhttp://NAS_IP:78787878Jellyfinhttp://NAS_IP:80968096首次访问 qBittorrent 时默认用户名admin密码在容器日志里执行docker logs qbittorrent可以在日志末尾看到临时密码登录后记得修改。5. 功能配置与联动设置容器全部启动只是第一步真正让这套系统“全自动”运转需要完成服务间的配置联动。5.1 Jackett 配置索引器打开 Jackett WebUI点击 “Add Indexer” 添加你需要的资源索引站。这里需要注意索引站的可访问性会直接影响 Sonarr/Radarr 的搜索结果建议挑选你本地网络能正常访问的站点添加。配置完成后Jackett 会给每个索引器生成一个独立的 API Key 和 Torrent 搜索链接。在 Sonarr/Radarr 里添加索引器时会用到这个链接格式一般是http://NAS_IP:9117/api/v2.0/indexers/站点名/results/torznab/因为两个容器都映射到了宿主机网络Sonarr 里可以直接填http://192.168.1.100:9117这样的地址改成你实际的 NAS IP不需要填容器内部 IP。5.2 qBittorrent 配置下载路径打开 qBittorrent WebUI进入 “设置 - 下载”把“保存管理”中的默认保存路径设置为/downloads。实际下载的子目录由 Sonarr/Radarr 自动创建。建议做一个关键设置勾选“Torrent 完成时运行外部程序”并填入 Sonarr/Radarr 的 API 通知地址。不过更推荐直接用后面的连接配置方式Sonarr/Radarr 会主动轮询下载器状态。5.3 Sonarr 连接 qBittorrent打开 Sonarr WebUI进入 “设置 - 下载客户端”点击“添加”类型选qBittorrent填写字段值主机NAS_IP端口8081用户名admin密码你修改后的密码类别tv-sonarr点击“测试”显示连接成功即可。Radarr 的操作完全一致只是类别建议填movies-radarr。5.4 Sonarr 配置根目录和媒体库在 Sonarr 的 “设置 - 媒体管理” 中把根文件夹设为/tv重命名规则保持默认即可。Sonarr 会自动把剧集整理成以下格式/电视剧名/季数/电视剧名 - S01E01 - 集标题.mkvRadarr 同样把根文件夹设为/movies电影命名格式为/电影名 (年份)/电影名 (年份) - 质量来源.mkv注意Sonarr 和 Radarr 的根目录必须是容器内路径不是 NAS 的物理路径。6. 功能测试与效果验证配置完成进入功能测试阶段。建议按下面的顺序逐项验证。6.1 测试 Jackett 搜索在 Jackett WebUI 的搜索框输入你要找的资源名比如blade runner 2049能返回搜索结果说明索引器配置正常。这一步是承上启下的关键Jackett 如果搜不到结果Sonarr/Radarr 肯定也搜不到。6.2 测试 Sonarr 自动订阅在 Sonarr 界面点击 “添加剧集”输入剧名选择正确的剧集条目后点确定。预期结果Sonarr 会自动搜索该剧的种子资源推送下载任务到 qBittorrentqBittorrent 开始下载。判断成功的标准Sonarr 的 “活动” 页面能看到当前下载队列。qBittorrent 的 “种子” 列表里出现了对应任务。界面右上角没有红色警报。如果搜不到资源优先检查 Jackett 是否配置了可用索引器以及索引器返回结果是否需要特殊参数例如部分站点需要自定义 FlareSolverr 处理。6.3 测试 qBittorrent 下载完成后的自动整理等待一个测试下载任务完成后观察 Sonarr 的“活动 - 历史记录”。如果显示Grabbed、Downloaded、Imported三个状态流转说明整套自动化链路已经跑通。此时去 NAS 的媒体库目录library/tv下查看文件应该已经按标准格式重命名并归入对应季目录。6.4 测试 Jellyfin 媒体库刮削打开 Jellyfin WebUI首次使用需要创建管理员账号。创建完成后进入“仪表盘 - 媒体库”添加媒体库内容类型选“电视节目”文件夹路径填/data/tv。电影媒体库同理路径填/data/movies。添加完成后 Jellyfin 会自动扫描并匹配 TMDB 元数据。打开首页能看到海报墙、剧集简介、演员列表说明刮削成功。如果刮削匹配不到常见原因是文件名信息不完整。确认 Sonarr 的重命名规则里包含剧集名和集号不要用纯数字文件名。6.5 端到端回归测试完整的回归测试流程如下在 Sonarr 添加一部美剧订阅。等待 Jackett 自动搜索 - Sonarr 推送任务 - qBittorrent 开始下载。下载完成后 Sonarr 自动重命名并移动文件。Jellyfin 检测到新文件自动扫描入库。打开 Jellyfin 首页海报墙出现新剧点进去可以正常播放。这一整套流程全部自动完成、无需人工干预就算验收通过。7. 接口 API 与批量任务扩展这套方案里的 Sonarr 和 Radarr 都提供完整 REST API配合批量任务可以在追剧场景之外做更多自动化。7.1 用 API 批量添加剧集如果你搬家式的从旧媒体库迁移一批剧集不想在 WebUI 里一个个添加可以通过 API 批量导入。先到 Sonarr 的“设置 - 常规”页面复制 API Key然后使用下面的 Python 示例import requests import json # 配置区 SONARR_URL http://NAS_IP:8989 API_KEY 你的API_Key TVDB_ID 121361 # 剧集的 TVDB ID可在 Sonarr 搜索页面获取 url f{SONARR_URL}/api/v3/series headers {X-Api-Key: API_KEY} payload { tvdbId: TVDB_ID, title: 测试剧集, qualityProfileId: 1, # 质量配置 ID可按需调整 languageProfileId: 1, seasonFolder: True, monitored: True, rootFolderPath: /tv, addOptions: {searchForMissingEpisodes: True} } response requests.post(url, headersheaders, jsonpayload, timeout30) print(response.status_code) print(response.json())searchForMissingEpisodes设为true添加成功后 Sonarr 会立即开始搜索缺失剧集自动生成下载任务。7.2 用 API 批量整理已下载资源如果你之前已经有一批手动下载的文件不想重新下载可以使用 Sonarr 的“导入”功能。通过 API 返回的候选文件列表可以写脚本自动做批量导入import requests SONARR_URL http://NAS_IP:8989 API_KEY 你的API_Key url f{SONARR_URL}/api/v3/importlist headers {X-Api-Key: API_KEY} response requests.get(url, headersheaders, timeout30) print(response.json())建议第一次跑通全链路后再做这些高级扩展先把核心订阅流程搞清楚比单纯追求 API 数量更有价值。7.3 下载器批量限速与队列管理qBittorrent 本身提供 Web API可以用来批量管理下载任务。例如批量给所有 5 个以上的种子限速到 5MB/simport requests QB_URL http://NAS_IP:8081 QB_USER admin QB_PASS 你的密码 # 登录获取 cookie session requests.Session() session.post(f{QB_URL}/api/v2/auth/login, data{username: QB_USER, password: QB_PASS}) # 获取所有种子 torrents session.get(f{QB_URL}/api/v2/torrents/info).json() # 批量限速 for torrent in torrents: if torrent[hash]: session.post(f{QB_URL}/api/v2/torrents/setLimit, data{ hash: torrent[hash], limit: 5120 # 单位 KB/s }) print(f已对 {len(torrents)} 个种子设置限速)8. 资源占用与性能观察这套系统属于“常驻后台”型服务了解资源占用情况有助于评估是否需要扩大内存或者哪些容器吃资源最严重。8.1 如何观察资源占用在飞牛 fnOS 的 WebUI 里直接看“资源监控”即可能看到每个容器的 CPU 和内存实时曲线。更精确的观察可以通过 SSH 执行docker stats --format table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}运行docker stats能看到类似下面的输出NAME CPU % MEM USAGE / LIMIT sonarr 0.35% 480MiB / 7.6GiB radarr 0.20% 350MiB / 7.6GiB jackett 0.10% 250MiB / 7.6GiB qbittorrent 2.50% 620MiB / 7.6GiB jellyfin 3.20% 720MiB / 7.6GiB以上只是示意数据实际以你 NAS 的真实输出为准。总体规律是空闲时这套系统内存占用大概在 2-3 GB 之间下载和转码时 CPU 会明显上升。8.2 性能影响分析Jellyfin 转码是资源消耗大户。如果你用手机流量播放 NAS 里的 4K 原盘Jellyfin 会触发转码CPU 占用可能直接拉满。解决方式是在客户端开启“直接播放”或者给 Jellyfin 挂载 Intel 核显做硬件转码。qBittorrent 大量并发任务会占用较多内存。如果你同时跑几百个种子内存占用会显著上升建议下载完成后自动做种上限设置不要无限做种。Jackett 和 Sonarr/Radarr 的搜索过程是短暂的 CPU 波动因为需要同时发起很多索引请求峰值 CPU 会短暂升高属于正常现象。8.3 如何降低资源占用如果 NAS 配置较低比如只有 4G 内存可以做一些取舍不需要追剧的话可以不部署 Radarr少一个常驻容器。qBittorrent 设置“全局最大连接数”为 300降低网络和内存开销。Jellyfin 关闭不必要的转码格式支持尽量在播放端解码。Jackett 只保留必要的索引器索引器越多搜索时 CPU 和网络开销越大。9. 常见问题与排查方法基于实际部署中最常踩的坑整理出下面的排查表。问题现象可能原因排查方式解决方案容器启动后马上退出目录映射不存在或权限不足查看docker logs 容器名确认主机目录已创建PUID/PGID 设置正确Sonarr/Radarr 提示下载客户端连接失败qBittorrent 密码被修改过在 Sonarr 里重新测试连接更新 qBittorrent 密码Sonarr 搜索不到任何资源Jackett 索引器配置失效在 Jackett WebUI 里手动搜索测试更新索引器 Cookie/API Key或添加新的索引器下载完成但 Sonarr 不导入下载目录和媒体库目录映射不一致检查 Sonarr 的路径映射设置确保容器内/downloads与/tv路径映射正确Jellyfin 刮削不到海报文件名不规范或网络无法访问 TMDB在 Jellyfin 日志里查看元数据抓取报错规范命名或检查 NAS 网络解析是否正常Docker Hub 拉取镜像超时网络问题尝试重新拉取配置国内镜像加速源qBittorrent 无法下载显示 tracker 未连接网络或 tracker 问题查看 qBittorrent 的 Tracker 状态添加备用 tracker或检查网络连通性重启 NAS 后容器未自动启动restart 策略没设置查看容器运行状态在 Compose 里确保restart: unless-stopped9.1 端口冲突排查如果你发现某个端口被占用导致容器无法启动可以用下面的命令查看端口占用情况netstat -tlnp | grep 8989找到占用进程后换一个宿主机端口映射即可。例如 Sonarr 的端口映射改成8989:8989为18989:8989访问地址相应变成http://NAS_IP:18989。注意只有冒号左侧可以改右侧是容器内部端口不要动。9.2 路径映射排查这是整个方案里最容易出问题的地方。出现“找不到文件”类错误时进入容器内部确认路径是否能访问到数据docker exec -it sonarr bash ls /downloads ls /tv如果ls /downloads能看到文件说明下载器和 Sonarr 的路径映射是一致的。看不到文件说明 Compose 里的 volumes 映射有问题需要回到宿主机路径和容器路径一一核对。9.3 Jellyfin 硬解配置排查如果 Jellyfin 转码特别卡可能是没有开启硬件加速。在 Jellyfin 的“仪表盘 - 播放”里勾选 Intel Quick Sync然后重启 Jellyfin 容器。确认你的 NAS CPU 是否支持 Quick Sync飞牛 fnOS 内核只要包含 i915 驱动一般都能识别到/dev/dri设备。10. 最佳实践与使用建议10.1 目录规划要一次到位不要下载完再移动文件。下载暂存区和媒体库从一开始就分开能避免 Sonarr/Radarr 在硬链接和文件移动时出现跨文件系统问题。如果下载盘和媒体库是同一块物理盘Sonarr 默认会优先使用硬链接实现“秒入库”且不占用额外空间。如果分属不同磁盘硬链接不生效会执行真实的文件复制耗时更长。验证硬链接是否生效可以执行stat /downlo ads/xxx.mkv /tv/xxx.mkv两个文件如果 Inode 相同说明是硬链接不同则是复制。10.2 索引器要克制Jackett 每添加一个索引器Sonarr 搜索时就会多一个查询目标。索引器太多会导致搜索速度变慢且某些不稳定的索引器会让搜索超时。建议保留 3-5 个稳定的索引器即可质量优先而不是数量优先。10.3 留好配置备份容器配置目录都在/vol1/1000/media/docker/下面定期把这个目录整体备份到另一块硬盘或者用飞牛的自带备份功能同步到网盘。更换 NAS 或者系统重装时只要恢复这些目录重新docker compose up -d整套系统就能恢复原样。10.4 下载完成留种策略qBittorrent 默认会一直做种长期挂机既不节能也会占用网络上行。在 qBittorrent 设置里把做种限制改成“分享率达成 1.0 或做种时间满 72 小时自动停止”既能保证基本的分享义务又不会拖垮 NAS 网络。10.5 合规与授权提醒重要的事情说三遍确保下载内容有合法授权。这套自动下载工具链不内置任何内容源也不帮你找盗版资源。索引器列表里的站点如果是公开的也意味着它的可用性随时可能变化不要在生产环境过度依赖某一个索引器。直接对外发布 Jellyfin 媒体库链接、分享账号给非家庭成员都存在版权风险和安全风险请务必慎重。11. 总结与下一步这套方案最值得尝试的点是一次配置长期自动。只要 Jackett 索引器稳定Sonarr/Radarr 的订阅列表就是你的“追剧清单”下载、整理、入库、刮削全部自动完成Jellyfin 打开就是干净的海报墙。最先应该验证的功能是 Jackett 手动搜索 Sonarr 添加剧集测试。这两步跑通说明索引、下载、管理链路是通的后面 Jellyfin 入库只是时间问题。最容易踩的坑是路径映射不一致其次是 qBittorrent 默认密码找不到。前者的解决方式是每次改 Compose 都确认宿主机路径和容器路径一一对应后者则是在首次启动后第一时间看容器日志拿临时密码并完成修改。后续可以继续扩展的方向包括给 Sonarr/Radarr 接入 Telegram/微信通知机器人剧集下载完成自动推送到手机给 Jellyfin 配置 SSL 证书后在外网安全访问或者引入硬链接批量整理脚本把已有的散乱资源库快速整理成标准格式。每一块都可以单独写一篇先把手头的自动追剧链路跑稳再逐步加功能。建议收藏备用。如果你已经有一台飞牛 NAS现在就可以打开 Docker 项目模块把上面的 Compose 文件粘贴进去体验一下全自动追剧的快乐。
返回列表