编程 用 gobackup 替代 Ruby backup:应用服务器的定时备份

2026-10-02 21:31:13

用 gobackup 替代 Ruby backup:应用服务器的定时备份

项目地址:https://github.com/gobackup/gobackup ,文档:https://gobackup.github.io

它解决什么问题

应用服务器上跑着数据库和一堆文件,需要每天定时备份到外部对象存储。Ruby 的 backup/backup 能做这件事,但要在每台机器上装 Ruby 环境和一堆 gem。gobackup 用 Go 重写了同样的模型:单个二进制、无运行时依赖,配好一个 YAML 之后可以放几年不用管。

Ruby China 的应用服务器从 2017 年起就用这套方式做每日全量备份,落到阿里云 OSS,开了回收机制(文件保留 1 个月)之后,每月存储成本约 0.2 RMB。

主要能力:

  • 单二进制,无依赖
  • 多种数据库源、多种存储类型
  • 把路径或文件打包成 tar
  • 大备份文件可切分成多份
  • 可作守护进程定时备份
  • 带 Web UI 管理备份

安装

curl -sSL https://gobackup.github.io/install | sh

安装后得到 /usr/local/bin/gobackup。macOS 也可以用 Homebrew:

brew install gobackup

CLI 命令有 perform、start(作守护进程启动)、run、help;全局选项 --help、--version。

配置文件按以下路径查找:

  • ~/.gobackup/gobackup.yml
  • /etc/gobackup/gobackup.yml

一份完整的 gobackup.yml

配置主体是 models,每个 model 下面挂 databases、storages、compress_with 三段。

models:
gitlab_app:
databases:
gitlab_db:
type: postgresql
database: gitlab_production
username: gitlab
password:
gitlab_redis:
type: redis
mode: sync
rdb_path: /var/db/redis/dump.rdb
invoke_save: true
storages:
s3:
type: s3
bucket: my_app_backup
region: us-east-1
path: backups
access_key_id: $S3_ACCESS_KEY_Id
secret_access_key: $S3_SECRET_ACCESS_KEY
compress_with:
type: tgz

逐段看:

databases 里列出要备份的源,每个源一个名字。上面这个 model 备两个库:gitlab_db 是 PostgreSQL,指定了库名和用户名;gitlab_redis 用 redis 的 sync 模式,直接读 rdb_path 指向的 dump 文件,invoke_save: true 表示备份前先触发一次 save。

storages 是备份的落点,这里用 S3,给出 bucket、region 和存储路径前缀 backups,凭证用环境变量引用,避免明文写进配置文件。

compress_with 指定压缩方式,示例是 tgz。备份文件会先压缩再上传,这也是它成本低的一个原因。

perform / start / run

手动跑一次:

gobackup perform

定时备份用内置守护进程:

gobackup start

调度的粒度可以按 model 配。两种写法:cron 表达式,或者 every + at。例如每周日 04:05:

schedule:
cron: "5 4 * * sun"

等价的天级写法:

schedule:
every: "1day"
at: "04:05"

另外每个 model 还支持 before_script / after_script 钩子,用来在备份前后跑脚本。

如果只想跑调度、不要守护进程附带的其他东西,用:

gobackup run

Web UI 与信号

gobackup start 起来之后会同时起一个 HTTP 服务,监听 http://127.0.0.1:2703,可以在浏览器里管理备份、查看执行情况。

信号:

  • HUP:热重载配置,改完 YAML 不用重启进程
kill -HUP

  • QUIT:优雅退出
kill -QUIT

支持的数据库与存储

数据库:MySQL、PostgreSQL、Redis、MongoDB、SQLite、Microsoft SQL Server、InfluxDB、MariaDB、etcd、Firebird。

存储:Local、FTP、SFTP、SCP(SSH copy 上传)、Amazon S3、阿里云 OSS、Google Cloud Storage、Azure Blob、Backblaze B2、Cloudflare R2、DigitalOcean Spaces、腾讯云 COS、UCloud US3、七牛 Kodo、百度 BOS、MinIO、华为 OBS、火山引擎 TOS、又拍云 UpYun、WebDAV。

1.5.0 起支持通知,备份成功或失败时发出,渠道包括 Mail(SMTP)、Webhook、Discord、Slack、飞书、钉钉、GitHub(在 Issue 评论)、Telegram、AWS SES、Postmark、SendGrid。

取舍

单二进制无依赖是它最直接的好处:新机器上 curl | sh 一条命令就位,不用为了备份在每台应用服务器上维护 Ruby 环境。代价是功能边界基本固定在配置文件描述的范围内,要做更复杂的备份编排得靠 before_script / after_script 自己补。

成本和压缩、回收直接相关:compress_with 决定上传体积,存储侧的文件回收周期决定长期占用,前面提到的每月 0.2 RMB 就是在开了 1 个月回收之后的结果。回收周期调长,成本会随之上去。

许可证 MIT。

复制全文 生成海报 gobackup 备份 运维 Go 对象存储 数据库

推荐文章

程序员茄子在线接单