Ubuntu 上 GitLab 备份与恢复实操指南
一 备份前准备与关键注意事项
- 备份命令会生成包含仓库、数据库、上传文件、CI/CD 产物、LFS 等的归档,但默认不包含敏感配置文件,需单独备份:/etc/gitlab/gitlab.rb、/etc/gitlab/gitlab-secrets.json。恢复时版本需与备份时一致(或按官方支持矩阵进行升级/降级后再恢复)。为提高大并发写入时的备份一致性,可使用复制策略创建备份。备份文件默认位于 /var/opt/gitlab/backups,可在配置中自定义路径。
二 手动创建备份
- 修改备份路径(可选):编辑 /etc/gitlab/gitlab.rb
- 启用并设定路径:gitlab_rails[‘manage_backup_path’] = true、gitlab_rails[‘backup_path’] = “/data/gitlab-backups”
- 设定保留时间(秒):gitlab_rails[‘backup_keep_time’] = 2592000(示例为 30 天)
- 使配置生效:sudo gitlab-ctl reconfigure
- 执行备份(两种等效方式,建议使用新接口):
- 新接口:sudo /opt/gitlab/bin/gitlab-backup create(可加 STRATEGY=copy 提升一致性;加 CRON=1 静默)
- 旧接口:sudo gitlab-rake gitlab:backup:create
- 备份完成后确认归档生成:
- 查看默认目录:ls -l /var/opt/gitlab/backups
- 或查看自定义目录:ls -l /data/gitlab-backups
- 重要提示:上述备份不包含 gitlab.rb 与 gitlab-secrets.json,请手动另行备份。
三 自动定时备份与保留策略
- 使用 root 的 crontab 添加定时任务(示例为每天 02:00 备份):
- 编辑:sudo crontab -e
- 添加:0 2 * * * /opt/gitlab/bin/gitlab-backup create STRATEGY=copy CRON=1
- 按保留时间自动清理:
- 若已在 gitlab.rb 中设置 backup_keep_time,GitLab 会自动清理过期归档;也可在系统层用 find 定期删除,例如保留 30 天:
- find /var/opt/gitlab/backups -type f -mtime +30 -delete
- 建议做法:在备份完成后,用脚本将归档同步/拷贝到远程存储(如另一台服务器或对象存储),以防单机故障导致备份丢失。
四 远程备份与异地留存示例
- 步骤概览:
- 在备份服务器 B 创建备份目录(如 /data/code_backup),在 GitLab 服务器 A 生成 SSH 密钥对并将公钥追加到 B 的 ~/.ssh/authorized_keys,实现免密登录。
- 在 A 上编写备份脚本(示例要点):
- 执行备份:/opt/gitlab/bin/gitlab-backup create
- 查找最新归档(如近 60 分钟):find /data/gitlab-backups -type f -mmin -60 -name ‘.tar’
- 复制到 B:scp $BACKUPFILE_SEND_TO_REMOTE root@B_IP:/data/code_backup
- 远程清理旧备份(在 B 上):find /data/code_backup -type f -mtime +14 -name ‘.tar’ -delete
- 在 A 上用 crontab 定时执行该脚本(如每天 23:00),并在 B 上定时清理过期备份(如保留 14 天)。
五 恢复步骤要点
- 准备:在新/目标机器安装同版本 GitLab,先 gitlab-ctl reconfigure;将备份归档放到配置的 backup_path(默认 /var/opt/gitlab/backups),并确保文件属主为 git:git。
- 停止相关进程(两种常见组合,择一执行):
- 组合一(较新版本常见):sudo gitlab-ctl stop puma、sudo gitlab-ctl stop sidekiq
- 组合二(旧版本常见):sudo gitlab-ctl stop unicorn、sudo gitlab-ctl stop sidekiq
- 执行恢复(BACKUP 参数为“时间戳_版本号”,不含 “_gitlab_backup.tar” 后缀):
- 示例:sudo /opt/gitlab/bin/gitlab-backup restore BACKUP=1687460936_2023_06_22_14.3.3
- 启动与自检:sudo gitlab-ctl start,必要时执行 gitlab-rake gitlab:check SANITIZE=true 检查一致性。
- 恢复敏感配置与密钥:将事先备份的 /etc/gitlab/gitlab.rb、/etc/gitlab/gitlab-secrets.json 放回并重新加载:sudo gitlab-ctl reconfigure。