gobackup 自动将 MySQL 数据库备份到七牛云私有空间之二,线上部署

文章目录

    继续前文 使用 gobackup 自动将 MySQL 数据库备份到七牛云私有空间,在本地测试了 gobackup 的基本功能之后,今天在几台线上服务器,包括阿里云和腾讯云的各种服务器,依次部署了 gobackup 备份服务。这里记录一下一些踩坑的地方。

    消息通知设置

    用 163 邮箱设置了邮件通知,测试失败日志如下:

    2025/10/27 09:32:58 [Notifier] Running 1 Notifiers
    2025/10/27 09:33:18 [Notifier] EOF
    

    从 github issue 看,似乎是不支持 TLS:

    When send mail via port 465, the error EOF will occur.

    https://github.com/gobackup/gobackup/pull/288

    对提交看是支持了的,但是我测试了几次,都是 EOF 错误。

    所以,我决定,还是换成 webhook 方式吧,我在自己服务器上写一个接收接口,然后在自己的服务器上发邮件通知。

    Webhook 通知实现

    https://gobackup.github.io/configuration/notifiers/webhook

    只需要处理 gobackup 发过来的 json 数据即可,格式如下:

    {
      "title": "This is title",
      "message": "This is message"
    }
    

    果然,改成 webhook 方式后,测试成功了。邮件格式如下图:

    gobackup 邮件截图

    但是,如果每天备份成功都发邮件的话,未免太多了。

    The on_success, on_failure option (default: true) for toggle when backup has been successfully or failed.

    可以独立设置成功和失败的通知开关:

    on_success: true
    on_failure: true
    

    还是都开启吧。我担心如果真失败了,而且邮件服务也出问题了,那就麻烦了。

    线上新建一个七牛云私有空间

    专门用于存储数据库备份文件,并且不允许外部访问下载。选了个离我最近的机房,对应的 region id:

    • 华东-浙江 cn-east-1
    • 华东-浙江2 cn-east-2

    不能给独立的空间设置 access key 和 secret key,这个地方的体验不太好。

    yaml 的注释语法

    yaml 的注释是用 # 符号开头的,后面的内容都会被忽略掉。

    可以方便的在配置文件中添加注释,解释每个配置项的作用和用法。或者存档一些废弃的配置项,以备后续参考。

    配置文件放哪里

    两个位置任选其一,如下:

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

    感觉第一种更方便一点。毕竟也用不到 root 权限,直接使用非 root 用户即可。

    注意需要把文件权限修改,防止其他用户读取:

    chmod 600 gobackup.yml
    

    安装 gobackup

    将本地的 gobackup 可执行文件 scp 上传到服务器上即可。

    做成 Makefile 任务更方便一些。

    .PHONY: deploy_gobackup
    deploy_gobackup:
    	scp -P $(SSH_PORT) /usr/local/bin/gobackup $(SERVER_USER)@$(SERVER_HOST):~/
    

    然后登录服务器,移动到 /usr/local/bin 目录下即可。

    sudo mv gobackup /usr/local/bin/
    

    确认

    $ which gobackup
    /usr/local/bin/gobackup
    

    mysql 单实例多个数据库的配置

    参考:

    https://github.com/gobackup/gobackup/issues/193

    my_db_default: &my_db_default
      type: mysql
      host: localhost
      port: 3306
      username: root
      password: root
      args: --single-transaction --quick
    
    models:
      my_app:
        databases:
          my_db1:
            <<: *my_db_default
            database: my_db1
          my_db2:
            <<: *my_db_default
            database: my_db2
          my_db3:
            <<: *my_db_default
            database: my_db3
    

    yaml 的配置还是太灵活了,怪不得 rasa 也是用的 yaml 配置。

    禁用 Web 功能

    https://gobackup.github.io/configuration#webconfig

    没有禁用 web 功能,所以,干脆设置一个非常复杂的账号和密码吧。

    同时阿里云的防火墙也阻止了 2703 端口的访问。

    甚至直接不用 gobackup start 服务,改成 crontab 系统定时任务。

    先放到系统计划任务里跑着

    crontab -e
    

    每天凌晨 0 点跑一次:

    0 0 * * * /usr/local/bin/gobackup perform >> ~/.gobackup/gobackup.log
    

    crontab 没有执行,如何排查

    Ubuntu 系统下,可以查看系统日志:

    less /var/log/syslog
    

    搜索 cron

    Oct 27 14:41:01 localhost CRON[2698]: (ubuntu) CMD (/usr/local/bin/gobackup perform >> ~/.gobackup/gobackup.log)
    

    看到 gobackup 的执行日志:

    2025/10/27 14:41:01 [Config] Load config from default path.
    2025/10/27 14:41:01 [Config] Load gobackup config failed: While parsing config: yaml: control characters are not allowed
    2025/10/27 14:41:01 [Config] While parsing config: yaml: control characters are not allowed
    

    这个问题,很诡异,发现 yaml 配置文件并没有任何问题。改成 root 用户的 crontab 后,就可以正常执行了。
    看起来并不是权限的问题。而且不同用户的加载目录不同,而非 root 用户的目录下有一个我没有删除的 gobackup 可执行文件,
    估计是把这个文件当成配置文件去加载了,导致报错。删除掉这个文件后,就可以正常执行了。

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式