使用C2 Object Storage作为图床

C2 Object Storage是群晖提供的云存储服务,有15G/月的免费额度(存储空间与流量),付费计划也相当实惠,大陆地区可直接访问北美和欧洲两个数据中心,实测下载速度可达5M/s左右,这两个数据中心的额度是彼此独立的,如果你拥有群晖账号,则可以一键开通C2并在这两个区域任意切换,Synology 知识中心-C2 Object Storage可以找到有关安装与使用的说明。

C2 Object Storage兼容大部分S3 API,在我看来,比较大的缺憾是不支持网站设定(文件直链,即链接域名不可自定义,并且是动态生成的:以Endpoint+有效期签名的形式)和CORS(跨站资源共享),不过,有办法解决这些问题,至少作为图床来说是足够的。

这得益于Alist这款开源文件列表托管程序,它可以将阿里云盘、OneDrive、蓝奏云、FTP、AWS S3、WebDAV、百度网盘、夸克网盘、一刻相册等个人网盘、对象存储服务OSS转为Web目录和WebDAV,并支持将其中的文件跨域直链,前提是你拥有一台24小时运行的服务器,并用Docker的方式部署它,部署的教程参考官方文档即可。

主要说说用alist 作图床的好处:

  1. 支持多个存储库,包括AWS S3、七牛云等,甚至包括不支持外链的阿里云盘、百度云盘,可将里面的文件转为固定直链,无需账号密码,直接访问。
  2. 虚拟路径:同一个图床备份到多个存储库,万一C2存储库不能用了(如流量耗尽),不需要替换图片链接,只需要在alist修改并替换C2的虚拟路径即可。
  3. 负载均衡:例如将图片同步上传到多个存储库(最好不要直接同步,而是另外上传到指定存储库,以免浪费C2流量),直链请求会随机解析到不同的存储库下载(有别于posix分布式文件系统,文件还是在各自的网盘中保存的,因此需要有相同的目录结构)。

缺点和踩坑点:

  1. C2文件上传之后不支持重命名。
  2. alist不是真正的直链,它的直链是交给alist解析的,然后获取对应存储库的Endpoint+签名的链接。也就是说尽管图片数据是从存储库直接下载不需要经过alist服务器,但在这之前需要先将链接回源到alist解析并进行302跳转。
  3. 也因此,用alist作图床的结果是比一般图床更慢的响应,当然下载速度还可以。
  4. v3版alsit相比v2版的改动之处是:可以给v2版的图床所在文件夹加密码访问,不影响直链,而v3版对文件夹加密后会对直链+sign(v3版本如何配置直链 · Discussion #1688 · alist-org/alist (github.com)),因此需要在AList 管理-元信息中单独配置图床文件夹为无密码访问的形式。

案例:用作Ghost博客的图床

由于我是在Obsidian编辑Markdown文章然后再复制到Ghost发布的,有一个需求:如何让图片在Obsidian中编辑时显示在本地又可以在发布到Ghost时不需修改链接即可直接显示网页上?

这里有可以取巧的地方:

  1. 在Ghost后台设置重定向:
  • Setting→Labs→Redirects→Download current redirects,增加两行:
    301:
      ^\/file\/([\s\S]+)\/$: https://your_alist_domain/d/pics/$1
    
  • your_alist_domain改成你的alist服务器域名,修改后上传到设置:Upload redirects YAML/JSON
  • 这表示在你的博客中访问/file/*的路径会被重定向你的alist存储库pics文件夹下的对应文件直链,例如https://blog.example.com/file/1.jpg自动重定向到https://alist.example.com/d/file/1.jpg
  1. 在Obsidian仓库新建文件夹file,启用Obsidian与alist存储库之间的文件同步(同步的方式有很多,这里不赘述)。

  2. 设置Obsidian附件文件夹路径为file,内部链接类型为基于仓库根目录的绝对路径,这样外部图片拖动到Obsidian编辑窗口时文件自动存到仓库根目录下的file文件夹并在编辑器光标位置插入图片相对仓库根目录的路径。

  1. 注意要在file前手动加上根路径标识符/,如![](file/1.png)改为![](/file/1.png)
  2. 如果是照片,建议先压缩和去除元数据再粘贴到Obsidian。

这样一来,文章在Obsidian中为本地图片,可以备份和全平台同步,而发布到博客后又自动转为alist图床中的图片,优点是方便,缺点是图片在博文中经过两次回源和重定向,大大的增加了响应时间,如果你不十分在意这点的话。