Skip to content

为博客搭建免费图床

Published: at 12:00 AMSuggest Changes

我在自建博客二三事中,介绍了我的博客的搭建方案:Astro构建+AstroPaper主题+Cloudflare Pages部署。这个方案是纯静态的,包括图片和博客的markdown文件,和网站代码都放在一个git仓库中。对于大多数写博客的人来说,这个方案已经足够好用了,这次考虑自建图床主要是基于以下几个原因:

现在免费的图床服务都不太靠谱,要么是不知道啥时候就倒闭了,要么是有诸多限制,还有的在国内访问速度极慢,唯一可靠一点的可能就是github issues了,但是这玩意使用起来极为麻烦,而且个人感觉是对issues的一种滥用。考虑再三,还是决定自建图床,一劳永逸。本着能白嫖绝不掏钱的原则,用的都是免费的方案,并且图床访问快速+容量够用+稳定可靠,下面就介绍一下我的方案选型和实现步骤。

图片存储 Cloudflare R2

存图片可以在自己的服务器上搭建存储服务或者使用云存储,考虑到买服务器需要一笔不少的支出,加上自建的存储服务稳定性不好保证,所以还是决定使用云存储服务。调研了一圈发现“赛博菩萨”CloudflareR2存储是所有云存储服务中免费额度最大的,10GB的存储空间对个人用户来说绰绰有余,就决定用它了。另外,如果觉得Cloudflare后台打开慢,不好用,国内的七牛云也可以试下,也是10GB的存储,不过对请求量有一些限制。

使用R2搭建图床,首先创建一个存储桶,然后在$设置$->$公开访问$里面可以给存储桶设置访问域名。自定义域需要将你的域名交给Cloudflare托管,我之前试过将域名托管在Cloudflare上,但是网站的访问速度并没有加快,反而偶尔还会变慢,所以后来就删掉了。我的域名是在阿里云买的,感觉在国内阿里云的CDN还是比较快的。这里可以直接使用R2自带的域名,即R2.dev子域,点击允许访问,然后输入allow即可。 allow

到这一步,其实图床的基本功能已经有了,可以在Cloudflare后台上传图片,然后通过r2.dev子域访问图片,零成本且简单好用。 但是,目前这个图床只是能用,我们还可以让它更好用一些,对于我来说,还有一下几个功能想要实现:

  1. 使用我自己的域名访问图片。
  2. 对图床做备份
  3. 上传图片要更方便一些。
  4. 对图床中的图片进行压缩。

图片压缩 WebP Cloud

我最开始是想配置CNAME解析的方式让自己的域名可以转发到r2.dev,结果发现行不通,被Cloudflare禁止了。然后因为我的域名没有备案,所以也不允许重定向,只能另想他法。

正好我也在考虑用WebP Cloud对图片进行优化,它是通过代理原图片域名的方式实现的。所以就想能不能让WebP Cloud先对r2.dev进行代理,我在用自己的域名解析到WebP Cloud的域名,试了一下果然可行。 首先在 WebP Cloud 后台创建代理,源站地址填入存储桶的r2.dev域名: proxy

创建完代理,会给我们自动分配一个webp.li域名,通过这个域名访问图片就可以加速了。然而现在有一个问题,假如有一天WebP CLoud倒闭了或者因为某种原因我不想用它了,那么我文章中所有webp.li的图片都无法访问了。即使我把图片迁移到了新的存储服务,换上了新的域名,之前老文章中的图片地址也必须修改一遍。况且我还打算把文章发布到多个平台,显然对我来说,改图片域名是一项很难完成的工作。那么,为了避免这种情况发生,我就必须保证图片的域名不会发生改变。不管图片的存储方案怎么变化,最终嵌入博客中的地址,永远都是不变的。正好,WebP Cloud 提供了自定义域名的功能,我只需将自己的域名配置上去,以后图片存储服务变了,我也只需重新配置一次域名解析即可。

WebP Cloud自定义域名也很简单,打开刚才配置的代理,可以看到自定义域名选项: domain 根据提示进行配置。 setting 等待状态变为ready,点击Active即可。 active

传图工具PicGo

现在图片访问已经很方便了,但是上传图片还比较麻烦,每次都登录Cloudflare后台,找到R2存储桶再进行上传。我们可以使用PicGo简化一下上传流程,可以去官网下载对应平台的客户端。PicGo本身不支持上传R2,但是它可以通过安装插件支持S3协议,而R2也提供了支持S3协议的Api。首先去R2后台创建一个API令牌, token 创建完之后需要记住下面这几个密钥值,等会需要填到PicGo里面。 key 接着打开PicGo的插件设置,搜索并安装s3插件: s3 接着在图床设置中选择Amazon S3,将刚才生成的R2密钥值填入配置里面,就可以使用PicGo上传图片到R2了。 upload 设置好自定义域名,还可以在图片上传成功之后,自动将图片的网络地址保存到粘贴板。

图片备份 OneDrive

前面说过,任何图床都不是100%安全的,即使是自建图床,也是使用了R2作为云存储服务,如果R2除了故障,也会对我的数据造成不可挽回的损失。因此,对于重要的数据还是要做好备份,以防万一。我选择的是OneDrive,因为它使用起来非常简单,我本来就已经把OneDrive挂载到本地磁盘了,只需要把上传图床的文件统一放到OneDrive目录下即可。

这样,我的图片就在本地+OneDrive云端+R2各存了一份,即使一个地方出现问题,也可以从另外两个地方进行恢复。

后续规划

目前为止,我搭建的图床主要使用了R2做存储+WebP Cloud做代理和压缩+PicGo做上传和管理,功能已经比较完善了。但是还有一些可以优化的地方,比如WebP Cloud压缩图片是通过代理的方式,也就是说,R2当中存储的原图片是没有压缩的。我的想法是,既然我的图床当中存储的大多是一些为了辅助文字说明的截图,对图片的清晰度要求很低。那么,要是能在上传R2之前就对原图片进行压缩,这样不仅能提升图片访问速度,还能节省R2和OneDrive的存储空间。

我搜了一下PicGo的压缩图片插件,居然没有一个能直接安装成功的。正好我也有一些定制化的需求,索性就自己开发一个吧。我的计划是使用ImageMagick来实现一个本地的压缩插件,可以灵活地配置压缩参数。 另外,PicGode的相册我觉得太简单了,也打算写个插件优化一下,首先就要实现图片按目录来展示,而不是所有图片都平铺在一起。


Previous Post
在Windows上搭建开发环境
Next Post
自建博客二三事