背景

公寓中,闲来无事,且手头闲置机子够多,可以整点花活

用之前NAS沉淀下来的知识点,搭建一下自己的服务集群

将文件服务和影音服务隔开进行管理

防止之前单点服务器导致的,功耗大且稳定性低

服务选择

对于集群管理,K8s过重,K3s轻,后续考虑支持,Rancher太重,还是portainer香

对于文件管理,NFS和WebDav是目前兼容性和实用性都较高的服务,考虑都支持,毕竟NFS在Windows上不好使,但是Linux下好使,同时对于新的iscsi协议保持观望

iSCSI,CIFS,NFS协议的性能评测_郭劲.pdf

这篇期刊中有所体现

对于影音服务采用Jellyfin,支持硬解,为以后若是能穿透使用,提供便捷

同时将刮削服务通过TMM实现,Jellyfin的刮削服务并不好

播放端采用KODI,正好有一个高性能服务器,拿来跑KODI正好

服务分布

机器型号

OS

服务

红米路由器AX6S

openwrt

翻墙,网络管理

树莓派4B

Raspbian

Portainer(Docker管理)

HK1BOX

Armbian

qbittorrent & Transmission(下载),WebDev & NFS (文件共享),Nas-tools(NAS管理工具)

GK3V迷你电脑

LibreELEC

Jellyfin(影音服务),KODI(影音播放器),TMM(影音刮削)

总体服务分布取决于各个机器的性能

机器型号

特性

适用场景

树莓派4B

内存小,功耗低,稳定

分担一些简单服务

HK1BOX

内存大,功耗中等,稳定

用于底层数据服务,然后通过文件协议共享给各个机器

GK3V

内存大,功耗高,长期开机会宕机,性能强

用于高性能服务,以及随开随关

服务调用图

1749898009606.svg

刷机流程

AX6S


原系统并不能支持特殊要求

需要给服务器刷入OpenWrt

https://post.smzdm.com/p/a8xzpgg0/

HK1 BOX


HK1 BOX作为机顶盒,可覆写的系统并不多,只有armbian是最自由的,其他都是影音或者安卓

由于需要高可定制化,需要通过armbian实现,所以如果有别的系统,或者变砖了,需要先刷回原系统,再刷armbian

刷原系统

通过短接线路,并使用双公头USB-B接口刷回原系统,其中需要用到刷机工具

  1. USB_burning,是Hk1 BOX的原厂刷机工具,短接连接电脑后,可以刷回原厂系统

  2. license 刷机工具的秘钥包,会在导入刷机包时,检测秘钥,食用方法在视频

  3. 刷机包,只用于HK1 BOX

资源

刷机工具.zip

license.zip

参考视频

https://www.bilibili.com/video/BV1u44y1G7us/?spm_id_from=333.337.search-card.all.click&vd_source=66b9caba37ea25f4993c775f67132def

刷完后刷armbian

刷armbian

https://github.com/ophub/amlogic-s9xxx-armbian

选bullseye的release,有多个版本 注意选择s905x3

通过balena刷机工具,刷入U盘后

插入U盘到2.0接口后,在启动时按住耳机孔内的一个复位开关,即可进入U盘界面

进入后初始化系统,再通过Armbian-install 命令,将系统刷入EMMC闪存,便可以不插入U盘启动

如果不联网在Armbian-install时会出现时间不一致,无需关心

参考视频

https://www.bilibili.com/video/BV1v44y1G7Lh/?spm_id_from=333.788&vd_source=66b9caba37ea25f4993c775f67132def

树莓派4B


对于树莓派4B,由树莓派自身提供的系统刷入工具即可

由于树莓派只有1G内存,收入命令行的Lite系统对于我就够用了

在刷入时,可以提前配置好网络信息,不然后续需要手动打开SSH等

GK3V


由于GK3V的AMD64平台,使得整体可以选择性高,兼顾到家中4K屏

对于Linux Mint,由于桌面系统的性能压力与GK3V的CPU和GPU不是很匹配,便未选择

但是由希望有一个专门负责影音的机器,支持原盘,4K,连通NAS,便为其刷入KODI的专业Linux,LibreELEC

BIOS刷入

由于盒子自身的BIOS是支持一些启动项设置的,也会USB检测刷机好像【也可能是我自己设置的】

插入U盘启动就可以识别到系统刷入程序

按部就班的用引导程序刷进去就完事了

环境搭建

AX6S


启动后,由于千兆路由器的一些缓存问题,需要在 系统-定时重启 打开定时重启

然后配置openclash,设置下白名单通过策略

之后在 网络模块中

打开无线

配置DHCP/DNS 在其中可以固定好静态IP

本着网络管理方面 稳定就是完美的策略,看不懂的就不动

服务模块中对于能看懂的服务进行启动

如果有自己拉网线配置IPV6的,可以打开全锥型NAT,有效降低打洞难度,提升NAT网络后的连通性

树莓派4B


树莓派如果一开始没有配置好SSH等

进入系统后,接个显示器,打开SSH,SSH-root访问和root密码配置,就可以开始配置了

装入Docker通过菜鸟教程的Docker安装中的debian系即可一键安装

https://www.runoob.com/docker/debian-docker-install.html

原先此处想安装Rancher,但是Rancher对于树莓派的架构没有能用的Docker,遂放弃

同时Rancher对于性能要求高,在1G内存的树莓派4B上,相对紧张

于是选择Portainer,其轻量且美观的UI,更为符合家庭使用

在树莓派上安装Portainer,其他服务器上安装Portainer-agent即可通过Docker Standalone模式进行连接,即可管理其他集群上的docker

https://hub.docker.com/r/portainer/portainer-ce

HK1BOX


下载服务

刷入Armbian后,其自身已经支持SSH远程连接,无需额外配置

通过Docker命令进行安装即可

如果之前已经有QB和TR的使用镜像,可以把他们的配置和信息都打包出来,然后覆盖Data文件夹

即可实现快速迁移,但是要保证容器内挂载的磁盘位置是相同的

  • QB Docker命令(nevinee版,适配了iyuu)

    docker run -dit \\
      -v /data/qb:/data  \\
      -v /mnt1:/mnt1 \\
    	-v /mnt2:/mnt2 \\
    	-v /data/tr/config/torrents/:/tr_bk \\
      -e PUID="1000"        `# 输入id -u可查询,群晖必须改` \\
      -e PGID="100"         `# 输入id -g可查询,群晖必须改` \\
      -e WEBUI_PORT="8090"  `# WEBUI控制端口,可自定义` \\
      -e BT_PORT="34567"    `# BT监听端口,可自定义` \\
    	-e INSTALL_PYTHON='true' \\
    	-e IYUU_TOKEN='IYUUxxxxxxxxxx' \\
      -p 8090:8090          `# 冒号左右一样,要和WEBUI_PORT一致,命令中的3个8080要改一起改` \\
      -p 34567:34567/tcp    `# 冒号左右一样,要和BT_PORT一致,命令中的5个34567要改一起改` \\
      -p 34567:34567/udp    `# 冒号左右一样,要和BT_PORT一致,命令中的5个34567要改一起改` \\
      -p 9000:8787          `# IYUUPlus的WebUI控制端口` \\
      --restart always \\
      --name qb \\
      --hostname qbittorrent \\
    nevinee/qbittorrent:4.3.9-iyuu
    
  • TR Docker命令(chisbreadbane,快速校验)

    docker run -d \\
      --name=tr \\
      -e PUID=1000 \\
      -e PGID=1000 \\
      -e TZ=Asia/Shanghai \\
      -e USER=txuw \\
      -e PASS=xxxxxx \\
      -p 9091:9091 \\
      -p 51413:51413 \\
      -p 51413:51413/udp \\
      -v /data/tr/config:/config \\
      -v /data/tr/watch:/watch \\
    	-v /mnt1:/mnt1 \\
    	-v /mnt2:/mnt2 \\
      --restart unless-stopped \\
    chisbread/transmission:version-3.00-r13
    

NAS管理服务

之后便是Nas-tools

作为Nas助手,他的目的是想包揽很多活,但是我目前只用了他的目录同步功能

目录同步功能的来源是因为当你使用TR和QB,进行种子存储时,内部文件是不允许移动、修改的

但是如果需要搭配上TMM刮削器,去适配影音服务的海报墙,位置层级结构是要变化的,但是文件内容是不会变化的

此时需要使用硬链接技术,将TR和Qb服务的存储文件夹,做一个索引同步到另一个文件夹去,让刮削服务和影音服务去读取同步后的文件夹,改动里面的文件位置,并不会影响到TR和QB的种子保存情况。

为什么不用软连接呢?因为这个文件夹大概率会被挂载到Docker里,软链接Docker是无法识别的

  • Nas-tools docker命令

    docker run -d \\
        --name nas-tools \\
        --hostname nas-tools \\
        -p 3000:3000   `# 默认的webui控制端口` \\
        -v /data/nas-tool/config:/config  `# 冒号左边请修改为你想在主机上保存配置文件的路径` \\
        -v /mnt1:/mnt1    `# 媒体目录,多个目录需要分别映射进来` \\
        -v /mnt2:/mnt2    `# 媒体目录,多个目录需要分别映射进来` \\
        -e PUID=1000     `# 想切换为哪个用户来运行程序,该用户的uid,详见下方说明` \\
        -e PGID=1000     `# 想切换为哪个用户来运行程序,该用户的gid,详见下方说明` \\
        -e UMASK=022  `# 掩码权限,默认000,可以考虑设置为022` \\
        -e NASTOOL_AUTO_UPDATE=false `# 如需在启动容器时自动升级程程序请设置为true` \\
    		nastool/nas-tools:latest
    

文件共享服务

对于Linu之间通过NFS进行文件共享

对于Windows通过WebDav进行文件共享

NFS

apt install nfs-kernel-server

即可安装nfs的server服务,他会集成好很多nfs的对应systemctl到系统中

之后进入/etc/exports中 编辑需要Share的文件夹

/mnt *(rw,async,no_root_squash,no_subtree_check)
/mnt/mnt1 *(rw,async,no_root_squash,no_subtree_check)
/mnt/mnt2 *(rw,async,no_root_squash,no_subtree_check)

[需要Share的文件夹] [允许的IP] (options)

其中 *代表的是所有IP都可以使用这个服务

对于options 其意义如下表格

rw

允许读写

async

异步读写,性能高

no_root_squash

权限同步,允许root

no_subtree

不检查父目录权限

同时此处挂载了/mnt的同时又挂载了/mnt/mnt1

是由于mnt1是通过USB挂载进来的,如果不加入这个子目录挂载,识别不到USB内的内容

通过systemctl enable nfs-server无法实现开机自启动,甚是奇怪

WebDav

WebDav此处便于管理,通过docker实现

但是建议还是用正经的WebDav的Go包,或者python进行实现

因为WebDav在Docker中的传输性能并不优秀,会有限制

后续考虑通过Go配置

  • WebDav docker命令

    docker run --name webdav \\
      --restart=unless-stopped \\
      -p 80:80 \\
      -v /mnt1:/media/mnt1 \\
      -v /mnt2:/media/mnt2 \\
      -e USERNAME=txuw \\
      -e PASSWORD=xxxxxx \\
      -e TZ=Asia/Shanghai  \\
      -e UDI=1000 \\
      -e GID=1000 \\
      -d  ugeek/webdav:arm
    

Docker中会自动向外发布media下的文件

开机启动配置

由于HK1 BOX在最新版的内核中引入了新的USB3管理框架

开机自启动无法挂载到USB3接口下的文件

如果对性能没有要求,可以插在USB2上

对于影音,还是得USB3

所以编写开机启动脚本,手动挂载,手动启动docker

由于docker需要root命令,server脚本需要以user=root启动

  • usb_mount 脚本

    #!/bin/bash
    mount UUID=bdb9d073-fd6b-2648-87c4-655370c7d278 /mnt/mnt1
    mount UUID=68031de8-5560-774b-ade9-e2786c2b6f20 /mnt/mnt2
    docker start qb
    docker start tr
    docker start nas-tools
    systemctl start nfs-server
    
  • mount.server

    [Unit]
    Description=Mount UUID-based Filesystems
    After=network.target
    
    [Service]
    ExecStart=/bin/bash -c "sudo /root/usb_mount.sh"
    User=root
    
    [Install]
    WantedBy=multi-user.target
    

GK3V


LibreELEC的优点

LibreELEC在Kodi和影音的支持上确实是完美的

对于一个我自己都不知道蓝牙是否能用的机器

其LibreELEC管理框架下自带的蓝牙居然是能检测到的,只需要在KODI界面中找到蓝牙插件安装即可

同时其对于有限、无线的支持,都是非常到位的

在作为影音盒子的体验上,确实是完美的

LibreELEC的缺点

LibreELEC的自定义体验上无疑是较为痛苦的

由于LibreELEC是独立的Linux发行版,其区别于常用的Ubuntu和CentOS

大多数的系统级文件,都是写死无法修改的,哪怕你是ROOT

所有文件需要安装和编写在/stroages 的文件夹下

同时对于文件安装,你也只能在KODI内部用ELEC提供的框架进行安装

他不支持常用的任一软件源

好在ELEC提供的框架内,支持了Docker

Jellyfin的配置

对于其他Jellyfin的docker,都不如国内自己搞得香

主要体现在对硬解的支持等

  • Jellyfin Docker命令 (nyanmisaka版 JellyFin中国程序员编译)

    docker run -d \\
    --restart=always \\
    -p 8096:8096 \\
    --name Jellyfin \\
    -v /storage/data/Jellyfin/config:/config \\
    -v /storage/data/Jellyfin/cache:/cache \\
    -v /storage/mnt/mnt1:/mnt1 \\
    -v /storage/mnt/mnt2:/mnt2 \\
    nyanmisaka/jellyfin
    

Jellyfin的使用方法

https://zhuanlan.zhihu.com/p/580723365

TMM刮削器

连接HK1BOX的NFS协议,挂载到磁盘中,使用TMM影音刮削器,来刮削一些影片介绍等

TMM也可以通过Docker部署,同时注意TMM在V3免费,V4收费,使用docker部署时注意甄别

此处使用dzhuang 的Docker镜像,专用于国内,支持国内字体

https://hub.docker.com/r/dzhuang/tinymediamanager

docker run -d --name=tinymediamanager \\
-v /data/tinymediamanager/config:/config \\
  -v /mnt1:/mnt1 \\
  -v /mnt2:/mnt2 \\
-e GROUP_ID=1000 \\
-e USER_ID=0 \\
-e TZ=Asia/Hong_Kong \\
-p 5800:5800 \\
-p 5900:5900 \\
dzhuang/tinymediamanager:latest

文件共享

https://wiki.libreelec.tv/how-to/mount_network_share

在ELEC的WIKI中,提供了NFS等的挂载办法

需要尤为注意

Where=/storage/recordings 和你的.mount命名是挂钩的

systemctl enable storage-recordings.mount

不然识别不到

对于WebDav,只能让Kodi去支持

docker版本的WebDav性能非常拉胯,估计是我服务器端包了一层,Client端又一层,直接炸了

或者可以自己编译WebDav的程序包,相信我,非常麻烦

Feature

  • 将WebDav在HK1Box中本地支持,而不走Docker

  • 集群管理转为k3s