开源自用数据库备份服务

之前在博客迁移到 Hexo 里面提到过「会把自己折腾过的东西的稳定版开源」,这次来填一个坑:Database Backup Service Daily(每日数据库备份服务)

这个服务设计是用于数据库备份,自动每天凌晨备份一次,并且将备份文件作为邮件附件发送到你的邮箱,实现 0 成本备份,并且对现有服务无侵入,也没有额外依赖,只要能连接上你的数据库即可。

总所周知数据备份一直都是服务中很重要的一环,无奈时间有限,所以一直没有好好整理下,这次趁着自建 RSS 也需要数据备份的契机,一并整理开源了。

因为之前的 Typecho 博客是基于 Docker 架构的(见博客迁移到 Docker),所以这个服务的设计也是基于 Docker 的,如果你的数据库不是 Docker 的也能用,但是 Docker 是趋势,自建服务的人一般都是动手能力很强的人,迁移下完全不是问题 🪄。

最开始的版本是自己用 Shell 脚本实现的,自己造的轮子也不完善,经常出现一些边界 Case 很头疼,稳定性不可靠,后面直接用现有开源的组建搭建了一套。

语言实现是 PHP 的,最开始自建的服务都没用 Docker,为了尽可能复用已有环境,所以选择了 PHP,从社区和稳定性的角度选择了 Laravel 作为框架。

后面服务全 Docker 化后遇到了问题:服务建设的比较早用的是 Laravel 5,有些组件不支持 PHP 7.4,而我比较追新,所以直接魔改了一下,强上了 PHP 7.4,这极大提高我后面开源的成本,不过好在当时没啥问题,一直跑到我迁移到 Hexo 已经用了几年了,稳定性很可靠,之前发到 Gmail 邮箱后面发现 QQ 邮箱其实体验更好:自动扩容、自带微信提醒、设定自动归档规则,完全不操心👍 。

mail-archive-list

本次开源遇到的最大一个问题就是版本升级问题,耗费了大部分的时间和精力,主要是 Backup ManagerBackup Manager Laravel 组件很明显弃坑了😞!

不支持 PHP8 并且也不处理社区的 PR,所以当时魔改勉强能上 PHP7.4,现在要上 PHP8 的话服务稳定性根本无法保障。

还有 Laravel 也已经更新到 8 了,我之前的版本还是 5,升级到 6 和 7 都有不少的改动。

所以这次开源的服务其实是我全新重写的:支持 PHP 8(用上了 JIT)、Laravel 8、用到的组件也是自己 fork 修改的一份🤯。

为了保证开源质量,测试了 PostgreSQL 和 MySQL,还测试了最新的 PostgreSQL 14(2021-09-30 发布),因为社区响应还没那么快,Alpine 的组件还没更新,最新版本也只是 RC,所以本次示例的稳定性版本限定为 postgres:13-alpine

postgres-alpine-version

PostgreSQL 生态对版本要求很严格,版本对应不上就不让用:

pg_dump: error: server version: 14.0; pg_dump version: 13.4
pg_dump: error: aborting because of server version mismatch

版本升降级也不像想象中那么简单:

The data directory was initialized by PostgreSQL version 14, which is not compatible with this version 13.4

当然每次开源也有收获:了解了社区新的动态,有机会总结之前的经验,缓解拖延焦虑 … 👻