CentOS 上 GitLab 备份与恢复实操指南
一 备份范围与准备
- 备份内容应包含:代码仓库与数据库(由 GitLab 自带工具导出)、以及关键配置与密钥。建议额外备份:/etc/gitlab/gitlab.rb、/etc/gitlab/gitlab-secrets.json,如使用自签证书则同时备份 /etc/gitlab/ssl/。这些文件不包含在默认备份包中,但对恢复至关重要。默认备份文件位于 /var/opt/gitlab/backups,文件名通常形如 <时间戳>_gitlab_backup.tar。
二 手动创建备份
- 执行备份命令(Omnibus 包安装):
- 命令:sudo gitlab-rake gitlab:backup:create
- 完成后在 /var/opt/gitlab/backups 查看生成的 .tar 包。
- 仅备份数据库(可选,便于拆分存储):
- 命令:gitlab-rake gitlab:backup:create SKIP=artifacts,builds,registry,pages,lfs,uploads
- 源码安装(非 Omnibus)路径可能不同,请进入安装目录后执行相同 rake 命令。
三 配置备份路径与保留策略
- 编辑配置文件:sudo vim /etc/gitlab/gitlab.rb
- 常用参数示例:
- 自定义备份目录:
- 设置:gitlab_rails[‘backup_path’] = “/mnt/backups”
- 如目录不存在需先创建,并确保 GitLab 用户有读写权限。
- 保留时间(秒),例如保留 7 天:
- 设置:gitlab_rails[‘backup_keep_time’] = 604800
- 归档权限(可选):
- 设置:gitlab_rails[‘backup_archive_permissions’] = 0644
- 使配置生效:sudo gitlab-ctl reconfigure。
四 定时自动备份与远程拷贝
- 使用 cron 定时(推荐以 root 身份添加任务):
- 示例(每天 02:00 执行):
- 命令:0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1
- 说明:CRON=1 为 GitLab 的标记参数,用于区分定时任务产生的日志与告警。
- 远程备份到备份服务器(免密 SSH 示例):
- 在备份服务器创建备份目录(如 /data/gitlab-backups),在 GitLab 服务器生成 SSH 密钥并将公钥追加到备份服务器的 ~/.ssh/authorized_keys,确保权限为 600/700。
- 在 GitLab 服务器添加定时任务(示例每天 03:00 同步到备份服务器):
- 命令:0 3 * * * rsync -avz --delete /var/opt/gitlab/backups/ backup_user@192.0.2.10:/data/gitlab-backups/
- 如需压缩归档后再传,可先打包再 scp/rsync。
五 恢复与注意事项
- 恢复步骤(Omnibus 包):
- 将备份文件放到目标机器的 /var/opt/gitlab/backups(或配置中指定的 backup_path)。
- 停止相关进程以确保一致性:
- 命令:gitlab-ctl stop unicorn、gitlab-ctl stop sidekiq
- 执行恢复(使用备份编号,即文件名中 下划线前 的时间戳,如 1393513186):
- 命令:gitlab-rake gitlab:backup:restore BACKUP=1393513186
- 启动服务:gitlab-ctl start
- 如配置了 Puma,恢复时可能需要改为停止 puma 而非 unicorn。
- 关键注意事项:
- 版本一致性:恢复环境的 GitLab 版本应尽量与备份时一致,避免不兼容。
- 配置与密钥:恢复后确保 gitlab.rb 与 gitlab-secrets.json 已正确放置并权限正确,否则可能导致 2FA、Runner、LDAP 等功能异常。
- 存储与保留:备份文件较大,需预留足够磁盘空间;按业务需求设置 backup_keep_time 并定期清理。
- 一致性:恢复前尽量避免新的写入操作,减少数据不一致风险。
- 演练与校验:定期在测试环境验证备份的完整性与可恢复性。