为Misskey配置外部存储


去中心化的社交平台固然相当美好,但作为平台的部署者要考虑的也有许多平时运行维护相关的日常惯例。例如在一些资源文件的存储方面,对于普通的性能见长、硬盘狭小的VPS而言,有着不小的挑战;而一般为存储特化、以硬盘容量见长的服务器,则通常并不会配备强大的其他资源核心。因而为Misskey配备一个网路环境优良的外置存储,一方面可以有助于对于处理核心的保护和特化支持,另一方面也能提升用户的使用体验。

Misskey支持AWS S3、GCS等知名静态存储提供商的API接口,但由于这些家的国内连接体验通常都十分拉跨,因而还是选择自建的服务吧。本次我使用的是一台对于三网都提供了直接连接优化的存储型伺服器,相信能为国内的用户提供一个更为优质的使用环境。

我选择了开源软件MinIO作为解决方案,它支持AWS S3的存储API,可以与Misskey方便地建立连接,且其在docker环境下的部署也比较方便。

由于是使用docker部署,因而各种基本操作我想自然也不必多言,按照标准流程即可。

为了保证服务后期的可迁移可维护性,我选择了使用docker-compose进行部署。因而将我使用的docker-compose.yml文件内容陈列于下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# MinIO
version: "3"
services:
minio:
image: minio/minio
environment:
MINIO_ACCESS_KEY: AccsssKey
MINIO_SECRET_KEY: SecretKey
command: server /data
volumes:
- /storage/minio/data:/data
- /storage/minio/config:/root/.minio
ports:
- "127.0.0.1:9000:9000"
restart: always
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
特别提示
  1. 请注意将环境变量中的AccsssKeySecretKey修改成复杂无规则的长字符串,以便提升运行环境的安全性。
  2. volumes中涉及到的/storage目录是之前一台伺服器配置时期的遗留产物,如果您希望将文件存储在其他地方的话,请自行修改为您需要的路径,以防止之后找不到所需要的文件。

配置完成后,使用 docker-compose up -d 启动服务。

之后是配置反向代理服务器,同样是按照标准流程即可。为了防止出现跨域的问题,建议使用和Misskey主站的主域名保持一致。

完成配置后访问设定的域名,我们能看到MinIO的管理控制台:

输入预先设定的AccsssKey和SecretKey,我们能进入管理界面。

单击右下角的加号,新建一个存储桶:

输入名称后按下回车键,即可确认创建。

再为存储桶指定相关的文件访问权限(不确定这一步是否需要)。

点击左侧存储桶列表右边的小三点,选择Edit Policy

由于我们是公有读取,因而Prefix部分直接使用*通配即可,单击Add即可完成权限配置项的添加。

此时,关于存储桶部分的配置就已经完成了。

之后,进入Misskey的实例管理界面,开启使用对象存储的开关,并按照页面上的提示输入之前设定的配置项:

我没有填写被蓝色斜线划去的部分,如果您有相关的使用需要,您可以根据提示进行配置。

配置完成之后试着保存一下吧,新的文件应该就会上传到存储伺服器了。可以发送一张图片尝试一下哦。


但是这样的配置,多多少少存在着安全隐患:如果被遍历目录了怎么办?如果被试图爆破密码了又该如何处理?

经过仔细的研究发现,minio中存储的文件都会以原始文件的形式存在于磁盘上,因而在公开页面中,我们可以绕过minio,直接将nginx导向存储着静态文件的对应目录,以纯粹的文件服务器形式呈现在公众面前,进而规避可能出现的被爆破密钥的情况。

因此可以修改我们的nginx配置文件,将公开页面设置为静态路径:
(请注意修改root /storage/minio/data/nyaone;行,使用您的实际静态文件路径)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 80;
listen [::]:80;
server_name sus.nya.one;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name sus.nya.one;
## SSL
ssl_certificate /etc/nginx/ssl/nyaone.cer;
ssl_certificate_key /etc/nginx/ssl/nyaone.key;

root /storage/minio/data/nyaone;

}

之后再修改Misskey后台的配置,将公开的链接导向我们的静态路径,来规避可能出现的源站泄露问题:

这样配置完成之后,所有的访问请求全部被导向了nginx提供的静态页面,也就不存在请求和源站暴露的问题啦~