Debian下GitLab的数据迁移步骤是什么
小樊
36
2025-12-23 03:15:48
Debian下GitLab数据迁移步骤
一 迁移前准备
- 确认版本一致:在两台机器上查看版本,确保新服务器安装与旧服务器完全相同的 GitLab 版本(CE 或 EE)。命令:cat /opt/gitlab/embedded/service/gitlab-rails/VERSION。若不一致,先升级旧实例或在新实例安装对应版本。
- 备份敏感配置与密钥:除仓库数据外,还需迁移配置文件与密钥文件,避免加密字段(如 Runner 令牌、CI JWT 密钥)无法解密。
- 配置文件:/etc/gitlab/gitlab.rb
- 密钥文件:/etc/gitlab/gitlab-secrets.json
- 规划网络与访问:在新服务器设置好 external_url(域名或 IP),以及防火墙放行 80/443/22(如启用 SSH 克隆)。
- 备份目录与权限:默认备份目录为 /var/opt/gitlab/backups,确保运行 gitlab-rake 的用户(通常为 git)对该目录有读写权限。
二 旧服务器备份
- 执行备份:创建包含仓库、数据库与上传等的完整备份。命令:sudo gitlab-rake gitlab:backup:create。备份文件默认位于 /var/opt/gitlab/backups,文件名形如 TIMESTAMP_YYYY_MM_DD_VERSION_gitlab_backup.tar。
- 单独备份配置与密钥:将 /etc/gitlab/gitlab.rb 与 /etc/gitlab/gitlab-secrets.json 复制到安全位置,后续一并迁移。
- 可选停机建议:为减少备份时写入,可在低峰期临时停止相关服务(见下一步的停止命令),备份完成后再启动。
三 新服务器恢复
- 安装同版本 GitLab:在 Debian 上添加 GitLab 仓库并安装与旧服务器一致的版本(CE 或 EE),然后执行 sudo gitlab-ctl reconfigure 完成初始化。
- 传输备份与配置:将备份 tar 包复制到新服务器的 /var/opt/gitlab/backups;将 gitlab.rb 与 gitlab-secrets.json 覆盖到 /etc/gitlab/。
- 设置备份文件权限:确保备份文件可被 git 用户读取,例如:sudo chown git:git /var/opt/gitlab/backups/*.tar。
- 停止写入服务:为保持一致性,恢复前停止应用与任务服务:sudo gitlab-ctl stop unicorn;sudo gitlab-ctl stop sidekiq。
- 执行恢复:进入备份目录(默认 /var/opt/gitlab/backups),执行恢复命令。注意 BACKUP 参数只填时间戳部分(不含 “_gitlab_backup.tar” 后缀)。示例:sudo gitlab-rake gitlab:backup:restore BACKUP=1658368484_2022_07_21_14.8.2。过程中会出现覆盖提示,输入 yes 确认。
- 启动与重载:恢复完成后执行 sudo gitlab-ctl reconfigure;sudo gitlab-ctl start。
四 迁移后验证与常见问题
- 功能与数据校验:登录新实例,核对项目数量、分支/标签、提交历史、用户与权限、Webhooks、CI/CD 流水线等是否完整可用;进行克隆、推送、合并请求、Pipeline 触发等场景测试。
- 版本不匹配与 EE 标识:若恢复时报 “GitLab version mismatch”,说明新旧版本不一致,需安装相同版本;若是 EE 版,恢复时 BACKUP 参数仍需填写时间戳(不需要额外加 “-ee” 后缀,但镜像与安装包必须为 EE)。
- 加密令牌异常(如项目 500 错误):若因加密密钥不一致导致 Runner/CI 令牌无法解密,可在 Rails 控制台或 psql 中清空相关加密字段后重试(仅在确认安全可控时执行):
- UPDATE projects SET runners_token = null, runners_token_encrypted = null;
- UPDATE namespaces SET runners_token = null, runners_token_encrypted = null;
- UPDATE application_settings SET runners_registration_token_encrypted = null;
- UPDATE application_settings SET encrypted_ci_jwt_signing_key = null;
- UPDATE ci_runners SET token = null, token_encrypted = null;
- 备份保留策略:如需调整保留天数,在 /etc/gitlab/gitlab.rb 中设置 gitlab_rails[‘backup_keep_time’](单位秒),例如保留 2 天:gitlab_rails[‘backup_keep_time’] = 172800。
五 附加 仅迁移部分项目的替代方案
- 若不需要整实例迁移,可逐项目迁移:在旧实例克隆裸仓库,修改远程地址推送到新实例,实现仓库与历史一致。示例:
- git clone --mirror https://old-gitlab-url/group/project.git
- cd project.git
- git remote set-url origin https://new-gitlab-url/group/project.git
- git push --mirror
- 注意:此方法不会迁移用户、权限、组、Webhooks、CI/CD 配置等实例级对象,适合点对点项目迁移。