起因是那块一直变小的盘
我这台服务器不是只放了一个博客。
上面跑着博客本身和它的数据库,还有一层反向代理在门口转发;再往里有远程桌面的中转服务、一个给自己存密码的小库、一个我自己写的小工具,以及一个专门用来推消息的服务。都是不起眼的小东西,但每一个都在占地方,也都在被我自己用着。
我还一直想往上面加东西——研究学习要用的工具、想跑起来试试的服务、临时搭的应用。每次想到"装个什么试试",第一反应都是先看盘还剩多少。
那天清东西时候点了下附件库,发现里面躺着十三张图,加起来五兆多。
这个总数会骗人。它之所以只有五兆,是因为那批图本来就是压过的网页小图。真正让我警惕的是单张:我自己往文章里插的图,长截图、相机原图、模型生成的高清底图,一张就是五兆、十兆。我手里那些两三千像素的方形封面底图,一张四五个兆是常态。一篇放三张,二十篇就是一百多兆——这还没算我以后想越写越多。
而这个目录只会长,不会自己缩。我往文章里插图,图就落进博客自己的存储,跟我写多少篇文章正相关。盘总共四十个 G,已经用掉一半多,写得越多,留给后面那些想装的东西就越少。
真正让我动手的是后来看到的机制——这套博客系统里,"图库"和"附件"是两个东西。
附件是实体文件,存在服务器自己的盘上,一个文件一份体积。而图库里的条目,本质上只是一条记录:标题、分组、一个图片地址。地址可以指向任何地方,包括别人的对象存储。也就是说,图库完全可以只存链接,一张图都不占我自己的盘。
那就好办了:把图搬到一个专门放图的地方去。

搬之前,先把"谁还在用"查清楚
这件事最容易翻车的地方不是搬,是搬完删。图一旦被引用而你没查到,删掉就是个 404。
所以我做的是四查,一项一项来,全部只读:
文章正文里有没有引用,翻一遍所有文章的原文档;单页(就是"关于""留言"这类独立页面)里有没有;图库自己以前有没有存过同一张;最后再抓一次首页的 HTML,数里面出现过多少次上传目录的路径。
前三项都是零。首页也是零。
到这里我以为可以放心删了。结果漏了第五项,也是最不该漏的一项:我自己的头像。
头像不走文章正文,它挂在用户资料里,一个独立的字段。我是在准备删的前一秒想起来翻了一下资料接口,才看到那个头像地址正指向附件目录里的一张图。
如果当时手快删了,站是能打开的,文章也是好的,只有右上角那个人像变成一个破图标。这种问题最要命——因为它不会报错,也不会有人告诉你,得自己发现。
顺带说一句,站点 logo 和 favicon 这类设置,那个接口查不到(返回没权限)。所以我的处理是:这类图一律不删,留着,宁可多占一点。
搬的动作其实很简单
原图逐张下载下来,中文名的要先转义一下,不然下载会落到一个奇怪的文件名;再统一改成英文名,因为图床那边对中文名的对象,第一次访问很容易吃到缓存里的 404。
然后传到对象存储的一个前缀下,比如 image/halo-attach/,图床换成自己的公开域名。每张传完都验一次状态码,全部 200 才算过——注意是传完之后再验,不能传之前先探一下地址,那一下探测产生的 404 也会被缓存住,之后图明明传上去了,打开还是 404,能气死人。
接着在博客后台建一个图库分组,叫「旧附件迁移」,把这十三张按"外链"的形式挂进去。每条只填标题和地址,图本体留在对象存储那边。
最后才是删附件。逐张删最省事,用接口删要注意版本号——系统会给每张图生成缩略图,版本号早就从 0 推到 2、3 了,拿 0 去删会被拒。

传之前顺手压一遍
图搬出去还有个小好处:我可以在传之前统一压一道。
网页配图两百来 KB 就够看,肉眼几乎分不出它和十兆原图的区别,手机上打开也快得多。原图我留在本地那块,真要做印刷级的东西再单独拿——反正博客不需要。
以前图是直接丢给博客的,压缩这一步根本不存在,传上去多少就是多少,读者用手机流量打开一篇文章,实际上是在下载几个十兆。
搬完得到什么
服务器上少了五兆多,这个数字确实不起眼,我不打算把它说成什么转折点。真正省下来的不是这五兆,是后面每一张十兆的图——它们从此不再落在这台机器上。
值的是另一件事:这块盘从此分成了两份用途。程序归程序,图归图。博客、数据库、反向代理、远程桌面那类服务,以及我后面要装的东西,挤在这台机器上;图片去另一块专门放图的地方,有它自己的地址和容量,不再参与这台机器的算术。
也因为这样,盘终于有了"预留"的余地。我后面想装的东西已经排着队——研究学习要用的工具、想跑起来试试的服务、临时搭的应用。以前每装一个之前都得先算还剩多少,删点这个腾点那个;现在至少图的增长不在这场算术里了。
而且图片有了自己的公开地址,正文里直接嵌链接就行,不经过博客的存储。图库那边也还是能看到的,只是条目从"文件"变成了"链接"——在后台看起来几乎没有区别。
现在回头看,这次最值钱的部分不是搬,是那张"谁还在用"的清单。搬图是一次性的活,清单是可以复用的方法:先证明没有引用,再动手删。顺序反了,代价就是某个页面安静地坏掉,而你可能要过一个月才发现。
清单我也留了一份,两端的备份目录里都有,写明了每张图的原名、新地址和那句"哪张仍被引用"。以后要回溯,看这一张表就够了。