GitLab的备份和恢复策略有哪些
小樊
51
2025-11-22 22:12:45
GitLab 备份与恢复策略
一 核心策略与范围
- 使用官方内置备份工具生成包含应用数据的单归档文件(默认 tar),覆盖:数据库(PostgreSQL)、仓库、附件 uploads、CI 作业产物 artifacts、LFS 对象、容器镜像 registry、Pages、构建日志 builds 等;备份归档的默认路径为 /var/opt/gitlab/backups,文件名形如 [TIMESTAMP]_gitlab_backup.tar。注意:备份不包含 /etc/gitlab 配置、TLS 证书、SSH 主机密钥、以及 Redis/Sidekiq 运行时数据;若使用 PgBouncer,备份需额外参数。为获得完整可恢复性,需单独备份配置文件与密钥(见下文)。
二 备份策略与配置
- 备份命令与版本
- Omnibus 安装:gitlab-backup create(GitLab 12.1+),早期版本可用 gitlab-rake gitlab:backup:create。
- 源安装:bundle exec rake gitlab:backup:create RAILS_ENV=production。
- Docker:在容器内执行 docker exec -t gitlab-backup create。
- 定时与保留
- 定时任务示例:每天 02:00 执行并抑制输出(CRON=1)
- 0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1
- 本地保留期:在 /etc/gitlab/gitlab.rb 设置
- gitlab_rails[‘backup_keep_time’] = 604800(保留 7 天,可按需调整)。
- 并行与性能
- 提升仓库备份并发度:
- GITLAB_BACKUP_MAX_CONCURRENCY=4(同时备份的项目数,默认 1)
- GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=1(不同存储并发,默认 1)
- 高级选项
- 跳过部分数据:如 SKIP=db,uploads(用于特殊场景,如配合外部数据库/对象存储)。
- 仅生成目录不打包:如 SKIP=tar(便于与外部工具集成)。
- 归档权限:gitlab_rails[‘backup_archive_permissions’] = 0644。
三 恢复策略与步骤
- 前提条件
- 恢复时的 GitLab 版本需与备份时一致(如从 12.10.5 备份,需恢复到 12.10.5 再升级)。
- 必须单独恢复机密文件:/etc/gitlab/gitlab-secrets.json(含数据库加密密钥、CI/CD 变量、2FA 等);建议同时备份 /etc/gitlab/gitlab.rb 与 TLS/SSH 相关文件,避免还原后安全告警或功能异常。
- 标准流程(Omnibus 示例)
- 将备份归档放到 /var/opt/gitlab/backups(或配置的路径)。
- 为一致性,建议先停止写入服务:
- gitlab-ctl stop unicorn
- gitlab-ctl stop sidekiq
- 执行恢复(指定时间戳前缀,不含 “_gitlab_backup.tar” 后缀):
- gitlab-backup restore BACKUP=1597812374_2020_08_19_12.10.5
- 如需非交互式:添加 force=yes。
- 启动服务:
- 访问 Web 界面核验项目、用户、Runner、Pages、LFS、Registry 等是否完整。
- Docker 场景
- 将备份文件挂载至容器内相同路径后,在容器内执行:
- docker exec -t gitlab-backup restore BACKUP= [force=yes]
- 常见注意点
- 恢复时若报找不到文件,确认 BACKUP 只填时间戳前缀(不要包含 “_gitlab_backup.tar”)。
- 使用 PgBouncer 等连接池时,备份命令需加相应参数;多节点部署时,备份应在运行 Puma/Sidekiq 的节点执行。
四 高可用与迁移实践
- 环境与对象存储
- 将备份归档同步到异地/对象存储(如 S3/OSS)以实现地理冗余;保留策略建议:本地 7 天,异地长期保留(如 90 天/半年/永久,视合规与成本而定)。
- 远程复制脚本思路
- 在备份完成后,用 scp/rsync 将新生成的 .tar 文件推送到远程备份服务器;远程侧按保留天数自动清理旧备份,形成“本地快取 + 异地长期”的双层策略。
- 迁移等同恢复
- 在新环境部署相同版本的 GitLab,先恢复 gitlab-secrets.json 与 gitlab.rb,再按恢复流程导入备份归档;验证无误后再进行升级或切换流量。
五 验证与演练及关键注意事项
- 定期恢复演练
- 制定演练计划:例如每 季度在隔离环境做一次全量恢复,校验 RPO/RTO;演练后更新备份与恢复文档。
- 版本与兼容性
- 备份与恢复需版本一致;跨版本恢复应先对齐版本再执行。
- 不包含与特殊组件
- 备份不包含 Redis/Sidekiq 队列、配置文件、TLS/SSH 等;若使用 PgBouncer/Patroni 等组件,需遵循相应备份注意事项。
- 并发与锁
- 老版本(如 15.5.0 之前)备份命令不会校验是否已有备份在运行,建议串行化执行,避免并发导致不一致或失败。