Ubuntu 上 GitLab 数据迁移与同步实操指南
一 迁移准备与版本要求
- 建议在新服务器安装与旧服务器完全一致的 GitLab 版本(包括小版本),以避免恢复失败或数据不一致。查看版本命令:cat /opt/gitlab/embedded/service/gitlab-rails/VERSION。若需离线安装,可在 packages.gitlab.com 下载对应 .deb 包后用 dpkg -i 安装。迁移前规划好 external_url(/etc/gitlab/gitlab.rb),并确保新旧实例网络、端口可达。
二 标准迁移步骤 Omnibus 包
- 旧服务器备份
- 在旧实例正常运行时执行备份:gitlab-rake gitlab:backup:create。备份默认生成于 /var/opt/gitlab/backups/,文件名通常包含时间戳与版本号,例如:1658368484_2022_07_21_14.8.2_gitlab_backup.tar。同时按提示妥善备份 /etc/gitlab/gitlab.rb 与 /etc/gitlab/gitlab-secrets.json(密钥与加密配置,迁移时必须一致)。
- 新服务器恢复
- 将备份 tar 包拷贝到新服务器的 /var/opt/gitlab/backups/,必要时修正权限(如 chmod 777 备份文件,或至少保证 git 用户可读)。为减少写入冲突,恢复前停止相关进程:gitlab-ctl stop unicorn;gitlab-ctl stop sidekiq。执行恢复:gitlab-rake gitlab:backup:restore BACKUP=1658368484_2022_07_21_14.8.2(BACKUP=后填文件名中“时间戳_日期_版本”的前半段,不含 “_gitlab_backup.tar” 后缀)。恢复过程中会有两次确认,输入 yes。完成后启动:gitlab-ctl start。
- 配置与密钥
- 将旧实例的 /etc/gitlab/gitlab-secrets.json 覆盖到新实例相同路径(覆盖前先备份原文件),然后执行 gitlab-ctl reconfigure 使配置生效。访问 external_url 验证登录与项目是否完整;必要时在 Rails 控制台重置管理员密码:gitlab-rails console → u = User.where(username: ‘root’).first → u.password=‘新密码’ → u.password_confirmation=‘新密码’ → u.save! → exit。
三 迁移后常见问题与修复
- 页面 500 或删除项目失败(加密 token 不匹配)
- 现象常见于未正确覆盖 gitlab-secrets.json 或实例间密钥不一致。进入数据库(gitlab-psql -d gitlabhq_production 或 gitlab-rails dbconsole),按需清空相关加密 token,例如: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; 然后重启服务再测。
- 恢复时数据库扩展权限报错
- 例如 “ERROR: must be owner of extension pg_trgm/btree_gist”。这是 Omnibus 恢复常见提示,通常可安全忽略,继续恢复流程即可。
- 备份文件名与 BACKUP 参数不一致
- 若备份文件名为 1599223012_2020_09_04_13.2.3_gitlab_backup.tar,而 BACKUP 只填了时间戳 1599223012,恢复会找不到文件。可将文件重命名为 1599223012_gitlab_backup.tar 再恢复,或确保 BACKUP 值与文件名前缀完全一致。
四 实时同步与高可用思路
- 文件级近实时同步(备机可快速接管)
- 关键目录包括:repositories、uploads、builds、artifacts、lfs、registry、pages 等。可在主机用 lsyncd + rsync 或 inotify + rsync 实时推送变更到备机对应目录;同时务必同步 /etc/gitlab/gitlab-secrets.json。注意数据库证书如 server.crt/server.key 不参与同步,避免备机启动时证书不一致。该方案用于“快速切换”的准热备,备机仍需人工启用服务。
- 数据库层主从 + 文件层同步
- 为降低 RTO,可部署 PostgreSQL 主从(或外部数据库的主从),同时对仓库与附件等文件目录做 rsync 实时或定时同步。此方式实现数据冗余与故障切换基础,但应用层(如 Sidekiq、Unicorn)仍需在主备切换时手动或脚本化接管。
- 跨平台镜像同步(研发协作场景)
- 若目标是将代码镜像到 GitHub/Gitee,可在项目“设置 → 仓库 → 镜像仓库”配置远端地址与 Personal Access Token 实现自动推送/拉取。注意平台对镜像方向、对象大小与 LFS 的支持差异,必要时采用手动或 CI 脚本补充同步。
五 关键目录与配置一览
| 项 |
默认路径 |
迁移/同步要点 |
| 备份包 |
/var/opt/gitlab/backups/ |
由 gitlab-rake gitlab:backup:create 生成;恢复用 BACKUP=时间戳_日期_版本(不含后缀) |
| 仓库数据 |
/var/opt/gitlab/git-data/repositories |
文件级同步核心目录;可用 rsync/lsyncd 近实时同步 |
| 附件与上传 |
/var/opt/gitlab/uploads |
附件、头像等,需纳入同步 |
| CI 产物与日志 |
/var/opt/gitlab/builds、/var/opt/gitlab/artifacts |
构建与产物,建议纳入同步 |
| LFS 对象 |
/var/opt/gitlab/gitlab-rails/shared/lfs-objects |
大文件对象,建议纳入同步 |
| 容器镜像 |
/var/opt/gitlab/registry |
若启用容器注册表,需同步镜像数据 |
| 配置与密钥 |
/etc/gitlab/gitlab.rb、/etc/gitlab/gitlab-secrets.json |
迁移时必须一致;secrets.json 决定加密与认证一致性 |
| 自定义仓库目录 |
由 git_data_dirs 指定 |
若修改了默认路径,备份/恢复与同步需对齐该路径 |
| 以上路径与要点适用于 Omnibus 安装;若自定义了存储路径,请在 /etc/gitlab/gitlab.rb 中核对 git_data_dirs 等配置后再执行迁移与同步。 |
|
|