极狐GitLab

极狐GitLab容灾备份与恢复实操,备份策略与演练清单

极狐GitLab
2026年10月26日
11560
分享:

极狐GitLab容灾备份与恢复实操,备份策略与演练清单

备份恢复:极狐GitLab通过 gitlab-backup 工具将数据库、代码仓库、CI/CD产物等数据打包归档,并可在同版本实例上完整还原,是私有化部署容灾体系的最后一道防线。

数据丢了才发现备份没做全,是运维团队最常见的"事后诸葛"场景。代码仓库、CI/CD产物、用户凭据散落在不同位置,备份命令跑成功了不等于恢复能成功——备份的价值只能靠演练验证。这篇文章把极狐GitLab的备份与恢复拆成可执行的步骤:什么必须备份、怎么备、怎么恢复、怎么验证,最后给一份可以直接照着跑的演练清单。

一、先搞清楚:备份里有什么,缺什么

很多人以为跑一条 gitlab-backup create 就万事大吉,实际上备份归档有明确的覆盖边界。根据官方备份文档,默认备份生成单个压缩 tar 归档,包含以下内容:

类别

具体内容

数据与配置

PostgreSQL 数据库数据、数据库配置

代码资产

Git 代码仓库、LFS 对象、项目和群组 Wiki

CI/CD

产物(artifacts)、作业日志、Terraform 状态

内容与附件

上传文件、外部合并请求差异、项目级安全文件、Pages 内容、代码片段

生态数据

软件包仓库数据、容器镜像仓库镜像

账号

账号和群组设置

同样重要的是:这些内容不在备份里,必须单独处理。

不在备份中的数据

处理方式

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

手动备份,建议纳入版本管理或加密存储

密钥文件 /etc/gitlab/gitlab-secrets.json

必须手动备份——含数据库加密密钥,丢了就无法解密任何加密值

对象存储中的数据(Omnibus/Docker/自编译安装)

依赖对象存储自身的备份机制,如 S3 备份、版本化桶

Redis 数据、Sidekiq 作业

官方明确不备份,属可再生的临时数据

TLS 证书与 SSH 主机密钥

建议一并备份,避免整机恢复后出现中间人告警

密钥文件单独存是有意为之的设计:数据库里存着双重身份验证、CI/CD 安全变量等加密信息,密钥和密文放在一起等于没加密。这也是恢复时最容易翻车的地方——没恢复 gitlab-secrets.json,所有启用双因素认证的用户都会被锁在门外,Runner 也无法登录。

二、备份实操:一条命令与它的变体

Linux 软件包安装的基础备份命令:

sudo gitlab-backup create

归档默认生成在 gitlab_rails['backup_path'] 配置的目录(默认 /var/opt/gitlab/backups),文件名形如 1393513186_2014_02_27_gitlab_backup.tar,属主为 git 用户、权限 0600。

生产环境常用的四个变体:

# 1. 数据高频变化时用 copy 策略,避免 "file changed as we read it" 报错
sudo gitlab-backup create STRATEGY=copy

# 2. 排除指定数据,比如仓库数据已由 Geo 站点承接时
sudo gitlab-backup create SKIP=db,uploads

# 3. 备份后自动上传远程存储(需先配置 backup_upload_connection)
sudo gitlab-backup create DIRECTORY=daily

# 4. cron 定时备份,每天凌晨 2 点
0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1

两个配置项建议顺手改上:gitlab_rails['backup_keep_time'] = 604800 限制本地备份保留 7 天,防止磁盘被旧归档塞满;仓库量大时用 GITLAB_BACKUP_MAX_CONCURRENCY=4 并行打包可明显缩短窗口。

一个官方明示的边界:当数据库超过 100 GB 或 Git 数据达到 400 GB 量级时,备份命令很可能不再实用,此时应转向增量备份(INCREMENTAL=yes)、磁盘快照或 Geo 站点等替代策略。这不是备份工具的缺陷,而是 pg_dump 和 Git bundle 机制在超大规模下的固有约束。

三、恢复实操:五个前提,五步走

恢复比备份更容易出错,因为前提条件更苛刻。根据官方恢复文档,恢复前必须满足:

  1. 版本与类型完全一致:只能恢复到与备份创建时相同版本、相同类型(基础版/企业版)的实例,版本不匹配命令会直接中止;

  2. 目标实例已正常工作:git 用户无权创建 SQL 数据库,所以恢复前必须有一个装好的、能跑的极狐GitLab;

  3. 目标实例无既有数据:PostgreSQL 会自动清除,但同名 Git 仓库会导致恢复失败,对象存储桶需手动清空;

  4. 密钥文件已恢复:从原服务器复制 gitlab-secrets.json 并执行 reconfigure;

  5. 备份目录空间充足:可用空间至少为归档大小的三倍,不满足则恢复在解压前即停止。

满足前提后,恢复五步:

# 1. 将备份归档放入备份目录并修正属主
sudo cp 11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar /var/opt/gitlab/backups/
sudo chown git:git /var/opt/gitlab/backups/11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar

# 2. 停止连接数据库的进程,其余服务保持运行
sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq

# 3. 执行恢复(文件名中 "_gitlab_backup.tar" 部分省略)
sudo gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce

# 4. 在 PostgreSQL 节点上重载配置并启动
sudo gitlab-ctl reconfigure
sudo gitlab-ctl start

# 5. 检查与验证
sudo gitlab-rake gitlab:check SANITIZE=true
sudo gitlab-rake gitlab:doctor:secrets

第 5 步里的 gitlab:doctor:secrets 值得单独强调:它会逐条验证数据库中的加密值能否用当前密钥解密。凡是涉及恢复 gitlab-secrets.json 或跨服务器恢复的场景,这条命令必须跑,否则问题会等到用户登录或 CI 变量读取时才集中爆发。

四、灾备演练清单:照着跑一遍

备份不做恢复演练,等于没备份。以下清单源自上述官方步骤,建议每季度在隔离环境完整执行一次:

#

演练项

通过标准

1

在隔离环境准备同版本、同类型实例

gitlab-ctl status 全部 run

2

拷贝备份归档与 gitlab-secrets.json、gitlab.rb

文件完整、属主为 git

3

执行完整恢复流程

gitlab-backup restore 无报错

4

运行 gitlab-rake gitlab:doctor:secrets

输出 "decrypted values are correct"

5

运行 gitlab-rake gitlab:artifacts:check / lfs:check / uploads:check

抽样文件校验通过

6

用真实账号登录,抽查双因素认证、CI/CD 变量、Runner 连接

用户可登录、流水线可触发

7

记录演练总耗时

满足业务 RTO(恢复时间目标)

第 7 项最容易被忽略:演练的意义不只是验证流程通不通,更是拿到真实数据量下的恢复耗时,用它反推 RTO 承诺是否兑现。如果演练耗时已经超出业务容忍度,就该考虑增量备份缩短窗口,或用 Geo 建立温备站点把切换时间从"小时级"压到"分钟级"。

常见问题 FAQ

Q1:备份成功后恢复时提示 GitLab version mismatch,怎么办?

备份只能恢复到完全相同版本和类型的实例。按报错提示中给出的目标版本(如 16.4.3-ee)调整目标实例版本后重试。这也是演练清单要求"同版本实例"的原因——临时升级或降级会大幅拉长真实故障的恢复时间。

Q2:gitlab-secrets.json 丢了还能恢复吗?

密钥文件丢失意味着数据库加密值(双因素认证、CI/CD 安全变量等)无法解密。官方故障排除文档提供了处理路径,但代价是相关用户需重新配置双因素认证、相关变量需重新录入。最稳妥的做法是把密钥文件纳入离线加密备份,与归档分开存储。

Q3:对象存储上的数据备份命令管不到,怎么补齐?

备份命令不会备份存储在对象存储中的数据(Omnibus/Docker/自编译安装)。需依赖对象存储自身的机制补齐:如 S3 备份、版本化桶或跨区域复制,并注意极狐GitLab 不会自动清理第三方对象存储中的旧备份,保留策略需自行配置。


数据可备份、可恢复、演练过,才算真正的容灾。极狐GitLab 官方文档中心提供了从备份参数到 Geo 容灾的完整文档,如需结合贵司数据规模评估备份策略与恢复时间目标,欢迎预约演示或联系团队获取灾备方案建议。