我们本次进行迁移和升级的原因是因为原本部署的GitLab版本号为17.1.1,云厂商和GitLab官方都提示有严重漏洞GitLab身份认证绕过漏洞(CVE-2024-6385),再加上原本是直接部署在宿主机上,现在为了方便管理,使用Docker统一部署所有服务,所以需要将GitLab迁移到Docker中并升级至17.5.4版本。
由于GitLab官方原因,我们升级时需要按照特定的升级路线逐步升级,大家可以根据自己的情况和部署方式在GitLab升级路线工具查看具体的升级步骤。而且不同版本的备份数据并不能直接使用,所以我们需要按照以下步骤进行迁移和升级操作(为了描述方便,我们简称启动在宿主机上的GitLab为GitLab服务,称启动在Docker中的GitLab为GitLab容器):
- 备份
GitLab服务的数据 - 创建并启动
GitLab容器 - 在
GitLab容器中恢复数据 GitLab容器逐步升级- 停止
GitLab服务
一、备份GitLab服务
为了确保原有数据的完整性,我们需要先进行备份操作。该命令将会帮我们备份数据库、配置文件、存储库数据等等
sudo gitlab-rake gitlab:backup:create
生成的备份文件会存放在/var/opt/gitlab/backups/下
二、创建GitLab容器
为了方便后续调整,我们使用Docker Compose进行配置,配置文件内容参考下方:
services:
gitlab:
image: 'gitlab/gitlab-ce:17.1.1-ce.0'
container_name: gitlab-ce
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.example.com'
nginx['enable'] = true
nginx['listen_https'] = true
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.example.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.example.com.key"
gitlab_rails['gitlab_shell_ssh_port'] = 12422
prometheus['enable'] = false
# 设置时区和语言
gitlab_rails['default_user_language'] = 'zh'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
ports:
- "80:80"
- "443:443"
- "22:22"
volumes:
- './config:/etc/gitlab'
- './logs:/var/log/gitlab'
- './data:/var/opt/gitlab'
- './certs:/etc/gitlab/ssl'
- './backups:/var/opt/gitlab/backups'
执行以下命令创建GitLab容器:
docker compose up -d
三、恢复数据
GitLab容器创建成功以后进入容器恢复备份数据。在这之前我们需要将前面生成的备份文件,即存放在/var/opt/gitlab/backups/下的.tar文件移动至挂载的./backups目录下,进入容器并能看到指定路径下有备份文件:
# 进入容器
docker exec -ti gitlab-ce bash
# 查看备份文件
ll -l /var/opt/gitlab/backups
# 把备份文件移动到挂载目录下
cp /var/opt/gitlab/backups/* ./backups
![[Pasted image 20241212180107.png]]
确认备份文件存在后执行恢复命令,1733991867_2024_12_12_17.1.1是备份文件名称去除掉_gitlab_backup.tar后缀的部分:
gitlab-rake gitlab:backup:restore BACKUP=1733991867_2024_12_12_17.1.1
备份完成后可以打开对应的域名或地址访问GitLab观察是否有完整数据,确认无误则迁移完成
四、逐步升级
接下来我们将按照官方的升级路线逐步升级至我们的目标版本,这里每次版本升级的操作都一样,大家循环操作本步骤即可
官方生成的升级路径如图,我们需要先升级至
17.3.7版本:
4.1 备份数据
每次升级前都先备份数据,以防意外:
gitlab-rake gitlab:backup:create
4.2 修改Docker-Compose文件
修改docker-compose.yml配置文件,将镜像版本号修改为目标版本号,这里是17.3.7:
image: 'gitlab/gitlab-ce:17.3.7-ce.0'
其他配置项保持不变,接下来我们重新创建GitLab容器:
docker compose down
docker compose up -d --force-recreate
升级并启动成功后我们进入容器内检查服务启动情况:
docker exec -ti gitlab-ce /bin/bash
gitlab-ctl status
启动无误后,我们再刷新配置并执行数据库迁移命令:
gitlab-ctl reconfigure
gitlab-rake db:migrate
打开对应的域名或地址访问GitLab观察是否有完整数据,确认无误则本次升级完成,后续再重复4.1和4.2的步骤进行逐步升级即可