方案基于互联网上已有教程,采用虚拟化方式构建自有流媒体进行实践,旨在实现自动化追番观影的同时能学到一些虚拟化、服务器相关的知识。
流媒体服务的整体框架如下:
以上基于X99平台的2U服务器,当然不一定非要机架式的服务器,其他自行DIY的设备都可以实现这一套方案,只要核心数量够多,内存够大,玩得动虚拟化即可。
采用的项目均在全球最大的开源社区可以找到
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的一些注意点
企业源
## 删除自带的源 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
软件源
## 编辑源文件:/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
关于管理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
右上角点击创建虚拟机,选择合适的镜像进行安装即可
简单介绍
飞致云旗下的开源堡垒机产品,比起各类ssh、scp工具要方便不少,官网
部署
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部署完成
创建第二台linux虚拟机,分配足够的磁盘空间。提前规划数据空间和媒体空间,方便管理避免混淆
在系统中创建media文件夹和storage文件夹,分别作为存储空间和媒体空间,挂载好磁盘
## 确认要挂载的空间
$ 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为例
$ yum install nfs-utils
$ chmod 777 /mnt/storage
$ chmod 777 /mnt/media
$ 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 子网的客户端提供读写访问
$ systemctl start nfs-server
$ systemctl enable nfs-server # 设置开机自启动
$ firewall-cmd --permanent --add-service=nfs
$ firewall-cmd --permanent --add-port=2049/tcp
$ firewall-cmd --reload
$ showmount -e localhost
/mnt/storage 157.20.20.0/24
/mnt/media 157.20.20.0/24
Tip
如果修改了exports中的内容需要重新暴露exports 具体如下:$ exportfs -r $ systemctl restart nfs-server
创建第三台linux虚拟机,部署nfs服务器,以rocky linux为例
$ 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
下
$ cp /tmp/docker-compose-linux-x86_64 /usr/local/sbin/docker-compose
$ chmod +x /usr/local/sbin/docker-compose
完成后可以检验docker及docker-compose的版本
$ docker version
$ docker-compose version
开源项目:KuboardSpray-github
这个项目可以直接部署到jumpserver的虚拟机上,需要注意的是80端口已经被占用,所以在映射端口的时候需要更换端口
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的方式进行部署并使用
挂载共享文件夹到本地
## 确认是否可以挂载
$ 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
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
上述代码中需要注意的内容有以下几点:
-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部署过程中的修改方式,基本注意点与本节相同
通过kuboard面板进行部署qbittorrent
找一个合适的命名空间(可以手动创建一个)进行创建工作负载
配置容器信息
挂载存储
发布应用
保存后等容器日志提示successfuly即可通过定义好的发布端口进行访问例如上图中设置30001映射容器的8080端口,因此可以通过http://157.20.20.3:30001进行访问,qb的默认账号admin/adminadmin
在qb页面的上方导航栏,有个小齿轮的图标,是qb设置的入口
tracker服务器的作用是帮助用户提高下载速度,搜索更多用户节点,tracker服务器可以在 trackerslist.com 这个网站中复制粘贴。
关于刮削方式,本方案采用sonarr和radarr对下载来的资源文件做硬链接的方式
原理在于通过重命名的方式让emby、plex等媒体服务器可以连接tmdb、imdb等互联网电影资料库搜索对应信息从而实现在媒体库中展现影视剧的海报墙、简介、演员信息等
其中,sonarr对应TV剧集的刮削,randarr对应电影的刮削,而sonarr和radarr可以通过jackett对公开的bt站点进行索引,以达到本地搜索互联网剧集实现qb自动下载并刮削的目的
本节仅介绍docker的部署方式,jackett、sonarr和radarr部署方式、注意点均与前文qb部署方式相同,k8s部署方式参考qb的部署方式
Tip
注意创建对应文件夹
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
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
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
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
通过 http://ip:9117 进行访问jackett,点击Add indexer即可添加
通过 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基本设置通sonarr,单radarr可以设置中文
通过http://ip:7878 进行登录,在settings--> UI 中可以设置页面为中文
在媒体管理中添加":ZH"可以设置重命名为中文目录
overseerr是美观且强大的媒体管理工具,可以堪称是radarr和sonarr的集合,通过API key的方式对sonarr和radarr进行管理。部署完成后会进入引导设置页面,其中设置用到的api-key均在sonarr和radarr的settings-->general(通用)中可以找到。
值得注意的地方:
-e https_proxy=http://172.17.0.1:7890
,否则overseerr将无法设置代理在DockerHub上搜索emby及plex的部署方式进行参考部署,以下是示例:
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
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通过账号获取
下载资源过程中可能存在部分影片没有内嵌字幕,如果是外语,理解起来难以。配置字幕服务器可以解决这个问题
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需要从对应的字幕网站上注册账号获取,我这里用的是射手网(伪)的,对应注册连接在文内