0x0F - 搭建自己的云存储空间!闲置主机的现代化改装!

TL;DR 太长不看的环境搭建总结

说在前面

不知不觉,家中常备的 Minecraft 服务器迎来了一波游玩人数的低谷,从游玩人数高峰(4人)一下子跌倒了谷底(1人)。
考虑到全球碳中和运动,咱们得节能减排,充分利用资源。正当此时,准备对闲置的 MC 服务器来一波现代化改装,姑且定下了以下的目标。

  • 访问本地硬盘存储的各种文件
  • 拥有远程下发离线下载任务的能力
  • 简易流媒体播放 & 资源刮削
  • 内网穿透访问

考虑到互联网环境危机四伏,除却离线下载的功能外,其余均在内网环境下使用。
机器配置如下:

  • 系统:Ubuntu 22.04 LTS
  • 处理器:AMD R5 3600 6-core
  • 内存:8G x 2 DDR4 3600
  • 显卡:GeForce GT 710 亮机卡
  • 存储:
    • WD SN520 NVMe SSD 500G
    • Seagate 7E10 8T HDD

以上,除了 8T 的 HDD 是为了扩大存储空间而新添加的以外,其余都是从前延续下来的配置。
这么看来,当初玩 MC 多加了一根 8G 的 RAM ,现如今在新的场景下显得有点性能冗余。 _(:з」∠)_

如何部署存储服务

相比于百度网盘捉急的下载速度,使用本地网络存储的一大好处就是一次下载,快速体验。
因此,挑选一个合适的网络存储管理平台也是相当重要的一环。

以下是我使用过的两种比较简单的私有网盘搭建方式。

轻量 Nginx 简易配置

其实,如果只是需要一点内网下载的功能,使用 nginx 稍加配置就能达到 “可用” 的状态了。
具体如何部署 nginx 在此不作赘述,网上教学已经很多了,这里只对如何修改配置文件作一些提示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ vi /etc/nginx/nginx.conf

# 在文件内添加形如以下的配置

http {
...
server: {
# 配置下载
location /download {
root /path/to/your/folder;
autoindex on;
autoindex_exact_size off;
}
}
...
}

它的界面大概长这样:

nginx

堪堪够用,如果没有特别复杂的需求的话,这就足够了。
但严格来说,这并不是私有网盘,更不用说一些在线浏览的功能了。

因此,我们需要一个更灵活,更丰富的网盘服务作为我们的展示前端

Alist 界面

Alist 是 Github 上的一个开源自建文件存储管理系统,这里 是它的官方仓库。
它不仅支持多样的线上网盘挂载方式,同时也支持不少格式的在线预览,甚至可以作为轻量的流媒体播放平台使用。

官方提供了 docker 镜像,因此可以用 docker 的方式非常简单地进行部署。

我们先准备好一个用于存放网盘内容的文件夹,举例来说,我们这里是 /mnt/data1/media
在创建 docker 容器的时候需要将这个目录作为卷映射到 docker 内部

1
2
3
4
5
6
$ docker pull xhofe/alist-aria2 # 这是预装 aria2 的版本,如果不需要的话可以直接使用 xhofe/alist
$ docker run -d --restart=always \
-v /etc/alist:/opt/alist/data \
-v /mnt/data1/media:/mnt/data1/media \
-p 5244:5244 -e PUID=0 -e PGID=0 -e UMASK=022 \
--name="alist" xhofe/alist-aria2:latest

这样执行过后我们的服务就算启动起来了,可以通过 ip 地址+端口号或是内部域名访问你的服务了。
假若是本地部署,那么地址就是 http://127.0.0.1:5244/,具体部署机器在内网是什么 ip 可以通过 ifconfig 得到。

先别急着进去,我们还需要准备一下用于登录的账户和密码:

1
2
3
4
# 随机生成一个密码
docker exec -it alist ./alist admin random
# 手动设置一个密码,`NEW_PASSWORD`是指你需要设置的密码
docker exec -it alist ./alist admin set NEW_PASSWORD

这样你就可以进入到 alist 的网盘界面了。

alist_raw

可是现在我们的 alist 空无一物啊!
确实,没有配置过的 alist 什么都没有显示,那么接下来我们就要配置具体的存储路径了。

配置 alist 存储

官方文档给出了很详细的使用方法,可以参考这个链接 https://alist.nn.ci/zh/guide/
不仅有常规路径的配置,也有一些网盘的配置方案可供参考。

这里仅提供一个本地存储的配置方式。

首先在网页最下面找到 管理字样,切换到管理界面,然后点击存储

alist_step1

在驱动里面找到 本机存储,可能选项比较多,需要仔细找一下。

在配置里面有两个比较关键的配置,一个是 挂载路径 ,另一个是 根文件夹路径
挂载路径 表示在 Alist 界面中显示的路径,而 根文件夹路径 表示的是这个目录在本地的路径

1
2
3
# 我这里的配置是
挂载路径:/local/data1
根文件夹路径:/mnt/data1/media

确认配置后最终的显示效果如下。

alist_step2

如何部署 Jellyfin 流媒体平台

要部署 Jellyfin 的话,使用 Docker 来部署是最为方便的选项。

官方的 Docker 对中文的显示略有问题,所以使用一个更适合中文环境的定制 image 会更好。

这里使用 nyanmisaka 的定制 Jellyfin 镜像,不仅对中文更友好,还优化了对硬件解码的支持。

1
docker pull nyanmisaka/jellyfin

首先创建两个给 Jellyfin 保存配置文件和缓存的文件夹

1
mkdir -p /home/jellyfin/config /home/jellyfin/cache

为了正确识别视频源,需要将存放视频的文件夹作为外部卷引入,我这里是 /mnt/data1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo docker run -d --name=Jellyfin \
-p 8096:8096 \
-p 1900:1900/udp \
-v /home/jellyfin/config:/config \
-v /home/jellyfin/cache:/cache \
-v /mnt/data1:/mnt/data1 \
-e TZ=Asia/Shanghai -e PUID=0 -e PGID=0 \
--add-host=raw.githubusercontent.com:185.199.108.133 \
--add-host=raw.githubusercontent.com:185.199.109.133 \
--add-host=raw.githubusercontent.com:185.199.110.133 \
--add-host=raw.githubusercontent.com:185.199.111.133 \
--restart always \
--shm-size 4G \
--device=/dev/dri:/dev/dri \
nyanmisaka/jellyfin:latest

添加 githubhost 目的是为了正常更新插件,如果想要正常刮削视频的元数据的话可以考虑添加 tmdb imdbhost

暴露 8096 的端口号可以让我们在网页上管理 Jellyfin 的设置。
之后通过 IP 访问就可以设定管理员账号和管理影片内容了。

使用 Aria2 的离线下载功能

如果使用的是上文描述的 alist,那么 alist 自带有 aria2 的部分功能,可以在界面的右下角找到对应的选项。
Aria2 的配置和使用我之后会考虑单独写一篇日志教学。

现在国内的网盘环境可能并不适合 Aria2 的发挥,但是在服务端配置一个 Aria2 的下载服务我觉得多少还是有价值的。

使用 ZeroTier-One 进行内网穿透

ZeroTier-One 是一个功能异常强大的软路由工具,可以达到使用局域网 IP 访问远端局域网,同时支持 P2P 和流量转发。
可以说,建立点对点虚拟专用网根本不在话下,使用方式也很简单,不得不品尝。

首先去它的官网建立一个账号 https://my.zerotier.com/login
注册完毕以后你可以在 Networks 下看到已经建立好的虚拟局域网。
记下你的 Network ID ,等会在配置链接的时候会用到。

我们的目的就是将咱们的机器加入到这个网络之中。
具体局域网的网段设置和隐私设置可以参考它的说明,一般来说默认即可。

windows 端的 Zerotier 有自己的客户端,有 GUI 使用配置非常简单。
这里重点讲一下 Linux 端如何配置。
官网下载地址:https://www.zerotier.com/download/

需要注意的是,不论是哪个平台,如果网络隐私配置的是 Private 非公开,那么在实际加入网络的时候都需要人工手动同意才能加入成功。
这个在对应设备请求加入网络后,到官网上的网络管理页面内, Members 标签下,进行授权的操作。

Linux 使用

安装

如果网络条件允许,可以这样安装

1
curl -s https://install.zerotier.com | sudo bash

等待安装完成以后 zerotier-cli 以及相关命令理应就会出现在你的环境中了。

1
$ zerotier-cli info # 查看你自己的网络信息

配置连接

如果需要加入已经创建的网络,需要刚才记下的 Network ID

1
$ zerotier-cli join abcdabcdabcdabcd # 这里替换成你的 Network ID

在弹出 OK 以后,如果你的网络隐私配置是 Private 则去官网进行网络的授权确认。
此时,你的设备已经被添加到了这个网络中,你可以用 zerotier-cli info 查看对应的网络状态和 ip 地址。
在同一个网络下的其它设备均可以通过这个 ip 访问到你的设备。

建立自己的 Moon

Zerotier-One 将自己的原理抽象成为了卫星围绕行星旋转的机制。
我们如果要查找到别的机器,首先需要访问对应的卫星服务器,如果卫星服务器没有找到对应的机器,那么就需要再通过访问行星服务器来获取到其它设备的信息,以进行网络穿透。
而官方指定的只有若干个行星服务器,且有一些还在梯子外面,访问实在是有点缓慢。
因此,Zerotier-One 的官方还提供了一种自建路由卫星服务器的方式,可以有效减少建立连接的时间,缩短延迟。

如果你有一台存在公网 IP 且网速稳定的服务器时,可以考虑自建 Moon 服务器

官方的使用说明文档:https://docs.zerotier.com/roots

我们首先这样跑

1
2
$ zerotier-idtool initmoon abcabcabcabc >> moon.json
# 这里的 abcabcabcabc 需要替换为你希望作为 moon 的机器的 zerotier-one identity,可以通过 zerotier-cli info 获得

查看 moon.json,大体如下

moon.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"id": "abcabcabcabc",
"objtype": "world",
"roots": [
{
"identity": "abcabcabcabc",
"stableEndpoints": []
}
],
"signingKey": "...",
"signingKey_SECRET": "...",
"updatesMustBeSignedBy": "...",
"worldType": "moon"
}

将你的 Moon 服务器的 IP 地址填入 stableEndpoints

moon.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"id": "abcabcabcabc",
"objtype": "world",
"roots": [
{
"identity": "abcabcabcabc",
"stableEndpoints": ["111.111.111.111/9993"]
}
],
"signingKey": "...",
"signingKey_SECRET": "...",
"updatesMustBeSignedBy": "...",
"worldType": "moon"
}

Linux 的默认配置下,zerotier-one 的配置文件在 /var/lib/zerotier-one 这个路径下。
在这个路径下创建一个文件夹 moons.d ,把刚刚的 moon.json 丢到这个文件夹下。

然后,你就可以使用 zerotier-cli orbit abcabcabcabc 指定设备来访问这台机器了。

有必要说明,我这边的只是部分使用指南,需要完整的文档请访问官方。
官方的使用说明文档:https://docs.zerotier.com/roots