GitLab从CentOS7迁移到Kylin Server 10 SP2(含仓库、用户等配置)
Gitlab迁移
信创改造,需要将GitLab从CentOS7迁移到Kylin Server 10 SP2(含仓库、用户等配置),记录其中遇到的问题。
下载
通过如下命令查看Centos7上安装的Gitlab版本,我的是gitlab-ce-16.11.5-ce.0.el7.x86_64版本。
rpm -qa | grep gitlab-ce
cat /opt/gitlab/version-manifest.txt | head -1
新旧服务器GitLab CE/EE版本必须完全相同(如16.11.5,不能跨大版本),麒麟用el8 RPM包(麒麟V10兼容RHEL8生态),如果下载el7或者el9的RMP包安装时会异常,下载链接。

安装
Kylin服务器上执行rpm -ivh gitlab-ce-16.11.5-ce.0.el8.x86_64.rpm等待安装完成即可。

备份
# Centos7停机
gitlab-ctl stop
gitlab-ctl status
# Centos7启动这两项备份依赖服务
gitlab-ctl start postgresql gitaly
# 完整备份,包含仓库、用户、CI制品、LFS、容器镜像
# 备份文件路径:/var/opt/gitlab/backups/
# 文件格式:1780000000_2026_06_29_16.8.1_gitlab_backup.tar
# 记录时间戳:1780000000_2026_06_29_16.8.1
gitlab-backup create

拷贝
# 备份仓库、用户等文件,备份文件路径一定要放在/var/opt/gitlab/backups目录,否则执行还原的时候会报错
scp /var/opt/gitlab/backups/1784598136_2026_07_21_16.11.5_gitlab_backup.tar root@10.122.10.215:/var/opt/gitlab/backups
# 备份配置文件,主要修改了external_url访问地址和端口
scp /etc/gitlab/gitlab.rb root@10.122.10.215:/etc/gitlab
# 备份加密密钥文件,默认新安装机器没该文件
scp /etc/gitlab/gitlab-secrets.json root@10.122.10.215:/etc/gitlab
还原
# 更新配置,上一步替换了gitlab.rb、gitlab-secrets.json,先执行了该步骤,估计可以省略后面再执行该步骤
gitlab-ctl reconfigure
# 设置权限,备份文件属主必须是git:git,否则执行还原的时候会报错
chown git:git 1784598136_2026_07_21_16.11.5_gitlab_backup.tar
chmod 600 1784598136_2026_07_21_16.11.5_gitlab_backup.tar
# 恢复备份,文件名只需要填备份文件名中的时间戳
gitlab-backup restore BACKUP=1784598136_2026_07_21_16.11.5
启动
# 更新配置
gitlab-ctl reconfigure
# 重启
gitlab-ctl restart
# 查看状态
gitlab-ctl status
# 放开防火墙
firewall-cmd --zone=public --add-port=80/tcp --permanent
systemctl reload firewalld
# 设置自启动
systemctl enable gitlab-runsvdir.service
systemctl status gitlab-runsvdir.service
当gitlab.rb使用默认文件时,external_url配置为external_url 'http://gitlab.example.com',gitlab默认通过主机ip的80端口访问如http://10.122.10.215,此时虽然能正常访问,但是项目显示的克隆地址是git@gitlab.example.com:xxx/xxx.git,未显示真实Ip无法拉取,手动修改为git@10.122.10.215:xxx/xxx.git才可拉取。
测试
通过Idea拉取git@10.122.10.215:xxx/xxx.git项目,提示Clone failed。是由于搭建迁移后的GitLab服务器,操作系统SSH主机密钥和旧服务器不一样,Windows本地 .ssh/known_hosts 保存了旧服务器的指纹,SSH 认为中间人攻击,直接拒绝连接,删除该文件重新拉取即可。


代理访问
有时候,当需要同时在生产网和测试网访问Gitlab时,可以通过带双网卡的前置Nginx代理访问,同时支持Http和SSH访问,且可以将页面的克隆地址改成代理地址,需要--with-stream和--with-http_sub_module模块的支持,无需更改Gitlab配置。
# stream模块ssh协议代理
server {
listen 10.122.10.218:9022;
proxy_pass 10.122.10.215:22;
}
server {
listen 10.11.42.218:9022;
proxy_pass 10.122.10.215:22;
}
# Http协议代理,proxy_set_header Host必须是$http_host参数带端口,否则会导致转发后无法访问
# =============================================
# 生产入口:10.122.10.218:9080
# =============================================
server {
listen 10.122.10.218:9080;
server_name 10.122.10.218;
location / {
proxy_pass http://10.122.10.215:80;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 生产网段:把后端GitLab原生地址替换为【生产代理地址】
sub_filter "http://10.122.10.215" "http://10.122.10.218:9080";
sub_filter "git@10.122.10.215:" "ssh://git@10.122.10.218:9022/";
sub_filter_once off;
sub_filter_types application/json text/plain;
}
}
# =============================================
# 测试入口:10.11.42.218:9080
# =============================================
server {
listen 10.11.42.218:9080;
server_name 10.11.42.218;
location / {
proxy_pass http://10.122.10.215:80;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 测试网段:后端原生地址替换为【测试代理地址】
sub_filter "http://10.122.10.215" "http://10.11.42.218:9080";
sub_filter "git@10.122.10.215:" "ssh://git@10.11.42.218:9022/";
sub_filter_once off;
sub_filter_types application/json text/plain;
}
}
此时,可以同时通过http://10.122.10.215 Gitlab部署机器和http://10.122.10.218:9080 Nginx代理访问,需要注意的是,通过SSH协议克隆地址的时候git clone git@10.122.10.215:cznsh/tl/weloan/ccc.git是简写形式隐式使用SSH协议,但缺乏直接指定端口号的机制,由于代理协议有端口,使用完整的SSH URL格式,在URL中显式指定端口号git clone ssh://git@10.122.10.218:9022/cznsh/tc.git,否则会拉取失败。当在~/.ssh/config文件配置密钥时,需要指定的Ip为代理地址10.122.10.218而不是10.122.10.215,否则会一直提示输入10.122.10.218的密码而无法拉取仓库。如果拉取失败,可以通过ssh -p 9022 git@10.122.10.218 -v命令测试连通性过程详情。