从今天起自动观影追番(一篇搞定)

简单介绍

展开

整体方案

展开

方案基于互联网上已有教程，采用虚拟化方式构建自有流媒体进行实践，旨在实现自动化追番观影的同时能学到一些虚拟化、服务器相关的知识。
流媒体服务的整体框架如下：

proxmox支撑虚拟化运行

docker或者k8s作为服务运行的基础平台

qbittorrent作为下载器

jackett承担订阅索引器

radarr和sonarr扮演电影、剧集搜刮器

overseerr提供搜刮整合服务

plex和emby负责媒体中心服务

bazarr匹配字幕信息

以上基于 X99 平台的 2U 服务器，当然不一定非要机架式的服务器，其他自行 DIY 的设备都可以实现这一套方案，只要核心数量够多，内存够大，玩得动虚拟化即可。
采用的项目均在全球最大的开源社区可以找到

流程图

Q&A：

展开

Q: 为什么不用 unraid、黑群、openmediavault、turnas 等一众 NAS 类产品？
A: 不得不承认 NAS 类产品有着更好的生态支持，完善的操作体验，相对较低的学习成本，尤其是黑群 unraid。但如果采用 nas 类产品就少了一部分可玩性😑，选择虚拟化的方式虽然更加繁琐，但这过程种遇到的种种问题以及解决问题的过程我觉得是折腾最大的乐趣所在，这也能够收获很多服务器运维方面的知识🤩。

Q: 这套方案在观影体验有什么优缺点？
A: 优点是配置起来比较简单，并且页面美观、操作简单，完善后只需要在 overseerr 上对想看的节目点击请求即可推送到 qb 进行下载。全程不需要其他操作，但缺点也明显，sonnarr 不受中文支持导致动漫、国产及日韩剧重命名方式均为英文，过长的文件名在 emby 上显示文件名的时候不是很美观。较新资源能得到有效支持，但如果没有 PT 站资源则很难找到比较早的影视资源。（不论哪种方案都有这个问题呢😟）

Q: 关于其他扩展？
A: 比如下载器有 utorrent、等可以进行扩展，媒体中心可以增加 kodi、jillyfin 等，还可以通过 webhook 消息推送实现移动端订阅视频。动漫番剧方面通过 AutoBangumi 扩展订阅方式等等，总之还有很多可玩空间，本方案仅仅是一个基础或者是说是一个开始，后面还有很多探索空间😉。

Q: 其他的自动化方案？
A: 自动化观影的核心体验在于对视频的刮削，让媒体中心能够识别影片信息。而刮削的重点在于对视频文件或者其母目录的重命名，从这几个角度看还有 nastools、tMM 等工具可以作为替代。字幕方面还有 ChineseSubFinder 可以作为代替。虚拟化方面，proxmox 也可以用 exsi 作为替代

虚拟化底层系统篇

关于 proxmox 的一些注意点

展开

镜像文件下载地址：proxmox VE

制作 U 盘启动工具：Rufus 或者 Ventoy 更推荐后者

proxmox 默认没有操作页面，可以通过系统安装后给定的连接进行 web 端的控制，默认为 https://ip:8006/

换源

企业源

Copy
## 删除自带的源
rm /etc/apt/sources.list.d/pve-enterprise.list

## 添加官方，非订阅源（和下面国内非订阅源，二选一）
echo 'deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription' >> /etc/apt/sources.list.d/pve-no->subscription.list

## 这个是国内，非订阅源
echo 'deb http://mirrors.ustc.edu.cn/proxmox/debian/pve bullseye pve-no-subscription' >> /etc/apt/sources.list.d/pve->no-subscription.list

软件源

Copy
## 编辑源文件：/etc/apt/sources.list
cp /etc/apt/sources.list /etc/apt/sources.list.bak && vim /etc/apt/sources.list

## 将文件中的所有内容删除或者用#注释掉，添加以下内容
deb https://mirrors.aliyun.com/debian bullseye main contrib
deb https://mirrors.aliyun.com/debian bullseye-updates main contrib
deb https://mirrors.aliyun.com/debian-security bullseye-security main contrib

多磁盘可以组 raid5 用于为虚拟机提供足够的存储空间的同时保证数据存储相对可靠

虚拟机篇

关于管理 linux 以及方案中必要的一点配置

展开

虚拟机至少需要创建 3 台
157.20.20.1 --> jumpserver --> 远程运维用的堡垒机
157.20.20.2 --> nfs --> nfs 文件共享系统
157.20.20.3 --> docker --> 专门部署流媒体需要的容器
如果选择 k8s 的方式，需要再虚拟化至少 2 台虚拟机
157.20.20.3 --> k8s-master --> k8s 的主节点
157.20.20.4 --> k8s-node01 --> k8s 的工作节点
157.20.20.4 --> k8s-node02 --> k8s 的工作节点

其中，jumpserver 至少需要 4C8G 的资源，其他虚拟机至少分配 2 个核心，内存按照需求分配，没有特殊要求。如果是 k8s 环境，master 节点至少 2C6G，node 节点至少 2C4G。

创建多台虚拟机的理由：按照功能划分空间，避免因操作不当导致服务器文件损坏引起的所有组件不可用，一旦出现这种情况，修复和维护将会变得异常麻烦。

创建虚拟机

pve 的 local 中需要先上传 ISO 镜像，用于安装基础的操作系统

各类基础镜像的下载地址：CentOS7、Rocky Linux 、Debian
右上角点击创建虚拟机，选择合适的镜像进行安装即可

为虚拟机安装 jumpserver

简单介绍
飞致云旗下的开源堡垒机产品，比起各类 ssh、scp 工具要方便不少，官网

部署

Copy
curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/download/quick_start.sh | bash

████████████████████████████████████████ 100%
[Success]: download install script to /opt/jumpserver-installer-v3.2.0
[Info]: Start executing the installation script.
[Info]: In an automated script deployment, note the message prompts on the screen.
████████████████████████████████████████ 100%
[Success]: The Installation is Complete.

For more commands, you can enter jmsctl --help to view help information.

安装完成后在浏览器访问http://157.20.20.1 即可通过默认账户 admin/admin 进行登录

创建使用第一个资产
在 资产管理 --> 资产列表 中进行进行添加添加资产

在 权限管理 --> 资产授权 中创建授权规则对用户进行资产授权

授权完成右上角可以进入控制台，进行登录虚拟机等操作，灵活性、便利性均比 ssh 工具高。到此 jumpserver 部署完成

创建 nfs 共享文件服务器

创建第二台 linux 虚拟机，分配足够的磁盘空间。提前规划数据空间和媒体空间，方便管理避免混淆

在系统中创建 media 文件夹和 storage 文件夹，分别作为存储空间和媒体空间，挂载好磁盘

Copy
## 确认要挂载的空间
$ lsblk
## 创建媒体文件夹和存储文件夹
$ cd /mnt && mkdir media && mkdir storage
## 格式化并挂载磁盘到文件夹供操作系统访问
## 文件系统格式可选xfs或者ext4等
$ mkfs.xfs /dev/sdb
$ mkfs.xfs /dev/sdc
$ mount /dev/sdb /mnt/storage && mount /dev/sdc /mnt/storage
## 修改/etc/fstab保证开机自动挂载
$ vim /etc/fstab
/dev/sdb /mnt/storage xfs defaults 0 2
/dev/sdc /mnt/media xfs defaults 0 2

部署 nfs 服务器，以 rocky linux 为例

安装 NFS 服务器组件:

Copy
$ yum install nfs-utils

创设置要共享的目录权限:

Copy
$ chmod 777 /mnt/storage
$ chmod 777 /mnt/media

配置 NFS 访问权限文件 /etc/exports。例如:

Copy
$ vim /etc/exports
/mnt/storage 157.20.20.0/24(rw,sync,no_subtree_check)
/mnt/media 157.20.20.0/24(rw,sync,no_subtree_check)
## 这会向 157.20.20.0/24 子网的客户端提供读写访问

启动 NFS 服务:

Copy
$ systemctl start nfs-server
$ systemctl enable nfs-server # 设置开机自启动

在防火墙中开启 NFS 连接的端口:

Copy
$ firewall-cmd --permanent --add-service=nfs
$ firewall-cmd --permanent --add-port=2049/tcp
$ firewall-cmd --reload

测试 NFS 配置:

Copy
$ showmount -e localhost
/mnt/storage 157.20.20.0/24
/mnt/media 157.20.20.0/24

Tip
如果修改了 exports 中的内容需要重新暴露 exports 具体如下：

Copy
$ exportfs -r
$ systemctl restart nfs-server

docker 服务器

创建第三台 linux 虚拟机，部署 nfs 服务器，以 rocky linux 为例

Copy
$ yum install -y yum-utils device-mapper-persistent-data lvm2
$ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ yum makecache fast && yum -y install docker-ce
$ systemctl start docker && systemctl enable docker

通过堡垒机的文件管理上传从 github 上下载的 docker-compose 文件，下载链接
上传的文件默认位于/tmp下

Copy
$ cp /tmp/docker-compose-linux-x86_64 /usr/local/sbin/docker-compose
$ chmod +x /usr/local/sbin/docker-compose

完成后可以检验 docker 及 docker-compose 的版本

Copy
$ docker version
$ docker-compose version

k8s 环境快速部署

开源项目：KuboardSpray-github
这个项目可以直接部署到 jumpserver 的虚拟机上，需要注意的是 80 端口已经被占用，所以在映射端口的时候需要更换端口

Copy
docker run -d \
--restart=unless-stopped \
--name=kuboard-spray \
-p 8081:80/tcp \
-e TZ=Asia/Shanghai \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/kuboard-spray-data:/data \
eipwork/kuboard-spray:latest-amd64
# 如果抓不到这个镜像，可以尝试一下这个备用地址：
# swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-spray:latest-amd64

通过访问http://157.20.20.1:8081 进行访问，默认账户 admin/Kuboard123
利用 kuboard-spray 可以对 157.20.20.3-157.20.20.6（具体看需要将哪些虚拟机作为 k8s 环境的节点）
值得注意的是，单服务器只能模拟实现 k8s 集群，用作测试学习用途，真正的 k8s 集群应当是多个 master 节点并且 work 节点分布在不同的物理服务器上，从而保证单机宕机也不影响集群运行。

详细安装部署参考
kuboard-spray 官方文档
优化参考：
待更新

下载器篇

关于 qbittorrent 通过 docker 或者 k8s 的方式进行部署并使用

展开

部署

docker 方式

挂载共享文件夹到本地

Copy
## 确认是否可以挂载
$ showmount -e 157.20.20.2
## 挂载
$ cd /mnt && mkdir media && mount -t nfs 157.20.20.2:/mnt/media /mnt/media
$ mkdir storage && mount -t nfs 157.20.20.2:/mnt/storage /mnt/storage
## 设置fstab开机挂载请参照前文

docker 部署 qbittorrent

Copy
docker run -d \
--name=qbittorrent \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Shanghai \
-e WEBUI_PORT=8080 \
-p 8080:8080 \
-p 49152:49152 \
-p 49152:49152/udp \
-v /mnt/storage/qb-config:/config \
-v /mnt/media/qb-downloads:/downloads \
--restart unless-stopped \
lscr.io/linuxserver/qbittorrent:latest

上述代码中需要注意的内容有以下几点:

默认为 6881 端口， 一般情况下不用改，大部分 PT 站的 6881 端口是被 ban 的，所以可以修改为 49152 或其他

-v 设置的路径一定要创建好对应文件夹再使用命令部署

将 -v /mnt/storage/qb-config:/config 中的路径 /mnt/storage/qb-config替换为你想存储的 qbittorrent 的配置路径，所有修改都会保存，如果容器挂掉，只要配置不丢失重新启动容器即可。

-v /mnt/media/qb-downloads:/downloads 部分同样需要修改 /mnt/media/qb-downloads 部分

Tip
docker 部署过程中值得主机的点在于端口和挂载路径，只要再docker hub上找到镜像后修改即可
后文不再详细赘述 docker 部署过程中的修改方式，基本注意点与本节相同

k8s 部署 qbittorrent

通过 kuboard 面板进行部署 qbittorrent
找一个合适的命名空间（可以手动创建一个）进行创建工作负载

配置容器信息

挂载存储

发布应用

保存后等容器日志提示 successfuly 即可通过定义好的发布端口进行访问例如上图中设置 30001 映射容器的 8080 端口，因此可以通过http://157.20.20.3:30001 进行访问，qb 的默认账号 admin/adminadmin

qb 的基本设置

在 qb 页面的上方导航栏，有个小齿轮的图标，是 qb 设置的入口

关于下载选项，在保存管理中，需要设置下图中红框部分，第一处设置与 sonarr 和 randarr 相关，通过 sonarr 和 randarr 进行硬链接时会修改文件夹，设置成手动可以接管下载的文件夹设置。第二处作用是提取下载文件的种子并备份，通常情况下，下载的媒体文件不带有种子文件，此设置可以备份种子到一个指定文件夹。

在BitTorrent选项卡下，如果采用 BT 方案在 EZTV、RARGB、ACG.RIP 等站点搜索资源的话，勾选” 启用 DHT (去中心化网络) 以找到更多用户 “会有更好的效果，如果玩 PT 站则可以取消勾选。

tracker 服务器的作用是帮助用户提高下载速度，搜索更多用户节点，tracker 服务器可以在 trackerslist.com 这个网站中复制粘贴。

在高级选项卡下，勾选两个 tracker 相关选项有助于连接更多 track 服务器从而提升速度。

刮削篇

关于刮削方式，本方案采用 sonarr 和 radarr 对下载来的资源文件做硬链接的方式
原理在于通过重命名的方式让 emby、plex 等媒体服务器可以连接 tmdb、imdb 等互联网电影资料库搜索对应信息从而实现在媒体库中展现影视剧的海报墙、简介、演员信息等
其中，sonarr 对应 TV 剧集的刮削，randarr 对应电影的刮削，而 sonarr 和 radarr 可以通过 jackett 对公开的 bt 站点进行索引，以达到本地搜索互联网剧集实现 qb 自动下载并刮削的目的

展开

部署

本节仅介绍 docker 的部署方式，jackett、sonarr 和 radarr 部署方式、注意点均与前文 qb 部署方式相同，k8s 部署方式参考 qb 的部署方式

Tip
注意创建对应文件夹

jackett

Copy
docker run -d \
--name=jackett \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Shanghai \
-e AUTO_UPDATE=true \
-e RUN_OPTS= \
-p 9117:9117 \
-v /mnt/storage/jackett-congfig:/config \
-v /mnt/media:/downloads \
--restart unless-stopped \
lscr.io/linuxserver/jackett:latest

sonarr

Copy
docker run -d \
--name=sonarr \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Shanghai \
-p 8989:8989 \
-v /mnt/storage/sonarr-config:/config \
-v /mnt/media/tv:/tv \
-v /mnt/media/anime:/anime \
-v /mnt/media/qb-downloads:/downloads \
--restart unless-stopped \
lscr.io/linuxserver/sonarr:latest

radarr

Copy
docker run -d \
--name=radarr \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Shanghai \
-p 7878:7878 \
-v //mnt/media/radarr-config:/config \
-v /mnt/media/movies:/movies \
-v /mnt/media/qb-downloads:/downloads \
--restart unless-stopped \
lscr.io/linuxserver/radarr:latest

overseerr

Copy
docker run -d \
--name=overseerr \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Shanghai \
-p 5055:5055 \
-v /mnt/storage/overseerr-config:/config \
--restart unless-stopped \
lscr.io/linuxserver/overseerr:latest

设置

jackett

通过 http://ip:9117 进行访问 jackett，点击Add indexer即可添加

sonarr

通过 http://ip:8989 进行访问 sonarr，

在 settings-->mediamanagement 中设置媒体文件夹监控，sonarr 会自动从下载好的剧集文件夹中将媒体文件硬链接到此处

在 settings-->profiles 中设置好默认语言

在 index 中设置默认索引器，其中需要用到 jackett 中的 API key，添加的订阅索引格式为 Torznab

在 settings-->connect 中设置媒体中心，设置中需要获取 emby 的 API key，这部分可以等到 emby 部署完成后进行

在 settings-->downloadclients 中设置 qb 下载器的连接，并创建对应监控目录

在 settings-->metadata 中设置检索的元数据信息

以上设置完成后即可在 Series 中设置中对剧集进行搜索和监控，也会添加监控就会通知 qb 进行下载，完成下载后自动硬链接到目标文件夹实现刮削

radarr

radarr 基本设置通 sonarr，单 radarr 可以设置中文

通过http://ip:7878 进行登录，在 settings--> UI 中可以设置页面为中文

在媒体管理中添加 "" 可以设置重命名为中文目录

Overseerr

overseerr 是美观且强大的媒体管理工具，可以堪称是 radarr 和 sonarr 的集合，通过 API key 的方式对 sonarr 和 radarr 进行管理。部署完成后会进入引导设置页面，其中设置用到的 api-key 均在 sonarr 和 radarr 的 settings-->general (通用) 中可以找到。

值得注意的地方：

该软件依赖 plex 服务器，因此请在部署好 plex 服务器后进行

一般设置中选择显示语言为中文，地区为所有

服务器中 TV 和动漫可以分开添加

媒体刮削严重依赖 TMDB 访问，请注意设置全局代理，例如通过软路由进行代理访问，如果代理设置在 overseerr 所在的虚拟机内，请在部署 docker 过程中添加 -e https_proxy=http://172.17.0.1:7890 ，否则 overseerr 将无法设置代理

媒体库篇（emby 及 plex）

展开

在DockerHub上搜索 emby 及 plex 的部署方式进行参考部署，以下是示例：

emby

Copy
docker run -d \
--name=emby \
-e UID=1000 \
-e GID=1000 \
-e TZ=Asia/Shanghai \
-p 8096:8096 \
-p 8920:8920 \
-v /mnt/storage/emby-config:/config \
-v /mnt/storage/emby-lib:/lib \
-v /mnt/media:/media \
--restart unless-stopped \
lscr.io/linuxserver/emby:latest

plex

Copy
docker run -d \
--name plex \
--network=host \
--restart=always \
-p 32400:32400/tcp \
-p 8324:8324/tcp \
-p 32469:32469/tcp \
-p 1900:1900/udp \
-p 32410:32410/udp \
-p 32412:32412/udp \
-p 32413:32413/udp \
-p 32414:32414/udp \
-e TZ="Asia/Shanghai" \
-e PLEX_CLAIM="plex_clam_code" \
-e ADVERTISE_IP="http://ip:32400/" \
-e PUID=1000 \
-e PGID=1000 \
-v /mnt/storatge/plex/database:/config \
-v /mnt/storatge/plex/transcode:/transcode \
-v /mnt/media:/data \
plexinc/pms-docker

plex_clam 的获取页面：https://www.plex.tv/zh/claim/

Tip
plex 并不是开源的媒体库软件，其账户管理方式需要在官网注册账号，plex_clam_code 通过账号获取

字幕篇

下载资源过程中可能存在部分影片没有内嵌字幕，如果是外语，理解起来难以。配置字幕服务器可以解决这个问题

展开

部署

Copy
docker run -d \
--name=bazarr \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Shanghai \
-p 6767:6767 \
-v /mnt/storage/bazarr-config:/config \
-v /mnt/media/movies:/movies \
-v /mnt/media/tv:/tv \
-v /mnt/media/anime:/anime \
--restart unless-stopped \
lscr.io/linuxserver/bazarr:latest

设置

bazarr 中的大体设置基本与 radarr 及 sonarr 一致

不同的地方在于有三处需要设置 api-key 其中 sonarr 和 radarr 的 apikey 均可以从页面中获取，而字幕下载的 api-key 需要从对应的字幕网站上注册账号获取，我这里用的是射手网 (伪)的，对应注册连接在文内

参考资料

Rocky linux 8 docker 安装及基本使用【精华极简】

kuboard-spray 文档

Kuboard 文档

高阶教程 - 追剧全流程自动化