GitLab CE 备份与还原
本文以通过 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.rb
中 gitlab_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
注意,上述命令中的 1459620009
或 1491415349_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
来查看。