本文以通过 Omnibus 包安装的 GitLab CE 为例,记录了备份还原 GitLab 数据及配置过程中的一些事项。

备份还原数据

备份数据

通过以下命令可以备份 GitLab 的数据库、代码仓库(如使用了 lfs,也会包含通过 lfs 存储的文件)和所有附件,并打包为一个 tar 压缩包。

sudo gitlab-rake gitlab:backup:create

具体备份的目录可以在 /etc/gitlab/gitlab.rb 文件的 gitlab_rails['backup_path'] 项中进行设置,默认为 /var/opt/gitlab/backups

备份后的 tar 包的目录结构大致如下所示:

[[email protected] 1459620009_gitlab_backup]$ tree .
.
├── artifacts.tar.gz
├── backup_information.yml
├── builds.tar.gz
├── db
│   └── database.sql.gz
├── lfs.tar.gz
├── repositories
│   ├── user1
│   │   ├── repo1.bundle
│   │   └── repo2.bundle
│   └── user2
│       ├── repo3.bundle
│       ├── repo4.bundle
│       └── repo5.bundle
└── uploads.tar.gz

此外,还可以为 GitLab 配置自动备份备份自动上传等,本文不再详述。

还原数据

还原数据时,首先需要将原先备份的压缩包拷贝到配置文件 /etc/gitlab/gitlab.rbgitlab_rails['backup_path'] 项指定的目录下,默认为 /var/opt/gitlab/backups,如:

sudo cp 1459620009_gitlab_backup.tar /var/opt/gitlab/backups/
# 自 GitLab 8.15 版本起,备份文件时间戳的格式
# 从 EPOCH (1459620009) 改为了 EPOCH_YYYY_MM_DD (1491415349_2017_04_06)
sudo cp 1491415349_2017_04_06_gitlab_backup.tar /var/opt/gitlab/backups/

随后,执行以下命令进行数据恢复:

# 停止需要连接数据库的服务
sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq

# 恢复备份的数据,重写数据库内容
# GitLab 8.15 版本以前所用的时间戳格式为 EPOCH (1393513186)
sudo gitlab-rake gitlab:backup:restore BACKUP=1459620009
# 或
# GitLab 8.15 版本以后所用的时间戳格式为 EPOCH_YYYY_MM_DD (1491415349_2017_04_06)
sudo gitlab-rake gitlab:backup:restore BACKUP=1491415349_2017_04_06

# 启动 GitLab
sudo gitlab-ctl start

# 检查 GitLab 是否正常运行
sudo gitlab-rake gitlab:check SANITIZE=true

注意,上述命令中的 14596200091491415349_2017_04_06 应该替换为备份文件的实际时间戳,即备份文件名中 _gitlab_backup.tar 之前的部分。

此外,恢复备份时所用的 GitLab 版本应该与备份时所用的 GitLab 版本相同。否则,恢复过程会报错。

GitLab 的历史版本可以在 https://packages.gitlab.com/gitlab/gitlab-ce 中搜索下载。

为了恢复备份,如果是要将当前所安装的 GitLab 降级的话,且使用的是 rpm/yum 进行包管理,需要执行命令:

sudo yum downgrade "下载的旧版本的文件名"

来完成 GitLab 版本降级;如是升级则只需正常的 yum install 即可。

备份还原配置

备份配置

出于安全考虑,在上述的备份命令中,只会备份 GitLab 的应用数据,而不会备份 GitLab 的配置。

通过 Omnibus 包安装的 GitLab 的配置存储在 /etc/gitlab/ 目录下,可以通过以下命令进行备份:

sudo sh -c 'umask 0077; tar -cf $(date "+etc-gitlab-%s.tar") -C / etc/gitlab'

此外,还应注意备份服务器 ssh 服务的私钥,以避免客户端在连接新恢复的服务器时返回 ssh 相关的警告。

如果服务器启用了 SSL,则相关证书及密钥也应一并备份。

还原配置

还原之前备份的配置时,可以使用以下命令:

# 还原配置前,先备份当前配置
sudo mv /etc/gitlab /etc/gitlab.$(date +%s)
# 解压包含了所备份配置的压缩包
sudo tar -xf etc-gitlab-1399948539.tar -C /

注意,上述命令中的 1399948539 应换为实际备份文件的时间戳。

错误解决

  • 如果使用了 lfs,且在恢复时报错,则需保证存放 lfs 的目录,git 用户有写权限。

  • 如果使用了 ssl,则在恢复 GitLab 配置文件时,需要一并恢复 ssl 的证书及私钥,否则 nginx 服务将会无法启动。

    nginx 相关的日志,可以通过 sudo gitlab-ctl tail nginx 来查看。

参考