Gitlab(ce)社区版备份和恢复

官方参考

版本: gitlab-ce:9.5.5
运行环境: docker + gfs

备份 for Docker or Omnibus installations

最佳实践

数据备份

$ gitlab-rake gitlab:backup:create STRATEGY=copy DIRECTORY=daily

# STRATEGY=copy 表示先进行拷贝,完成后再使用tar/gzip进行打包,避免出现因为频繁访问出来的`file changed as we read it`
# DIRECTORY=daily 将备份按天分组保存
  • 注意

本例中使用了gfs作为gitlab的存储. 在进行备份时,若备份文件存储在gfs中会一直出现tar: xxx: file changed as we read it, 导致备份失败. 解决办法就是在gitlab.rb中将备份目录配置在本地存储

配置备份

主要备份gitlab.rbgitlab-secrets.json

$ tar czf /var/opt/gitlab/backups/`date +%s`_config_gitlab_backup.tar /etc/gitlab/gitlab.rb /etc/gitlab/gitlab-secrets.json /etc/gitlab/ssl

# /etc/gitlab/gitlab.rb 配置文件
# /etc/gitlab/gitlab-secrets.json CI的secrets文件
# 本例将域名证书挂载在/etc/gitlab/ssl/, 可移除

备份的配置参数

配置文件位置/etc/gitlab/gitlab.rb

备份存储位置

gitlab_rails['backup_path'] = /var/opt/gitlab/backups

备份保留时间,超过这个时间会被删除

# limit backup lifetime to 7 days - 604800 seconds
gitlab_rails['backup_keep_time'] = 604800

恢复 for Docker or Omnibus installations

要求:

  • 使用相同版本

恢复配置文件gitlab.rb/etc/gitlab/gitlab.rb, 并重新配置

gitlab-ctl reconfigure

重启gitlab

gitlab-ctl restart

传输备份文件1512026157_2017_11_30_9.5.5_gitlab_backup.tar到gitlab.rb中配置的备份地址gitlab_rails['backup_path'], 默认为/var/opt/gitlab/backups

停止有数据库连接的进程

$ gitlab-ctl stop unicorn
$ gitlab-ctl stop sidekiq
# Verify
$ gitlab-ctl status

指定备份文件TIMESTAMP进行恢复,本例TIMESTAMP1512026157_2017_11_30_9.5.5

gitlab-rake gitlab:backup:restore BACKUP=1512026157_2017_11_30_9.5.5

然后恢复备份的secrets文件gitlab-secrets.json/etc/gitlab/gitlab-secrets.json

启动并测试

$ gitlab-ctl restart
$ gitlab-rake gitlab:check SANITIZE=true

crontab 例行备份

  • 容器中没有启用CRON调用,这里在宿主机上进行调用定时备份

0 4 * * * docker exec gitlabce_web_1 sh -c "gitlab-rake gitlab:backup:create STRATEGY=copy DIRECTORY=daily" CRON=1