开源项目 GoBackup - 自动化服务器备份工具

huacnlee · 2017年09月11日 · 最后由 stephen 回复于 2024年01月23日 · 13724 次阅读

之前,我曾经写过一片《Backup - 备份你的服务器环境

同时 Ruby China 以及一些其他的场景我也在持续用它备份我需要维护的服务器,但是,久了你回发现,部署 Backup 其实很麻烦,运行也会因为 Ruby 的版本迭代导致一些小问题。

于是我想着用 Go 来写一个类似的东西,简化备份这件事情。


GoBackup 是一个类似 backup/backup 的一站式备份工具,为中小型服务器/个人服务器而设计,配合 Crontab 以实现定时备份的目的。

使用 GoBackup 你可以通过一个简单的配置文件,一次(执行一个命令)将服务器上重要的(数据库、配置文件)东西导出、打包压缩,并备份到指定目的地(如:本地路径、FTP、云存储...)。

项目地址

https://gobackup.github.io

功能特点

  • 一键式自动化备份,简化繁琐备份工作。
  • 简单无依赖安装,一个 bin + 一个配置文件,一次性部署,持续零维护备份。
  • 支持多种数据库源。
  • 支持多种打包存储格式。
  • 支持普通文件、文件夹打包备份。
  • 良好的可扩展性,未来支持丰富的数据源、存储方式等等。

目前支持状态

打包压缩

  • Tgz - .tar.gz

数据库

  • MySQL
  • PostgreSQL
  • Redis - mode: sync/copy
  • MongoDB

文件备份 Archive

基于 tar 命令将多个文件/文件夹打包在一个 .tar 文件里面,支持排除特定文件。

存储方式

  • Local
  • FTP
  • SCP
  • Amazon S3
  • Aliyun OSS

安装 / 升级 GoBackup for Linux

$ curl -sSL https://git.io/gobackup | bash

等上面执行成功以后,会把 gobackup 安装在 /usr/local/bin/gobackup 路径,然后你可以:

$ gobackup -v
gobackup 0.4.0

配置

GoBackup 会自动在下面的地方寻找配置文件:

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

你可以参考一下下面的配置:

# 基本节点,描述有多少个备份方案
models:
  gitlab:
    # 备份打包
    compress_with:
      # 压缩方式
      type: tgz
    # 存储
    store_with:
      # 通过 scp 存储
      type: scp
      path: ~/backup
      host: your-host.com
      private_key: ~/.ssh/id_rsa
      username: ubuntu
      password: password
      timeout: 300
    # 需要备份的数据库
    databases:
      # 别名
      gitlab:
        # 类型: mysql, postgresql, redis
        type: mysql
        host: localhost
        port: 3306
        database: gitlab_production
        username: root
        password: 
      gitlab_redis:
        type: redis
        # 备份前是否要求 Redis 执行 SAVE 命令
        invoke_save: true
        # redis 的备份方式,远程服务器请用 sync
        mode: sync
        password: 
        # 如果 redis 在本地服务器,可以用 copy 模式
        # mode: copy
        # rdb_path: /var/db/redis/dump.rdb
    # 文件备份
    archive:
      # 需要备份的文件、文件夹
      includes:
        - /home/git/.ssh/
        - /etc/mysql/my.conf
        - /etc/nginx/nginx.conf
        - /etc/nginx/conf.d
        - /etc/redis/redis.conf
        - /etc/logrotate.d/
      # 需要排除的文件/文件夹
      excludes:
        - /home/ubuntu/.ssh/known_hosts
        - /etc/logrotate.d/syslog
  gitlab_repos:
    store_with:
      type: local
      path: /data/backups/gitlab-repos/
    archive:
      includes:
        - /home/git/repositories

执行备份

$ gobackup perform
2017/09/08 06:47:36 ======== ruby_china ========
2017/09/08 06:47:36 WorkDir: /tmp/gobackup/1504853256396379166
2017/09/08 06:47:36 ------------- Databases --------------
2017/09/08 06:47:36 => database | Redis: mysql
2017/09/08 06:47:36 Dump mysql dump to /tmp/gobackup/1504853256396379166/mysql/ruby-china.sql
2017/09/08 06:47:36

2017/09/08 06:47:36 => database | Redis: redis
2017/09/08 06:47:36 Copying redis dump to /tmp/gobackup/1504853256396379166/redis
2017/09/08 06:47:36
2017/09/08 06:47:36 ----------- End databases ------------

2017/09/08 06:47:36 ------------- Compressor --------------
2017/09/08 06:47:36 => Compress with Tgz...
2017/09/08 06:47:39 -> /tmp/gobackup/2017-09-08T14:47:36+08:00.tar.gz
2017/09/08 06:47:39 ----------- End Compressor ------------

2017/09/08 06:47:39 => storage | FTP
2017/09/08 06:47:39 -> Uploading...
2017/09/08 06:47:39 -> upload /ruby_china/2017-09-08T14:47:36+08:00.tar.gz
2017/09/08 06:48:04 Cleanup temp dir...
2017/09/08 06:48:04 ======= End ruby_china =======

定时备份

GoBackup 内置了计划任务功能,你可以通过 gobackup.yml 来配置。

详见:https://gobackup.github.io/schedule


TIP: 目前 GoBackup 已经在 Ruby China 的服务器上运作起来了。😆

后续可以支持上传到云存储吗

Terry.Shi 回复

很容易的,只是才做好,先解决 Ruby China 的 FTP 备份方式。

强需求,考虑使用!💪

mark, go 写应用工具很方便。 不过目前只是备份数据库,不知道修改为 resources 是否更好 😄

small_fish__ 回复

resources ?

现在应该用云服务的备份了。

huacnlee 回复

估计是一些文件啥的吧

我之前写过一个备份到 阿里云的 OSS 工具 https://github.com/forecho/backupToOSS

最近更新:

  • 支持 S3, Aliyun OSS 存储
  • 支持 MongoDB 数据库

go 丢个可执行程序过去就可以了,确实方便。

MySQL 默认锁表备份的,提了个 PR 可以自己配置额外参数,比如 innodb 可以用 --single-transaction --quick

太棒了,最近正好需要这样的一个工具

👍 已经在用了

服务器网络问题,访问安装不了,怎么破😂

需要 登录 后方可回复, 如果你还没有账号请 注册新账号