2021.02.07更新:
misskey 12.69.0
修正了之前的历史遗留问题,可以直接套用阿里云oss,无需minio
中转。
在运行一段时间的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版本。
按照文档运行
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
开发人员好像并不同意,估计不是技术上的原因,对此不做评论与恶意性的揣测……