博客的图片如果存储在本地,那么博客将会越来越臃肿,于是还是转回使用图床。免费图床不知道什么时候就用不了了,还是自建比较稳妥,至少能够自己把控。
为什么不在服务器上用minio之类的方案进行搭建,而是额外购买对象存储?因为服务器比较贵,说不定什么时候就不续费了,不想将太多东西绑在上面,对象存储则比较便宜,要是服务器不续租了图床也能继续用。算是一种"解耦"吧。而且服务器性能也有限,不想分出性能给图床。
原本想使用"轻量对象存储"的,但一看功能有点简陋,还是选好一些的吧,不弄轻量的,应该也贵不了多少。
本文将使用腾讯云对象存储搭建一个图床,并配置Obsidian和PicGo实现便利的上传图片功能。
有了自己的图床后,终于不必在写博客的时候担心图片怎么存储了,可以放心地插图。
添加子账号
主要参考官方文档:对象存储 使用 PicGo+Typora+COS 搭建图床服务-实践教程-文档中心-腾讯云
添加子账号是为了进行key的权限管理,如果直接用主账号的key,被攻击了就完蛋了。
添加子账号官方文档说得比较清楚,这里就不赘述了。
登录子账号之后在密钥管理页面获取如下信息:
- Secretld:开发者拥有的项目身份识别 ID,用于身份认证
- SecretKey:开发者拥有的项目身份密钥
- AppId:开发者访问 COS 服务时拥有的用户维度唯一资源标识,用以标识资源
其中,SecretKey只有在创建密钥的时候才能看到,需要自行保存下来。
创建存储桶
存储桶的官方介绍:对象存储 存储桶概述-开发者指南-文档中心-腾讯云
存储桶(Bucket) 是对象的载体,可理解为存放对象的"容器",且该"容器"无容量上限。对象以扁平化结构存放在存储桶中,无文件夹和目录的概念,用户可选择将对象存放到单个或多个存储桶中。
而对象就是我们要上传的图片文件。
我新建了一个名为"image-host-自动生成的数字串"的存储桶,用来当做图床,同理,还可以创建其他的存储桶用于别的应用,比如同步思源笔记的数据等。
一些设置:
- 所属地域: 我选择了存放博客的服务器的所属地域
- 多AZ(Availability Zone): 简单来说就是花更多钱多地容灾,让你的数据更安全,且开启后无法关闭,一开始就得想好要不要选。我就不开启了,图床里面也不是特别重要的数据,省点钱,相信腾讯云的基础容灾能力。
- 访问权限: 这里一开始我是选了私有读写,不过后来改为了公有读私有写,这样才能让博客读者能够看到图片。告警策略和防盗链之类的配置记得创建好之后要开,具体看官方文档,这里不赘述。
- 版本控制: 作为图床,不需要修改图片,所以就不开版本控制,省存储空间。
- 极智压缩: 这个开了是用于节约下行流量的,也就是存储的是原图,但是别人看你图片的时候是压缩后的,节约了流量费用。当然也可以在上传时压缩,节约上传费用。
自定义域名
这个时候要访问里面的图片还是得使用指定的一长串域名,而且"2024年1月1日后创建的桶不支持使用默认域名在浏览器预览文件",直接在浏览器访问会下载图片而不是预览图片。因此需要自定义源站域名。
在桶管理页面的"域名与传输管理"里找到"自定义源站域名",可以绑定已经备案的域名。
我绑定了博客站点域名的子域名images,接着去额外申请了这个子域名的SSL免费证书。
需要注意的是,你绑定完之后,还需要手动去DNS服务商(在这里是腾讯云)那里配置一个CNAME记录,指向此处显示的域名。否则仍然会解析失败,显示一个红色感叹号:"当前链路下未检测到该域名的CNAME记录"。
配置PicGo
PicGo是一款支持多种云存储配置、快捷生成图片链接的工具。
将前面的信息都填进去,参考官方文档:
- COS 版本: 选择 COS v5。
- 设定 Secretld: 开发者拥有的项目身份识别 ID,用于身份认证,可在 API 密钥管理 页面中创建和获取。
- 设定 SecretKey: 开发者拥有的项目身份密钥,可在 API 密钥管理 页面获取。
- 设定 Bucket: 存储桶,COS 中用于存储数据的容器。有关存储桶的进一步说明,请参见 存储桶概述 文档。
- 设定 AppId: 开发者访问 COS 服务时拥有的用户维度唯一资源标识,用以标识资源,可在 API 密钥管理 页面获取。
- 设定存储区域: 存储桶所属地域信息,枚举值可参见 可用地域 文档,例如 ap-beijing、ap-hongkong、eu-frankfurt 等。
- 设定存储路径: 图片存放到 COS 存储桶中的路径。
- 设定自定义域名: 可选,若您为上方的存储空间配置了自定义源站域名,则可填写。相关介绍可参见 开启自定义源站域名。
- 设定网址后缀: 通过在网址后缀添加 COS 数据处理参数实现图片压缩、裁剪、格式转换等操作,相关介绍可参见 图片处理。
这里说的存储路径,是图片上传后图片在存储桶内的文件路径。
你可能会问,对象存储不是没有文件夹的吗?这个是为了让习惯了文件系统的用户更方便使用而加的,实际上并没有文件夹,我猜想实现方式是将同一个前缀的对象以文件夹的格式显示,或是存储了文件夹名作为对象的元数据。
用子域名来区分图床和博客站之后,就没什么必要建一个images目录来区分了。存储桶的根目录下新建名为"2025"的文件夹,按照年份来管理上传的图片,每年手动改一下上传目录就行。
为了避免重名图片覆盖掉已有的图片,设置为使用时间戳重命名图片。
图片压缩
博客中大多数图片都不需要很高的清晰度,只是用来展示大致操作、布局或样式,因此为了节约流量费用和存储费用,就需要将其压缩。
不过创建存储桶时选择的图片"极智压缩"和我想象得不太一样,我以为是上传前压缩好,存储的是压缩后的图片,没想到是查看时压缩,节约的是流量而不是存储费用。
看了文档之后得知也有上传时压缩,不过需要在请求体里面加参数,picgo在2.4.0-beta.4开始支持极智压缩的配置,但实际使用中图片并没有被压缩,只是加了个已经可以被省略掉的参数。得找个别的办法。
图床杂谈:PicGo 安装图片压缩插件,减少图床原图大小 | zi4dbek 的小站
安装插件商店中的compress插件后,选用imagemin本地压缩,可以把1.39MB压缩成251.67KB,不错。
但需要注意的是,安装之后需要在插件设置里面手动启用transformer-compress,才会在上传后进行压缩操作。
Obsidian插件
我用于写博客的是obsidian这款笔记软件,它有个利用picgo来上传图片的插件Image Auto Upload Plugin。参见:Obsidian中图床自动上传设置-使用PicGo - 知乎
安装好插件之后,只要开着PicGo,就可以实现粘贴的同时上传到COS了。