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 keySecret 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 - 灵活,点保存即可。


  更新于 4 个月前     编辑本文     返回顶部