簡單介紹#
展開
整體方案#
展開
方案基於互聯網上已有教程,採用虛擬化方式構建自有流媒體進行實踐,旨在實現自動化追番觀影的同時能學到一些虛擬化、伺服器相關的知識。
流媒體服務的整體框架如下:
- 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/
- 換源
企業源
## 刪除自帶的源 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
- 多磁碟可以組 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 工具要方便不少,官網
部署
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 文件夾,分別作為存儲空間和媒體空間,掛載好磁碟
## 確認要掛載的空間
$ 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 伺服器組件:
$ yum install nfs-utils
- 創設要共享的目錄權限:
$ chmod 777 /mnt/storage
$ chmod 777 /mnt/media
- 配置 NFS 訪問權限文件 /etc/exports。例如:
$ 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 服務:
$ systemctl start nfs-server
$ systemctl enable nfs-server # 設置開機自啟動
- 在防火牆中開啟 NFS 連接的端口:
$ firewall-cmd --permanent --add-service=nfs
$ firewall-cmd --permanent --add-port=2049/tcp
$ firewall-cmd --reload
- 測試 NFS 配置:
$ 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
docker 伺服器#
創建第三台 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
k8s 環境快速部署#
開源項目: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 的方式進行部署並使用
展開
部署#
docker 方式#
掛載共享文件夾到本地
## 確認是否可以掛載
$ 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
上述代碼中需要注意的內容有以下幾點:
- 默認為 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#
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#
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#
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#
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#
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#
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 需要從對應的字幕網站上註冊賬號獲取,我這裡用的是射手網 (伪)的,對應註冊連接在文內