研究对象存储服务(OSS)是因为考虑到将来可能会有在博客上放出一些可供分享的文件下载的服务需求,直接使用现有图床,容易混杂乱。因此我考虑重新建立一个独立 OSS 存储服务。直接 Google 搜到了Minio这个框架,10k+的 Star,就决定选择这个了。Minio 框架有如下几个优势:

  • 可以 Docker 部署,非常省事
  • 文档完善
  • 全面的平台支持
  • 多种客户端语言支持(有完善的 JS SDK)

1 1. Minio 部署

使用 Docker 部署可以说是非常方便省事了。我的部署命令如下:

1
2
3
4
5
6
7
docker create -p 9000:9000 \
-e "MINIO_ACCESS_KEY=your-access-key" \
-e "MINIO_SECRET_KEY=your-secret-key" \
--name=minio \
-v /path/to/minio/data:/data \
-v /path/to/minio/config:/root/.minio \
minio/minio server /data

其中的访问秘钥对需要替换成你自己设置的值。这一对值稍后会用于网页端的登录。然后用

1
docker container start minio

来启动镜像。完成后就可以在http://domain.com:9000中访问到了,输入 docker 命令中的秘钥对来登录。

登录界面

而后你可以按照Lychee 图床教程中的做法,添加 Nginx 反向代理和 HTTPS 支持。

2 2. Hexo 中使用

部署完成后我才发现一个问题,那就是 Minio 生成的外链是强制有过期时间的,而且长度最多只七天。那我就不能像直接复制粘贴外链来使用了,同时,手动来每七天更新一次链接也是不可接受的。因此用 Hexo 脚本来自动实现了利用 Minio 的 API 接口来更新下载链接。脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
"use strict";

const Minio = require("minio");

var hexo = hexo || {};
var fs = fs || require("fs");
var yaml = yaml || require("js-yaml");
var minio_client =
minio_client ||
new Minio.Client(
yaml.safeLoad(fs.readFileSync(__dirname + "/minio_key.yml", "utf8"))
);

hexo.extend.tag.register(
"minio",
async (args, content) => {
var bucket = "default",
resource_name = "";
if (args.length == 1) {
resource_name = args[0];
} else {
resource_name = args[1];
bucket = args[0];
}
var file_url = await minio_client.presignedGetObject(bucket, resource_name);
return `<a target="_blank" href="${file_url}">${content}</a>`;
},
{ async: true, ends: true }
);

在博客工程的根目录下创建一个文件夹scripts,在其中创建一个 js 文件,如index.js,然后将上述脚本内容粘贴进去。然后在这个目录下创建设置文件,minio_key.yml,文件中需要包含如下信息:

1
2
3
4
endPoint: "minio.domain.com"
accessKey: "your-access-key"
secretKey: "your-secret-key"
useSSL: true # 是否使用https

然后还需要安装依赖

1
npm install --save minio

至此我们完成了脚本的安装。脚本为我们提供了一个标签插件,其使用范例如下:

1
2
3
{% minio 'bucket_name' 'resource_name' %}
下载链接
{% endminio %}

在使用 Hexo 进行静态页面渲染时,这部分内容会被自动渲染成下载链接:

1
<a target="_blank" href="download_url">下载链接</a>

不过这种方法还是有一个显而易见的缺点:你需要是一个非常勤奋的作者,每周都来发布一次文章,不然旧文章的链接还是会失效。