极狐Gitlab备份与恢复
1. 备份说明
官方原文:
根据官方文档,备份有多种方式,比如 local、s3、nfs 等。无论上述哪种备份方式,在备份数据的时候,极狐GitLab都会在默认本地备份路径先备份一份,再上传到 remote。
命令会备份的内容:
- Database
- Attachments
- Git repositories data
- CI/CD job output logs
- CI/CD job artifacts
- LFS objects
- Container Registry images
- GitLab Pages content
- Snippets
- Group wikis
命令不会备份的内容:
- Terraform state files
- Package registry files
- Mattermost data
- 配置信息(gitlab-secrets,gitlab.rb等)
2. 备份准备
2.1 安装rsync
yum install rsync -y
2.2 备份路径配置
默认的备份路径在 /var/opt/gitlab/backups
,可以通过 /etc/gitlab/gitlab.rb
修改成其它路径
## Backup settings
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
3. 本地备份
3.1 备份数据
如果极狐Gitlab 版本是 <= 12.1,则
gitlab-rake gitlab:backup:create
如果极狐Gitlab 版本是 >= 12.2,则
gitlab-backup create
备份的文件
$ ls -l /var/opt/gitlab/backups/
total 340
-rw------- 1 git git 348160 Feb 25 14:49 1645771779_2022_02_25_14.7.3-ee_gitlab_backup.tar
备份选项参考:Back up and restore GitLab | GitLab
3.2 备份配置文件
在 Omnibus 方式安装的极狐GitLab 中所有的配置保存在 /etc/gitlab 下,其中 gitlab-secrets.json 非常重要,切勿丢失
配置文件包括:
- GitLab two-factor authentication (2FA) user secrets (‘QR codes’)
- GitLab CI ‘secure variables’
- ssl 证书文件
要备份所有配置,请执行:
gitlab-ctl backup-etc <DIRECTORY>
- 若不指定 DIRECTORY,极狐GitLab 会自动创建 /etc/gitlab/config_backup/ 保存配置的备份文件。
注意:请不要将配置的备份与数据的备份保存在一起,以免数据泄露。如果早期版本没有上述命令,请手工备份 /etc/gitlab 目录下文件
tar -cvf gitlab-config.backup.20220225.tar /etc/gitlab/
3.3 备份 ssh 密钥
机器的SSH主机密钥保存在 /etc/ssh/ 中。如果需要执行整个机器的还原,必须备份,参考:备份这些密钥
cd /etc/ssh
$ tar zcvf ssh_key.backup.20220225.tar.gz ssh_host_*
ssh_host_ecdsa_key
ssh_host_ecdsa_key.pub
ssh_host_ed25519_key
ssh_host_ed25519_key.pub
ssh_host_rsa_key
ssh_host_rsa_key.pub
4. 远程备份
远程备份步骤和本地备份差不多,只是需要添加一些配置而已,比如 s3 备份:
添加以下配置到/etc/gitlab/gitlab.rb
gitlab_rails['backup_upload_connection'] = {
'provider' => 'AWS',
'aws_access_key_id' => 'YOUR-ACCESS-KEY-OR-USERNAME-HERE',
'aws_secret_access_key' => 'YOUR-SECRET-KEY-HERE',
'endpoint' => 'https://minio.yourdomain.com:9000',
'path_style' => true
}
gitlab_rails['backup_upload_remote_directory'] = 'backup'
- 为了使配置生效需要再执行以下命令:
gitlab-ctl reconfigure
具体方法就不赘述了
5. 恢复实例
5.1 恢复前提
- 已经安装 完全相同的版本和类型(CE / EE)的极狐GitLab Omnibus 或者 docker 版本。
- 已经运行过
sudo gitlab-ctl reconfigure
至少一次。 - 极狐GitLab正在运行。如果不是,请使用启动它
sudo gitlab-ctl start
5.2 恢复到 docker 实例
备份文件:
- 数据:1645771779_2022_02_25_14.7.3-ee_gitlab_backup.tar
- 配置文件:gitlab_config_1645771925_2022_02_25.tar
- ssh 密钥:ssh_key.backup.20220225.tar.gz
把 3 个备份文件到目标恢复主机
1)使用 docker 安装相同版本的 gitlab
首先创建目录
mkdir -p /srv/gitlab
export GITLAB_HOME=/srv/gitlab
启动命令
docker run -d \
--hostname gitlab.example.com \
--env GITLAB_OMNIBUS_CONFIG="external_url 'http://gitlab.example.com/';gitlab_rails['initial_root_password'] = 'yourpassword';gitlab_rails['initial_shared_runners_registration_token'] = 'yourtoken'" \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab \
--volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab \
--shm-size 256m \
gitlab/gitlab-ee:14.7.3-ee.0
2)停止所有连接到数据库的进程
docker exec -it gitlab /bin/bash
# 老版本使用的 unicorn,14 版本后使用 puma 运行 rails
gitlab-ctl stop unicorn && gitlab-ctl stop puma
gitlab-ctl stop sidekiq
# 确认
gitlab-ctl status
3)恢复数据
# 拷贝备份文件到 docker 备份目录
cp 1645771779_2022_02_25_14.7.3-ee_gitlab_backup.tar /srv/gitlab/data/backups
docker exec -it gitlab /bin/bash
chown git.git /var/opt/gitlab/backups/1645771779_2022_02_25_14.7.3-ee_gitlab_backup.tar
# 这条命令会覆盖 GitLab 数据库的内容!注意和文件名的结尾有区别,结尾没有 gitlab_backup ,只到 ee
gitlab-backup restore BACKUP=1645771779_2022_02_25_14.7.3-ee
# 如果是 GitLab 12.1 或更旧版本,执行如下命令:
gitlab-rake gitlab:backup:restore
- 会自动恢复 /var/opt/gitlab/.ssh/authorized_keys 认证文件,即用户添加的 ssh keys
4)恢复配置文件
tar -xvf gitlab_config_1645771925_2022_02_25.tar
# 恢复 /etc/gitlab/gitlab.rb
cp -r etc/gitlab/gitlab.rb /srv/gitlab/config/gitlab.rb
# 恢复 /etc/gitlab/gitlab-secrets.json
cp -r etc/gitlab/gitlab-secrets.json /srv/gitlab/config/gitlab-secrets.json
# 如果有,恢复 ssl 证书
cp -r etc/gitlab/ssl/* /srv/gitlab/config/ssl/
5)恢复 ssh 密钥
tar zxvf ssh_key.backup.20220225.tar.gz
cp -r ssh_host_* /srv/gitlab/config/
- 默认是 ssh 密钥是保存在 /etc/ssh 中的,但是 docker 是在 /etc/gitlab 中
6)重启 docker 实例生效
docker restart gitlab
5.3 恢复到 Omnibus 实例
备份文件:
- 数据:1645771779_2022_02_25_14.7.3-ee_gitlab_backup.tar
- 配置文件:gitlab_config_1645771925_2022_02_25.tar
- ssh 密钥:ssh_key.backup.20220225.tar.gz
把 3 个备份文件到目标恢复主机
1)使用 Omnibus 安装相同版本的极狐gitlab
具体步骤参考其他文档,搭建完成后执行一次:gitlab-ctl reconfigure
2)停止所有连接到数据库的进程
# 老版本使用的 unicorn,14版本后使用 puma 运行 rails
gitlab-ctl stop unicorn && gitlab-ctl stop puma
gitlab-ctl stop sidekiq
# 确认
gitlab-ctl status
3)恢复数据
# 拷贝备份文件到 docker 备份目录
cp 1645771779_2022_02_25_14.7.3-ee_gitlab_backup.tar /var/opt/gitlab/backups/
chown git.git /var/opt/gitlab/backups/1645771779_2022_02_25_14.7.3-ee_gitlab_backup.tar
chown -R registry:git /var/opt/gitlab/gitlab-rails/shared/registry
# 这条命令会覆盖 GitLab 数据库的内容!注意和文件名的结尾有区别,结尾没有 gitlab_backup ,只到 ee
gitlab-backup restore BACKUP=1645771779_2022_02_25_14.7.3-ee
# 如果是 GitLab 12.1 或更旧版本,执行如下命令:
gitlab-rake gitlab:backup:restore
- 恢复过程中会提示是否恢复 /var/opt/gitlab/.ssh/authorized_keys 认证文件,即用户添加的 ssh keys,选择 yes
4)恢复配置文件
tar -xvf gitlab_config_1645771925_2022_02_25.tar
# 恢复 /etc/gitlab/gitlab.rb
cp -r etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb
# 恢复 /etc/gitlab/gitlab-secrets.json
cp -r etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json
# 如果有,恢复 ssl 证书
cp -r etc/gitlab/ssl/* /etc/gitlab/ssl/
5)恢复 ssh 密钥
tar zxvf ssh_key.backup.20220225.tar.gz
cp -r ssh_host_* /etc/ssh/
6)重启生效
systemctl restart sshd
gitlab-ctl reconfigure
gitlab-ctl restart
# 检测组件状态,需要执行 restart 后多等一会所有内部服务都启动完成后再执行
gitlab-rake gitlab:check SANITIZE=true
如果极狐GitLab 版本在 13.1 及更高版本时,可以对数据库中的值进行解密,以便验证当前的配置文件 gitlab-secrets.json
是否正确,执行如下命令:
$ gitlab-rake gitlab:doctor:secrets
I, [2022-02-28T10:59:16.212678 #6153] INFO -- : Checking encrypted values in the database
I, [2022-02-28T10:59:26.987515 #6153] INFO -- : - Ci::InstanceVariable failures: 0
I, [2022-02-28T10:59:27.003740 #6153] INFO -- : - Ci::PipelineScheduleVariable failures: 0
I, [2022-02-28T10:59:27.022424 #6153] INFO -- : - Ci::Variable failures: 0
I, [2022-02-28T10:59:27.042150 #6153] INFO -- : - Ci::GroupVariable failures: 0
I, [2022-02-28T10:59:27.056166 #6153] INFO -- : - Ci::JobVariable failures: 0
I, [2022-02-28T10:59:27.069193 #6153] INFO -- : - Ci::PipelineVariable failures: 0
I, [2022-02-28T10:59:27.095875 #6153] INFO -- : - ApplicationSetting failures: 0
I, [2022-02-28T10:59:27.310622 #6153] INFO -- : - User failures: 0
I, [2022-02-28T10:59:27.325427 #6153] INFO -- : - GeoNode failures: 0
I, [2022-02-28T10:59:27.343479 #6153] INFO -- : - Clusters::Platforms::Kubernetes failures: 0
I, [2022-02-28T10:59:27.364214 #6153] INFO -- : - Snippet failures: 0
I, [2022-02-28T10:59:27.366518 #6153] INFO -- : - PersonalSnippet failures: 0
I, [2022-02-28T10:59:27.368022 #6153] INFO -- : - ProjectSnippet failures: 0
I, [2022-02-28T10:59:27.384082 #6153] INFO -- : - Clusters::Applications::Helm failures: 0
I, [2022-02-28T10:59:27.396294 #6153] INFO -- : - Clusters::Applications::Prometheus failures: 0
I, [2022-02-28T10:59:27.408780 #6153] INFO -- : - AlertManagement::HttpIntegration failures: 0
I, [2022-02-28T10:59:27.424009 #6153] INFO -- : - GrafanaIntegration failures: 0
I, [2022-02-28T10:59:27.442778 #6153] INFO -- : - PagesDomain failures: 0
I, [2022-02-28T10:59:27.456616 #6153] INFO -- : - PagesDomainAcmeOrder failures: 0
I, [2022-02-28T10:59:27.472027 #6153] INFO -- : - JiraConnectInstallation failures: 0
I, [2022-02-28T10:59:27.488012 #6153] INFO -- : - ProjectImportData failures: 0
I, [2022-02-28T10:59:27.504495 #6153] INFO -- : - RemoteMirror failures: 0
I, [2022-02-28T10:59:27.520466 #6153] INFO -- : - WebHook failures: 0
I, [2022-02-28T10:59:27.522920 #6153] INFO -- : - ProjectHook failures: 0
I, [2022-02-28T10:59:27.524795 #6153] INFO -- : - ServiceHook failures: 0
I, [2022-02-28T10:59:27.526514 #6153] INFO -- : - SystemHook failures: 0
I, [2022-02-28T10:59:27.528127 #6153] INFO -- : - GroupHook failures: 0
I, [2022-02-28T10:59:27.545203 #6153] INFO -- : - IncidentManagement::ProjectIncidentManagementSetting failures: 0
I, [2022-02-28T10:59:27.558290 #6153] INFO -- : - Alerting::ProjectAlertingSetting failures: 0
I, [2022-02-28T10:59:27.571397 #6153] INFO -- : - Atlassian::Identity failures: 0
I, [2022-02-28T10:59:27.584517 #6153] INFO -- : - BulkImports::Configuration failures: 0
I, [2022-02-28T10:59:27.602716 #6153] INFO -- : - Clusters::KubernetesNamespace failures: 0
I, [2022-02-28T10:59:27.620096 #6153] INFO -- : - Integrations::IssueTrackerData failures: 0
I, [2022-02-28T10:59:27.637791 #6153] INFO -- : - Integrations::JiraTrackerData failures: 0
I, [2022-02-28T10:59:27.650149 #6153] INFO -- : - Integrations::ZentaoTrackerData failures: 0
I, [2022-02-28T10:59:27.662388 #6153] INFO -- : - ErrorTracking::ProjectErrorTrackingSetting failures: 0
I, [2022-02-28T10:59:27.677523 #6153] INFO -- : - Serverless::DomainCluster failures: 0
I, [2022-02-28T10:59:27.679687 #6153] INFO -- : - Clusters::Integrations::Prometheus failures: 0
I, [2022-02-28T10:59:27.693328 #6153] INFO -- : - StatusPage::ProjectSetting failures: 0
I, [2022-02-28T10:59:27.707538 #6153] INFO -- : - Dast::SiteProfileSecretVariable failures: 0
I, [2022-02-28T10:59:27.726360 #6153] INFO -- : - Clusters::Providers::Aws failures: 0
I, [2022-02-28T10:59:27.743271 #6153] INFO -- : - Clusters::Providers::Gcp failures: 0
I, [2022-02-28T10:59:27.760446 #6153] INFO -- : - Packages::Debian::GroupDistributionKey failures: 0
I, [2022-02-28T10:59:27.775108 #6153] INFO -- : - Packages::Debian::ProjectDistributionKey failures: 0
I, [2022-02-28T10:59:27.777438 #6153] INFO -- : - Gitlab::BackgroundMigration::BackfillJiraTrackerDeploymentType2::JiraTrackerDataTemp failures: 0
I, [2022-02-28T10:59:27.791744 #6153] INFO -- : - Ci::Runner failures: 0
I, [2022-02-28T10:59:27.813291 #6153] INFO -- : - Ci::Build failures: 0
I, [2022-02-28T10:59:27.961570 #6153] INFO -- : - Group failures: 0
I, [2022-02-28T10:59:28.015377 #6153] INFO -- : - Project failures: 0
I, [2022-02-28T10:59:28.031628 #6153] INFO -- : - DeployToken failures: 0
I, [2022-02-28T10:59:28.049531 #6153] INFO -- : - Clusters::AgentToken failures: 0
I, [2022-02-28T10:59:28.064523 #6153] INFO -- : - ScimOauthAccessToken failures: 0
I, [2022-02-28T10:59:28.080880 #6153] INFO -- : - Operations::FeatureFlagsClient failures: 0
I, [2022-02-28T10:59:28.080980 #6153] INFO -- : Total: 0 row(s) affected
I, [2022-02-28T10:59:28.080999 #6153] INFO -- : Done!
5.4 当配置文件丢失时
如果没有备份旧的配置文件,那么需要手工重置很多组件的令牌。参见当机密文件丢失时,使用其中的信息,后果自负