在运行一段时间的misskey之后,各种媒体文件会占据一定的存储空间,虽然可以关闭外站文件存储以节约存储空间,但随着用户规模的增多与运行时间的延长,对存储空间的需求也就会越来越大了,这个时候就需要接入对象存储来进行对存储空间进行扩容。

首先misskey是支持AWS的S3对象存储的,但S3费用一般比较大而且AWS(非国区)注册困难。前几天刚想注册了一个账号,但卡在添加银行卡这一步上,我持有的四大银行的借记卡都不能用,遂放弃……AWS还常常发邮件催我完成注册,这不是我的问题啊……

阿里云对象存储收费价格
阿里云对象存储收费价格

但对象存储又不止AWS一家,国内的几个大厂也有类似的服务,阿里云有OSS,腾讯云有COS……都可以使用,通过研究相关的页面以及收费说明,发现对象存储的收费主要由三部分组成的。首先是存储费用,对于标准存储,一般是按量计时收费,一般是1GB数据存一个月要0.1-0.2RMB,有的也可以包月。还有就是流量费,这种对象存储所存储的文件是可以设置为公网可以直接读取的,但这要收费。还有一个是针对请求数量收费。通过对收费规则的研究,发现这些服务商对于自己同一区域的vps对对象存储服务的访问是不收取流量费与请求费的,这就相当合算了。我安排的实例在阿里云华东区,所以就准备给misskey接入阿里云的OSS对象存储。

阿里云包月很便宜,我不是在给阿里云打广告啊(逃
阿里云包月很便宜,我不是在给阿里云打广告啊(逃

于是长达两个多月的折腾就开始了。下面主要是记录一下折腾的过程,如果直接想看最终正确结果请跳过。

首先开通阿里云OSS,这个很简单,按部就班就完事了,看阿里云文档上面说OSS的API与AWS的S3是兼容的,结果按照原因搬上去就失败了,总是说密钥不存在……说明兼容还不够彻底……第一次尝试失败了

后来通过多方了解,知道了有了minio这个可以提供支持S3API的东西,不仅可以自己作为一个对象存储服务器,并且可以拿阿里云OSS做后台作为一个网关。而且发现有大佬早在17年已经向minio提交了PR,并且已经合并进去了,这样以来OSS的请求与下载完全可以通过内网而没有请求费用与流量费用了。于是去看minio文档,并没有相关描述,遂失败

minio的github页面找到了这个于是下载minio使用,但报错提示并没有oss这个命令……遂失败

后来又找到了这个pull原来是因为许可证原因给remove了,于是找到remove之前的版本安排上,一开始很顺利,已经把我的bucket都显示出来了,但上传文件的时候就报错,也根本没法用。

经过这四次比较大的失败与若干次比较小的失败,最后重要成功安排上了。

下面是正确的方法

首先下载包含有OSS网关的minio,可以去http://dl.minio.org.cn/server/minio/release/linux-amd64/archive/?C=N&O=D找对应系统的2020-04-15版本。

minio后台
minio后台

按照文档运行

export MINIO_ACCESS_KEY=ossaccesskey
export MINIO_SECRET_KEY=osssecretkey
minio gateway oss

这样会出问题的,需要在oss后面加上Endpoint(地域节点)

export MINIO_ACCESS_KEY=ossaccesskey
export MINIO_SECRET_KEY=osssecretkey
minio gateway oss https://oss-cn-hangzhou-internal.aliyuncs.com

然后根据提示访问对应的URL,并进行上传文件的测试。

如果能够正常上传文件,就可以进行下一步的操作了

用nginx作反向代理

server {
    server_name oss.dogcraft.top ossd.dogcraft.top;
    # listen 80;
    listen 443 ssl http2;
    ssl_certificate /root/key/dog.pem;
    ssl_certificate_key /root/key/dog.key;
    access_log /var/log/nginx/oss.log main;
     location / {
   proxy_set_header Host $http_host;
   proxy_pass http://127.0.0.1:9000;
 }
}

利用nginx可以监听多个域名,在套cdn时比较方便,我就是监听了两个域名,一个套了cloudflare的cdn另一个没有。

最后一步是在misskey中设置对象存储

配置方法
配置方法

基本网址是在对外显示图片是misskey所构造的网址,一般可以用套上cdn之后的minio域名+存储桶的名称构造处理,具体可以到minio控制台里面获取文件直链看已经具体的url结构。

端点是misskey进行读写所连接的API的url,是minio的可以访问的url,如果misskey与minio不在一台服务器上,最好还是用https连接。

可用区不用填。

如果测试全部正常之后,就可以把minio安排到systemd上面管理,通过前面可以知道,相关的accesskey是通过环境变量的形式传递到minio上面的,所以可以通过EnvironmentFile把相关的accesskey变成配置文件。

sudo nano /etc/minio/e.env

把环境变量写进文件

MINIO_ACCESS_KEY=LTAI4G3catcatcatcat
MINIO_SECRET_KEY=dFkkdy6jDogdogdogdog

最后再编辑 /etc/systemd/system/minio.service把环境变量文件与端点地址写上去就行了。

[Unit]
Description=minio daemon

[Service]
Type=simple
User=yu
ExecStart=/home/yu/minio/minio gateway oss https://oss-cn-hangzhou-internal.aliyuncs.com
WorkingDirectory=/home/yu/minio
EnvironmentFile=/etc/minio/e.env
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=minio
Restart=always

[Install]
WantedBy=multi-user.target

最后别忘了

sudo systemctl daemon-reload
sudo systemctl enable minio
sudo systemclt start minio

另外好像现在有大佬解决了许可证的问题,提交pr要求把oss gateway加回来,但minio开发人员好像并不同意,估计不是技术上的原因,对此不做评论与恶意性的揣测……