GitLab数据迁移及系统升级
一、技术背景
研发团队长时间使用低坂本gitlab,存在代码数据无法恢复风险
- 代码服务器较长时间没做升级
- gitlab使用低坂本管理,跨大版本较多,出现系统级别问题,备份数据tar文件较大,紧急恢复困难
- gitlab的数据恢复和服务版本号必须保持一致,高版本无法恢复低坂本数据;版本兼容性不够友好
二、方案设计
专人运维gitlab,时刻保持软件服务版本和备份数据版本最新
- gitlab升级时刻保持最新,定期升级系统服务
- 定期备份gitllab数据,保证备份数据关键版本
- 服务器迁移做好数据恢复策略,低坂本数据先做好同版本数据恢复,再做升级系统版本
本文中,以版本18.6.1做实验实现如下步骤:
- 配置gitlab备份恢复环境参数
- 配置数据库的访问角色及权限
- 备份数据
- 恢复数据
三、实现过程
按照方案中的实施步骤,记录实验过程
- 配置gitlab备份恢复环境参数
- 确认gitlab环境版本信息
bash
sudo gitlab-rake gitlab:env:info


- 修改备份策略
bash
sudo nano /etc/gitlab/gitlab.rb
查找关键字,打开备份策略开关
bash
gitlab_rails['manage_backup_path'] = true # 开启GitLab备份
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" # 备份路径
gitlab_rails['backup_archive_permissions'] = 0644 # 设置备份文件权限
gitlab_rails['backup_keep_time'] = 604800 # 备份保留时间。单位秒,默认7天

- 配置数据库的访问角色及权限
- 设置数据恢复权限参数
注:数据恢复操作时会报权限错误;数据备份时不会报错。
Gitlab恢复数据出现错误提示:
bash
Restoring PostgreSQL database gitlabhq_production ... ERROR: must be owner of extension pg_trgm
ERROR: must be owner of extension btree_gist
ERROR: must be owner of extension btree_gist
ERROR: must be owner of extension pg_trgm
- 修改postgresql主配置,搜索关键字listen_addresses,增加*号
bash
sudo nano /var/opt/gitlab/postgresql/data/postgresql.conf

- 修改postgresql数据权限配置,最末行增加2行local和host的信任权限
bash
sudo nano /var/opt/gitlab/postgresql/data/pg_hba.conf

- 重启gitlab服务
bash
sudo gitlab-ctl restart

- 修改gitlab账号为超级用户
切换gitlab-psql身份,并连接嵌入式psql,数据库脚本修改gitlab角色类型:ALTER USER gitlab WITH SUPERUSER;最后退出gitlab-qsql身份,完成设置。
bash
attagain@attagain:~$ sudo su - gitlab-psql
$ /opt/gitlab/embedded/bin/psql -h 127.0.0.1 gitlabhq_production
gitlabhq_production=# ALTER USER gitlab WITH SUPERUSER;
gitlabhq_production=# \q
$ exit

- 备份数据
- 执行备份命令
注:设置好自动部署策略,系统任务定时执行
bash
sudo gitlab-rake gitlab:backup:create RAILS_ENV=production


备份名:1765028141_2025_12_06_18.6.1-ee
注:警告提示信息,主要描述备份内容不包括gitlab.rb中的配置信息,也不包括gitlab-secrets.json中的安全策略信息。如果需要,环境信息的备份,需要自行人工另行单独备份。
- 确认备份结果
注:在gitlab.rb中配置有备份路径:sudo ls -lrth /var/opt/gitlab/backups/
bash
sudo ls -lrth /var/opt/gitlab/backups/

根据需要,备份文件需要定时转移到备份存储空间归档。
备份策略:从 GitLab 8.17 开始,可使用 STRATEGY=copy 参数,先拷贝数据至临时路径再归档,避免错误,但需额外磁盘空间。
bash
sudo gitlab-rake gitlab:backup:create STRATEGY=copy
增量备份:通过设置 GZIP_RSYNCABLE=yes 选项,生成支持 rsync 差异传输的归档文件,但需系统支持 gzip 的 rsyncable 功能。
- 恢复数据
- 准备工作,确认备份数据版本和gitlab版本一致
确认gitlab当前版本信息
bash
sudo cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

确认备份文件,提取备份文件名:
bash
sudo ls -lrth /var/opt/gitlab/backups/

备份名:1765028141_2025_12_06_18.6.1-ee
- 停止相关服务,并确认状态
数据访问服务:puma和sidekiq
用户入口服务:nginx
bash
sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq
sudo gitlab-ctl stop nginx
sudo gitlab-ctl status

- 数据恢复
bash
sudo gitlab-rake gitlab:backup:restore RAILS_ENV=production BACKUP=1765028141_2025_12_06_18.6.1-ee

注:一定要确认相关服务关闭;恢复操作会删除所有现有数据。
输入yes,确认恢复数据,根据生产环境数据大小,恢复时间不同,请耐心等待。


数据恢复完成,再次确认重建权限认证信息,输入yes

- 配置及参数恢复
复制备份的gitlab.rb和gitlab-secrets.json文件,到/etc/gitlab/
bash
ll ./gitlab-cfg-bk/

bash
sudo ls -l /etc/gitlab/

bash
sudo cp -f ./gitlab-cfg-bk/* /etc/gitlab/
- 重新配置gitlab,并重新启动
bash
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart

- web登陆确认gitlab,数据恢复结果
登陆欢迎界面:

项目数据确认:

- 重置root用户密码
注:此步骤为非必选项
通常备份数据中保存有原有用户完整数据,直接使用即可。如果确实忘记了root等用户密码,可按照如下步骤实现。
Rails控制台方式,使用ruby脚本进行重置。
- 登陆rails控制台
bash
sudo gitlab-rails console -e production

- Ruby脚本查询root用户
用户名、id、邮件(默认邮箱:gitlab_admin_01ada9@example.com),3种查询方式获取用户。
ruby
user = User.find_by_username 'root'
user = User.find(1)
user = User.find_by(email: 'gitlab_admin_01ada9@example.com')
user = User.find_by(username: 'root')

- Ruby脚本设置重置密码
获取随机密码(亦可设置一个固定密码: new_password = 'abcd.1234')
ruby
new_password = ::User.random_password
# new_password = 'abcd.1234'
user.password = new_password
user.password_confirmation = new_password
user.password_automatically_set = false

- 通知用户,管理员修改了密码
注:通知操作可选
ruby
user.send_only_admin_changed_your_password_notification!

- 保存用户信息更改,并退出控制台
ruby
user.save!
exit

- 直接修改数据库的方式
注:需要的登陆数据库环境,执行修改用户密码命令
首先,使用ruby生成一个加密后的密码,sql脚本更新用户密码时备用。
注: ruby使用bcrypt工具,需要安装编译工具及开发环境,本文不再追述。
bash
ruby -v
irb

ruby
require 'bcrypt'
password = BCrypt::Password.create("abcd.1234")
puts password

生成备用密码:2a12$2hTrPZ45XPJTCMH9CLsyz.Vuq8Ms8stjdct354wP1YosMIp91x.6i
登陆qsql环境
bash
sudo gitlab-psql -d gitlabhq_production

查询root用户
sql
gitlabhq_production=# SELECT id FROM users WHERE username='root';

更新用户密码
sql
gitlabhq_production=# UPDATE users SET password_digest='$2a$12$2hTrPZ45XPJTCMH9CLsyz.Vuq8Ms8stjdct354wP1YosMIp91x.6i', encrypted_otp='', otp_secret='' WHERE id=1;

注:保存退出时报错,无系统root用户权限,需要设置权限。因此,此种方法不建议使用,可能引起生产环境安全问题。
- gitlab系统升级
注:此步骤为非必选项, 本例子以CentOS7,gitlab-ee-14.9.3为例,升级到18.6.1版本
新版本的gitlab,除了与时俱进提供新的功能外,同时也会修复已知的缺陷。建议具有条件的话,升级使用最新版本。升级前,请做好备份工作。
- 关闭用户端访问入口
关闭nginx服务,阻断业务继续访问。
bash
sudo gitlab-ctl stop nginx
sudo gitlab-ctl status nginx

注:切记,不要关闭gitlab-psql服务,更不要关闭所有gitlab服务。在升级过程中,检查数据库步骤,可能因为无法连接数据库而终止升级
- 备份当前配置
bash
sudo cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.bak
- 升级gitlab
Ubuntu系统升级
bash
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
apt-cache policy gitlab-ee
sudo apt-get install gitlab-ee=18.6.1-ee.0 -y



注:已经是最新版本,没有更新
或者
CentOS7版本升级,gitlab最高支持到17.7.7版本。
根据当前版本,依据官网提供的版本升级路径,按照版本逐级升级,确认数据结果。
以14.10.5版本为例:gitlab-ee-14.10.5-ee.0.el7.x86_64.rpm,下载离线包安装
Gitlab官方网站:[gitlab-ee-14.10.5-ee.0.el7.x86_64.rpm](https://packages.gitlab.com/app/gitlab/gitlab-ee/search?q=14.10.5&filter=rpms&filter=rpms&dist=)
安装离线报
bash
yum install -y ./gitlab-ee-14.10.5-ee.0.el7.x86_64.rpm


低版本升级约束:14.9.3->17.5.X
版本跨度过大导致的错误提示,通常每次只能升级1个大版本:

官网升级路径:
less
14.0.12 => 14.3.6
14.3.6 => 14.9.5
14.9.5 => 14.10.5
14.10.5 => 15.0.5
15.0.5 => 15.4.6
15.4.6 => 15.11.13
15.11.13 => 16.3.9
16.3.9 => 16.7.10
16.7.10 => 16.11.10
16.11.10 => 17.1.8
17.1.8 => 17.3.7
17.3.7 => 17.5.5
17.5.5 => 17.8.7
17.8.7 => 17.11.6
- 重新配置gitlab
bash
sudo gitlab-ctl reconfigure


- 重启gitlab服务
bash
sudo gitlab-ctl start

- 检查服务状态
bash
sudo gitlab-ctl status

- 查看gitlab日志
bash
sudo gitlab-ctl tail
- 确认系统升级后版本,并确认网页访问结果是否存在异常
bash
sudo cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

参考官网文档:https://docs.gitlab.com/18.6/update/
四、结论
常备常新,运维不慌