GitLab迁移与逐步升级

277 阅读3分钟

我们本次进行迁移和升级的原因是因为原本部署的GitLab版本号为17.1.1,云厂商和GitLab官方都提示有严重漏洞GitLab身份认证绕过漏洞(CVE-2024-6385),再加上原本是直接部署在宿主机上,现在为了方便管理,使用Docker统一部署所有服务,所以需要将GitLab迁移到Docker中并升级至17.5.4版本。

由于GitLab官方原因,我们升级时需要按照特定的升级路线逐步升级,大家可以根据自己的情况和部署方式在GitLab升级路线工具查看具体的升级步骤。而且不同版本的备份数据并不能直接使用,所以我们需要按照以下步骤进行迁移和升级操作(为了描述方便,我们简称启动在宿主机上的GitLab为GitLab服务,称启动在Docker中的GitLab为GitLab容器):

  1. 备份GitLab服务的数据
  2. 创建并启动GitLab容器
  3. GitLab容器中恢复数据
  4. GitLab容器逐步升级
  5. 停止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观察是否有完整数据,确认无误则迁移完成

四、逐步升级

接下来我们将按照官方的升级路线逐步升级至我们的目标版本,这里每次版本升级的操作都一样,大家循环操作本步骤即可 image.png 官方生成的升级路径如图,我们需要先升级至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.14.2的步骤进行逐步升级即可