GitLab数据备迁移及系统升级

GitLab数据迁移及系统升级

一、技术背景

研发团队长时间使用低坂本gitlab,存在代码数据无法恢复风险

  • 代码服务器较长时间没做升级
  • gitlab使用低坂本管理,跨大版本较多,出现系统级别问题,备份数据tar文件较大,紧急恢复困难
  • gitlab的数据恢复和服务版本号必须保持一致,高版本无法恢复低坂本数据;版本兼容性不够友好

二、方案设计

专人运维gitlab,时刻保持软件服务版本和备份数据版本最新

  • gitlab升级时刻保持最新,定期升级系统服务
  • 定期备份gitllab数据,保证备份数据关键版本
  • 服务器迁移做好数据恢复策略,低坂本数据先做好同版本数据恢复,再做升级系统版本

本文中,以版本18.6.1做实验实现如下步骤:

  • 配置gitlab备份恢复环境参数
  • 配置数据库的访问角色及权限
  • 备份数据
  • 恢复数据

三、实现过程

按照方案中的实施步骤,记录实验过程

  1. 配置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天

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/cd696cacaeba48e0ba233965f6b8d6cb.png

  • 重新配置gitlab环境
bash 复制代码
sudo gitlab-ctl reconfigure
  1. 配置数据库的访问角色及权限
  • 设置数据恢复权限参数
    注:数据恢复操作时会报权限错误;数据备份时不会报错。
    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
  1. 备份数据
  • 执行备份命令
    注:设置好自动部署策略,系统任务定时执行
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 功能。‌

  1. 恢复数据
  • 准备工作,确认备份数据版本和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,数据恢复结果
    登陆欢迎界面:

    项目数据确认:
  1. 重置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用户权限,需要设置权限。因此,此种方法不建议使用,可能引起生产环境安全问题。

  1. 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/

四、结论

常备常新,运维不慌

相关推荐
weixin_448855771 小时前
自动化构建、测试、部署(上)
运维·自动化
G_Cloudpipe1 小时前
Nginx 服务器部署
运维·服务器·nginx
梁正雄1 小时前
9、Python面向对象编程-1
服务器·开发语言·python
忘忧记1 小时前
典型局域网组建方案简介
运维·网络·智能路由器
测试人社区—52721 小时前
破茧成蝶:DevOps流水线测试环节的效能跃迁之路
运维·前端·人工智能·git·测试工具·自动化·devops
刘家炫1 小时前
Linux 基于 Epoll 的主从 Reactor 多线程模型
linux·服务器·reactor·项目·多路转接
qq_348231852 小时前
Spring Boot 项目各模块整合
运维·jenkins
郝学胜-神的一滴2 小时前
Linux信号集操作函数详解
linux·服务器·开发语言·c++·程序人生
eggrall2 小时前
Linux 基础开发工具 —— 解锁高效开发的底层密钥
linux·运维·服务器