公司想节约项目服务器开支,针对一些测试站和 gitlab 服务器,想要统一迁移到本地机房。

一些测试站不必说,php 项目在 gitlab 里有仓库,只要到新的服务器重新 clone 一份就好;java 项目可以重新打包部署;数据库部分可以通过 navicat 备份,然后在新的数据库创建后还原。所以关键点还是在于 gitlab 的备份迁移。

一开始百度到的教程(参考:如何将GIT存储库从一台服务器迁移到新服务器how-to-migrate-git-repository-from-one-server-to-a-new-onegit项目迁移),都是针对一个仓库的迁移,具体操作有两种方法:

gitlab 项目迁移

git remote add new_repo_name new_repo_url
git push new_repo_name master
git remote rm origin
git push new_repo_name master
git clone --mirror [oldUrl]
cd the_repo
git remote add remoteName newRepoUrl
git push -f --tags remoteName refs/heads/*:refs/heads/*

可以看出,前一个方法是迁移了一个项目的主干,后面则是迁移一个项目的所有分支和tags。

但因为当前 gitlab 上已经积累了很多的项目,且部分项目并不在我的权限范围内,所以最好能够像数据库一样,可以做到备份后直接还原,而非一个一个项目去迁移。还有各个账号及其管理权限,这些恢复起来都是比较繁琐的。

功夫不负有心人,果然还是找到了教程(【TiDB】五种Gitlab之间的数据迁移方法,主要参考:GitLab备份与恢复/迁移方案)。

注意:gitlab 工具备份与还原需要导出备份的 gitlab 与新服务器中的 gitlab 版本一致,否则会还原失败

查看 gitlab 版本:sudo gitlab-rake gitlab:env:info 或者 cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

gitlab 备份:

gitlab-backup create
或
gitlab-rake gitlab:backup:create

gitlab 备份还原

gitlab-backup restore force=yes BACKUP=1685949497_2023_06_05_14.1.1
# 1685949497_2023_06_05_14.1.1 属于备份文件的名称时间戳部分

如果 gitlab 版本不一致,会报错:

...
GitLab version mismatch:
  Your current GitLab version (16.0.1) differs from the GitLab version in the backup!
  Please switch to the following version and try again:
  version: 14.1.1


Hint: git checkout v14.1.1
...

迁移过程中出现过一个 must be owner of extension plpgsql 的 PostgreSQL 报错,但不影响,实际备份还原成功了。如果想要再次还原的时候不出现,可以按照教程在备份 gitlab 服务器上修改:Gitlab恢复数据报错解决方法