利用backblaze B2和Cloudflare Workers搭建自主域名图床
此程序违反了cloudflare的TOS中的2.8条中的
2.8 Limitation on Serving Non-HTML Content The Services are offered primarily as a platform to cache and serve web pages and websites.
Unless explicitly included as part of a Paid Service purchased by you,
you agree to use the Services solely for the purpose of (i) serving
web pages as viewed through a web browser or other functionally
equivalent applications, including rendering Hypertext Markup Language
(HTML) or other functional equivalents, and (ii) serving web APIs
subject to the restrictions set forth in this Section 2.8. Use of the
Services for serving video or a disproportionate percentage of
pictures, audio files, or other non-HTML content is prohibited, unless
purchased separately as part of a Paid Service or expressly allowed
under our Supplemental Terms for a specific Service. If we determine
you have breached this Section 2.8, we may immediately suspend or
restrict your use of the Services, or limit End User access to certain
of your resources through the Services.
翻译:
2.8提供非HTML内容的限制 服务主要是作为缓存和服务网页和网站的平台提供的。除非明确包含在您购买的付费服务中,否则您同意仅将服务用于以下目的:(i)提供通过网络浏览器或其他功能等效的应用程序(包括呈现超文本标记语言(HTML))查看的网页或其他等效功能,以及(ii)根据第2.8节规定的限制提供网络API。禁止将服务用于提供视频或不成比例的图片,音频文件或其他非HTML内容,除非作为付费服务的一部分单独购买或根据我们的补充条款明确允许特定服务。如果我们确定您违反了第2.8节,我们可能会立即暂停或限制您对服务的使用,或限制最终用户通过服务访问您的某些资源。
如非必要,请勿使用
本站以前用的都是路过图床
这家图床,但是听到这家图床会乱删图,故选自建
但苦于pacificrack
主机(现已更换为Racknerd,且有计划换为香港CN2)的缓慢和低效,不可能使用自己的服务器搭建
“没钱可以找地主借钱啊”那既然自己的服务器不行,那就用第三方的服务
但是阿里云OSS,Amazon S3的高价,七牛云,又拍云需要备案又实在是让人劝退
一天在折腾cloudflare的时候发现了Cloudflare Workers,既然代理都能用它搭建,为什么图床不能呢?
而且对backblaze的高性能和免费10G储存早有耳闻,决定采用backblazeB2
Backblaze B2提供了10G免费文件存储服务。超出部分将按量付费,但是对与博客平台而言,存图片能把10G空间用完还真不容易,以一张图片100K计算,差不多可以存储10w张图片。只用来当图床已经足够了。Backblaze官网也对比了其他储存服务的价格,总之是很便宜了。
使用backblaze图片服务
打开backblaze注册页面,注册后进入控制台,右下角可以设置中文
点击创作一个桶,输入服务要创建的桶名称(唯一的),文件权限选择公众,然后点击创作一个桶
完成后点击“上传/下载”
点击上传即可上传文件
点击你上传的文件,在打开的窗口中记下用红线勾的内容
接入Cloudflare Workers以自定义域名
来到 Cloudflare , 登陆你的账号,如果没有账号,那就创建一个. 在开始前,你需要一个有效的域名, 跟着教程,将域名接入到他们的平台中.
创建一条CNAME记录,指向之前记下的地址
如果你的文件不会经常改变,我强烈建议你,添加一条 page-rule(页面规则) 来设置 “cache level(缓存等级)” 为 “everything(所有)”, 并且 “edge cache TTL(边界缓存存活时间)” 设置为较高的值,比如 7天
为了防止别有用心的人获取到储存桶名称后干“好事”,这里使用Cloudflare Workers进行地址重写
点击“创建Worker”后将此内容拷贝到编辑器中
'use strict';
const b2Domain = 'img.domain.com'; // configure this as per instructions above
const b2Bucket = 'bucket-name'; // configure this as per instructions above
const b2UrlPath = `/file/${b2Bucket}/`;
addEventListener('fetch', event => {
return event.respondWith(fileReq(event));
});
// define the file extensions we wish to add basic access control headers to
const corsFileTypes = ['png', 'jpg', 'gif', 'jpeg', 'webp'];
// backblaze returns some additional headers that are useful for debugging, but unnecessary in production. We can remove these to save some size
const removeHeaders = [
'x-bz-content-sha1',
'x-bz-file-id',
'x-bz-file-name',
'x-bz-info-src_last_modified_millis',
'X-Bz-Upload-Timestamp',
'Expires'
];
const expiration = 31536000; // override browser cache for images - 1 year
// define a function we can re-use to fix headers
const fixHeaders = function(url, status, headers){
let newHdrs = new Headers(headers);
// add basic cors headers for images
if(corsFileTypes.includes(url.pathname.split('.').pop())){
newHdrs.set('Access-Control-Allow-Origin', '*');
}
// override browser cache for files when 200
if(status === 200){
newHdrs.set('Cache-Control', "public, max-age=" + expiration);
}else{
// only cache other things for 5 minutes
newHdrs.set('Cache-Control', 'public, max-age=300');
}
// set ETag for efficient caching where possible
const ETag = newHdrs.get('x-bz-content-sha1') || newHdrs.get('x-bz-info-src_last_modified_millis') || newHdrs.get('x-bz-file-id');
if(ETag){
newHdrs.set('ETag', ETag);
}
// remove unnecessary headers
removeHeaders.forEach(header => {
newHdrs.delete(header);
});
return newHdrs;
};
async function fileReq(event){
const cache = caches.default; // Cloudflare edge caching
const url = new URL(event.request.url);
if(url.host === b2Domain && !url.pathname.startsWith(b2UrlPath)){
url.pathname = b2UrlPath + url.pathname;
}
let response = await cache.match(url); // try to find match for this request in the edge cache
if(response){
// use cache found on Cloudflare edge. Set X-Worker-Cache header for helpful debug
let newHdrs = fixHeaders(url, response.status, response.headers);
newHdrs.set('X-Worker-Cache', "true");
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHdrs
});
}
// no cache, fetch image, apply Cloudflare lossless compression
response = await fetch(url, {cf: {polish: "lossless"}});
let newHdrs = fixHeaders(url, response.status, response.headers);
if(response.status === 200){
response = new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHdrs
});
}else{
response = new Response('File not found!', { status: 404 })
}
event.waitUntil(cache.put(url, response.clone()));
return response;
}
使用前,注意修改 b2Domain 和 b2Bucket 这两个变量的值.
b2Domain,是你图床的二级域名,比如本站就是img.typeboom.club。
b2Bucket,是你的 bucket 存储桶的名字。
保存
退出编辑器,点击“添加路由”
路由填入你图床域名,Worker选择你刚刚创建的
防盗链
打开Scrape Shield,将Hotlink 保护设置为开即可
正式使用
在backblaze B2的文件管理器上传文件后,打开友好链接,将域名更换为自己的域名,再删除桶名称即可
其实这个不止可以上传图片,还能串流视频,制作下载站,流量费用可以无视,这两家服务商都加入了宽带联盟,互通所产生的流量免费