Storj.io 免费版提供 150 GB 的储存空间,支持 S3 Compatible API,十分诱人,可以作为 Mastodon 的对象储存空间。但是 Storj 不支持公开访问,可以借助 Fastly VCL 变相实现公开访问支持。
Fastly 每月 50 刀以内的消耗是免费的,大概能支持 100GB 流量/月,但 Fastly 免费版并不支持给自定义域名添加 SSL,所以又需要 Cloudflare 或其他 CDN 来为自定义域名提供 SSL。
所以为了能更好的使用 Storj.io,还需要 Fastly 及 Cloudflare 配合。(其实如果会 S3 API 及 Worker 的话,按理说可以直接使用 Cloudflare Worker 进行处理,但是我并没有找到案例)
1/ Storj.io 部分
正常注册并创建储存桶,建议注册美区。
然后创建 Access key
及 Secret key
2/ Fastly 部分
通过 Fastly 创建公开链接在 Storj 官方文档有写,这里简单汉化一下。
注册并登录,创建一个新的加速服务,Domains
按您欲加速的域名填写
Hosts
填写 储存桶名.gateway.us1.storjshare.io
创建 VCL snippet,Type
选择 within subroutine
- miss
然后粘贴下方代码
declare local var.accessKey STRING;
declare local var.secretKey STRING;
declare local var.storjBucket STRING;
declare local var.storjGateway STRING;
declare local var.region STRING;
declare local var.canonicalHeaders STRING;
declare local var.signedHeaders STRING;
declare local var.canonicalRequest STRING;
declare local var.canonicalQuery STRING;
declare local var.stringToSign STRING;
declare local var.dateStamp STRING;
declare local var.signature STRING;
declare local var.scope STRING;
set var.accessKey = "YOUR_ACCESS_KEY"; # 改成上一步获取的 ACCESS_KEY
set var.secretKey = "YOUR_SECRET_KEY"; # 改成上一步获取的 SECRET_KEY
set var.storjBucket = "YOUR_BUCKET_NAME"; # 改成你创建的储存桶名
set var.storjGateway = "gateway.us1.storjshare.io"; # 改成相应的 Gateway 域名
set var.region = "decentralized";
if (req.method == "GET" && !req.backend.is_shield) {
set bereq.http.x-amz-content-sha256 = digest.hash_sha256("");
set bereq.http.x-amz-date = strftime({"%Y%m%dT%H%M%SZ"}, now);
set bereq.http.host = var.storjBucket "." var.storjGateway;
set bereq.url = querystring.remove(bereq.url);
set bereq.url = regsuball(urlencode(urldecode(bereq.url.path)), {"%2F"}, "/");
set var.dateStamp = strftime({"%Y%m%d"}, now);
set var.canonicalHeaders = ""
"host:" bereq.http.host LF
"x-amz-content-sha256:" bereq.http.x-amz-content-sha256 LF
"x-amz-date:" bereq.http.x-amz-date LF
;
set var.canonicalQuery = "";
set var.signedHeaders = "host;x-amz-content-sha256;x-amz-date";
set var.canonicalRequest = ""
"GET" LF
bereq.url.path LF
var.canonicalQuery LF
var.canonicalHeaders LF
var.signedHeaders LF
digest.hash_sha256("")
;
set var.scope = var.dateStamp "/" var.region "/s3/aws4_request";
set var.stringToSign = ""
"AWS4-HMAC-SHA256" LF
bereq.http.x-amz-date LF
var.scope LF
regsub(digest.hash_sha256(var.canonicalRequest),"^0x", "")
;
set var.signature = digest.awsv4_hmac(
var.secretKey,
var.dateStamp,
var.region,
"s3",
var.stringToSign
);
set bereq.http.Authorization = "AWS4-HMAC-SHA256 "
"Credential=" var.accessKey "/" var.scope ", "
"SignedHeaders=" var.signedHeaders ", "
"Signature=" + regsub(var.signature,"^0x", "")
;
unset bereq.http.Accept;
unset bereq.http.Accept-Language;
unset bereq.http.User-Agent;
unset bereq.http.Fastly-Client-IP;
}
最后,点击发布即可。
3/ Cloudflare 部分
设置 DNS 记录至 dualstack.nonssl.us-eu.fastly.net
,记得勾选代理。
规则
- Configuration Rules
新建一个规则:
当传入请求匹配时... 主机名
- 等于
您的域名,然后拖动到最底端 SSL
- 灵活
,点保存即可。