通过Docker安装的Gitlab (10.6.3) 迁移数据及升级过程记录

写在前面的话,更新、重启过程中Gitlab会频繁出现502错误,耐心等待几分钟再刷新即可,它正在编译重启,具体日志可以通过docker logs -f <容器id>查看

注意,此笔记的系统为Ubuntu20.04,因系统差异导致的命令不同,请注意区别

查询原服务器Gitlab版本

通过镜像版本号判断

docker ps

Gitlab版本号

由图可以看出版本号为10.6.2

进入容器内查询

Step1:查询容器ID

# 查看容器ID
docker ps

Gitlab版本号

Step2: 进入容器

docker exec -it <container_id> /bin/bash

Step3: 查看版本信息

gitlab-rake gitlab:env:info
#退出容器命令
exit

这将显示包括 GitLab 版本在内的大量有关 GitLab 环境的信息。您可以查找 "GitLab information" 部分,其中将包含 GitLab 的版本信息。

GitLab环境信息

在新服务器中安装Docker

在 Ubuntu 上安装 Docker 非常直接。我们将会启用 Docker 软件源,导入 GPG key,并且安装软件包。

Step1: 首先,更新软件包索引,并且安装必要的依赖软件,来添加一个新的 HTTPS 软件源:

sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

Step2: 使用 curl 导入源仓库的 GPG key:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Step3: 将 Docker APT 软件源添加到你的系统:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

现在,Docker 软件源被启用了,你可以安装软件源中任何可用的 Docker 版本。

Step4: 安装Docker的最新版本

Docker版本对Gitlab迁移没有影响,如有其他需求,请自行寻找安装指定版本的教程
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

Step5: 一旦安装完成,Docker 服务将会自动启动。你可以输入下面的命令,验证它:

sudo systemctl status docker

输出将会类似下面这样:

docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2023-04-09 09:02:12 HKT; 6 months 2 days ago
     Docs: https://docs.docker.com
 Main PID: 1525 (dockerd)
    Tasks: 47
   Memory: 867.6M
      CPU: 2h 3min 30.236s
   CGroup: /system.slice/docker.service

当一个新的 Docker 发布时,你可以使用标准的sudo apt update && sudo apt upgrade流程来升级 Docker 软件包。

Step6: 如果你想阻止 Docker 自动更新,锁住它的版本:

sudo apt-mark hold docker-ce

Step7: 设置Docker自启动

systemctl enable docker

至此 Docker安装步骤已全部完成

在新服务器中安装Gitlab 10.6.2

由于Gitlab版本不同会有兼容问题,所以必须安装同版本进行数据迁移后再进行升级操作

这个安装步骤较为简单,直接pull对应版本的镜像即可:

docker pull gitlab/gitlab-ce:10.6.2-ce.0

拉取完成后不用创建容器,直接继续进行下面的步骤

备份原服务器Gitlab数据及配置文件

Step1: 进入容器

docker exec -it <container_id> /bin/bash

Step2: 备份数据

gitlab-rake gitlab:backup:create

由于我之前的gitlab容器没有将docker内部文件挂载至宿主机,所以还需要将备份文件复制到宿主机中:

#退出容器
exit
# 具体的备份路径,你可以查看你的配置文件是否指定了备份路径,也可以在docker容器中全局查询备份命令输出的文件名
# docker cp gitlab:/[备份路径]/文件名  /目标目录
docker cp gitlab:/var/opt/gitlab/backups/1696998584_2023_10_11_10.6.2_gitlab_backup.tar  /home/data
# 给文件777权限  SCP需要用到
chmod 777 1696998584_2023_10_11_10.6.2_gitlab_backup.tar

Step3:备份配置文件

# 10.6.2配置文件在容器内部/etc/gitlab文件夹下,我们需要将整个文件夹复制出来
docker cp  gitlab:/etc/gitlab  /home/data
# 文件夹给777 权限
chmod -R 777 ./gitlab

至此备份已经完成

新服务器启动Gitlab

docker run -itd  --name gitlab --hostname gitlab.suniot.cn -p 32772:80  -p 32771:443 -p  32773:22 -p 7001:7001 -v /home/docker/gitlab/config:/etc/gitlab -v /home/docker/gitlab/logs:/var/log/gitlab  -v /home/docker/gitlab/data:/var/opt/gitlab  gitlab/gitlab-ce:10.6.2-ce.0

解释一下几个参数

  1. --name gitlab:为容器指定一个名称,这里将容器命名为 "gitlab"。
  2. -p 32772:80-p 32771:443-p 32773:22-p 7001:7001:这些选项用于将容器内部的端口映射到主机上,以便外部可以访问容器的服务。例如:

    • -p 32772:80:将容器的80端口映射到主机的32772端口。
    • -p 32771:443:将容器的443端口映射到主机的32771端口。
    • -p 32773:22:将容器的22端口(SSH端口)映射到主机的32773端口。
    • -p 7001:7001:将容器的7001端口映射到主机的7001端口。
  3. -v /home/docker/gitlab/config:/etc/gitlab:这是用于挂载卷(volume)的选项,它将主机上的目录 /home/docker/gitlab/config 挂载到容器内的 /etc/gitlab 目录。这允许您将GitLab的配置文件存储在主机上,以便进行配置更改。其余几个-v同理
  4. gitlab/gitlab-ce:10.6.2-ce.0:指定要运行的 Docker 镜像的名称及版本

新服务器从原服务器拉取文件

由Gitlab启动命令可知容器数据挂载目录为/home/docker/gitlab/data、配置挂载目录为/home/docker/gitlab/config

Step1: 从原服务器拉取备份的配置文件

# 切换至配置文件外部挂载目录
cd /home/docker/gitlab/config
# 使用SCP拉取文件 执行命令后需要输入原服务器密码
scp -r root@[原服务器IP地址]:/home/data/gitlab/* /home/docker/gitlab/config

Step2: 从原服务器拉取备份的数据文件

# 切换至数据挂外部挂载目录
cd /home/docker/gitlab/data
# 使用SCP拉取文件 执行命令后需要输入原服务器密码
scp root@[原服务器IP地址]:/home/data/1696998584_2023_10_11_10.6.2_gitlab_backup.tar /home/docker/gitlab/data/backups

修改新服务器中的配置文件

其实不需要修改太多,只需要修改外部访问地址即可
# 进入配置文件目录
cd /home/docker/gitlab/config
# 编辑配置文件
vim gitlab.rb
# 将地址修改为新地址即可

Gitlab配置文件

恢复数据

Step1:进入容器

docker exec -it <container_id> /bin/bash

Step2: 停止部分服务

gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
#验证
gitlab-ctl status

停止服务验证

Step3: 为备份文件赋予执行权限

chmod -R 777 /home/docker/gitlab/data/backups

Step4: 执行恢复命令

# 备份文件编号备份的 tar 包数字部门,例如:1696932966_2023_10_10_10.6.2_gitlab_backup.tar,编号为:1696932966_2023_10_10_10.6.2
gitlab-rake gitlab:backup:restore BACKUP=1696932966_2023_10_10_10.6.2

会提示你将清空所有表,输入yes确认

清空所有表操作确认

最后会提示你重新生成所有key文件,输入yes确认

重新生成Key

Step5: 重启并验证

gitlab-ctl restart
gitlab-rake gitlab:check SANITIZE=true

服务状态

运行状态

更新并应用配置文件

我们之前修改了gitlab的配置文件,需要更新一下:

#进入容器
docker exec -it <container_id> /bin/bash
#重新配置
gitlab-ctl reconfigure
#重启
gitlab-ctl restart

测试功能是否正常

云服务器需要在控制台安全组放行gitlab使用的端口(32772、32771、32773、7001)

如果服务器的防火墙处于开启状态也需要放行gitlab使用的端口(32772、32771、32773、7001)

访问external_url的地址(http: //xxx.xx.xx.xx:7001),测试是否能正常登录,拉取推送代码即可

其他问题优化

开启SSH服务

上一任好像没有开启ssh拉取代码的方式,这次我们开启一下
# 进入容器
docker exec -it <container_id> /bin/bash
# 检查SSH服务是否正在运行
gitlab-ctl status
#如果SSH服务没有运行,您可以使用以下命令启动它
gitlab-ctl start ssh

还需要在gitlab.rb中添加SSH服务的相关信息(IP、端口)

# 进入容器
docker exec -it <container_id> /bin/bash
# 修改配置文件
vim /etc/gitlab/gitlab.rb
#添加以下配置
gitlab_rails['gitlab_shell_ssh_port'] = 32773
gitlab_rails['gitlab_ssh_host'] = '[服务器IP地址]'
# 保存退出
:wq
# 重新配置
gitlab-ctl reconfigure
# 重启
gitlab-ctl restart
#退出容器并验证是否能通过ssh拉取代码
exit

配置SSH

Gitlab升级至12.3(zh_CN last super)

升级路径中间可能有几个版本不能正常访问会显示500错误,不用管他继续往下面的版本更新即可

Step1: 确定当前版本和升级路径——gitlab升级只能逐个版本升级,不能跨版本,升级路径可在官网查看: 点我查看

Gitlab升级路径查询根据

Gitlab升级路径

如图所示,路径图的版本号可能有问题,以下方命令为准

汉化插件支持的最后一个版本为12.3.5,我们更新至12.3.5就可以了

根据我现在情况,升级的版本路线为10.6.2->10.6.6->10.8.7->11.11.8->12.0.12->12.1.17->12.3.5。总共是7个版本,单个版本的镜像在700MB大小,所以注意准备好磁盘空间。

Step2: gitlab版本升级

由于我们之前已经有备份数据了,所以不需要重新备份数据,直接升级即可,我这里有外网,就以外网为例了,内网用户可以参考这个链接
  1. 获取镜像
docker pull gitlab/gitlab-ce:10.6.6-ce.0docket
  1. 下载完成后,停止gitlab服务
docker stop <容器id> 
  1. 删除容器
docker rm <容器id>
  1. 创建并启动新gitlab容器
把之前启动Gitlab的命令改一下版本号即可
docker run -itd  --name gitlab --hostname gitlab.suniot.cn -p 32772:80  -p 32771:443 -p  32773:22 -p 7001:7001 -v /home/docker/gitlab/config:/etc/gitlab -v /home/docker/gitlab/logs:/var/log/gitlab  -v /home/docker/gitlab/data:/var/opt/gitlab  gitlab/gitlab-ce:10.6.6-ce.0
  1. 查看gitlab服务是否重启,如果没有重启人工重启即可
docker ps

Gitlab容器状态

未重启情况需要手动重启

docker start <容器id>    
  1. 如果是重启中,查看重启日志,重启时间一般较长,单个在5-8分钟左右
docker logs -f <容器id>

当日志出现以下内容,则重启完成

Running handlers:
Running handlers complete
Chef Infra Client finished, 326/1407 resources updated in 05 minutes 40 seconds
gitlab Reconfigured!
Checking for unmigrated data on legacy storage
  1. 浏览器访问gitlab地址即可,若没问题,就可以正常使用
  2. 每个版本均需要执行1到7步骤

安装汉化包

参考链接

注意事项

迁移后需要重新生成SSH密钥并添加

添加SSH Key

所有本地仓库要重新绑定远程仓库

  1. 检查现有的远程地址:首先,您可以使用以下命令检查当前 Git 存储库的远程地址:

    git remote -v

    这将显示当前的远程存储库地址。

  2. 删除现有的远程地址:如果您希望完全删除现有的远程地址,您可以使用以下命令删除远程名称为 "origin" 的地址:

    git remote remove origin

    如果您使用了不同的远程名称,请将 "origin" 替换为您的远程名称。

  3. 添加新的远程地址:使用以下命令将新的远程地址添加到存储库:

    git remote add origin <新的存储库地址>

    请将 <新的存储库地址> 替换为您要绑定的新远程存储库的 URL。

  4. 确认新的远程地址:可以再次运行 git remote -v 命令,确保新的远程地址已经添加到存储库。
  5. 推送到新的远程存储库:使用以下命令将您的更改推送到新的远程存储库:

    git push -u origin master

    这将推送存储库的 master 分支到新的远程存储库。

这些步骤将重新绑定您的 Git 存储库到新的远程地址。请确保在执行这些操作之前备份重要的代码,以防出现问题。

参考文档

  1. docker中的gitlab数据备份、迁移和升级
  2. docker 安装gitlab,配置邮件,备份全流程
  3. docker容器中的gitlab升级详解
  4. Upgrading GitLab
  5. Ubuntu20.04上安装Docker
  6. Gitlab的中文汉化
  7. Gitlab中文社区
最后修改:2023 年 10 月 11 日
千圣皆过影,良知乃吾师