GitLab 11.9.0升级与迁移的方法

在我们公司使用的是GitLab的docker版本gitlab/gitlab-ce:11.9.0-ce.0。目前有几个安全隐患需要升级到最新的版本,并迁移到新的服务器中。研究了几天,成功的迁移并升级到13.11.1-ce.0。现在分享一下升级过程,并把相关知识点分享一下。

目前官方Gitlab的升级建议是在相关次版本之间可以跳跃升级,主版本升级的时候需要先升级到该主版本的第一个版本x.0.0以后才能升级到对应的版本。期间一些重要版本不建议跳过。整个升级的过程主要围绕着数据库更新以及代码的变更上。以11.9.0版本为例。我的版本升级步骤是11.9.0->11.11.8->12.0.12->12.10.0->12.10.14->13.0.0->13.1.11->13.5.4->13.11.1。具体操作步骤如下

1. 备份数据

例如我的容器名字为gitlab。通过以下命令会生成对应备份文件,存在容器的路径/var/opt/gitlab/backups目录下。

docker exec -d gitlab /opt/gitlab/bin/gitlab-rake gitlab:backup:create

一般备份文件的命名规则类似1619428520_2021_04_26_11.9.0_gitlab_backup.tar,包含时间戳以及日期和版本号。将这个文件复制到新的服务器。同时,将gitlab的config目录打包复制到新服务器。

2. 在新的服务器创建原来的版本并恢复数据

在这儿我写了个批处理脚本gitlab_docker.sh进行容器创建。假设我在新服务器的/data/gitlab目录下存储对应的配置文件和数据文件。

/data/gitlab/
├── config
├── data
└── logs
#!/bin/bash
TAG=${1:-13.11.1-ce.0}
docker stop gitlab
docker rm gitlab
docker run -d \
        --name gitlab \
        -p 2200:22 -p 8000:80 -p 8443:443 \
        -v /data/gitlab/config:/etc/gitlab \
        -v /data/gitlab/logs:/var/log/gitlab \
        -v /data/gitlab/data:/var/opt/gitlab \
        gitlab/gitlab-ce:$TAG

停止当前的容器

docker stop gitlab

将备份文件复制到backup目录/data/gitlab/data/backups

重启容器, 关闭与数据库相关的进程并验证。

docker start gitlab
docker exec -it gitlab bash
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
# 验证
gitlab-ctl status

修改备份文件权限为git:root。恢复进程是使用git用户来操作

chown git:root 1619428520_2021_04_26_11.9.0_gitlab_backup.tar

还原备份

gitlab-rake gitlab:backup:restore BACKUP=1619428520_2021_04_26_11.9.0

在漫长的等待后,原来的服务已经顺利的切换到新的版本上了。之后就是一个版本一个版本的升级

3. 升级版本

依次运行gitlab_docker.sh脚本更新程序

# 升级版本
gitlab_docker.sh 11.11.8-ce.0
# 验证升级过程
docker logs gitlab -f
# 进行下一个版本的升级
gitlab_docker.sh 12.0.12-ce.0

一直升级到13.11.1-ce.0

nginx反向代理

我们的服务器资源比较紧张,一台机器的80,443需要提供多个服务。因此装了一个nginx反向代理。在对接gitlab服务的时候通过server_name提供服务。具体的配置如下:

server {
    listen       80     default_server;
    server_name gitlab.example.com;
    access_log /var/log/nginx/gitlab_access.log main;
    location / {
        proxy_read_timeout 300s;
        proxy_connect_timeout 75s;
        proxy_http_version 1.1;
        proxy_cache off;
        proxy_request_buffering off;
        proxy_set_header Host gitlab.example.com;
        proxy_pass http://localhost:8000/;
    }
}

proxy_set_header Host gitlab.example.com; 这个配置非常重要。如果不加有些页面是打不开的。 默认gitlab会传递request.base_url到对应的页面模板上。如果不把主机头传过去,baseurl会是localhost:8000。一旦用户登录,因为cookie问题,好多页面就访问不了了。这是一个坑,我研究了半天才弄清楚。