记录升级gitlab、恢复历史数据及配置自动备份过程

公司的gitlab版本为10.5.6,近期得到消息小于13.10的gitlab存在严重的安全漏洞,具体漏洞描述如下:

GITLAB 远程命令执行漏洞(CVE-2021-22205)

因此记录gitlab升级过程,升级使用了docker方式,比较方便,另外还配置了nginx的stream方式转发,以及自动备份。

一、gitlab恢复数据及升级

由于原先是非docker方式部署,所以需要先搭建老版本的docker->导入恢复历史数据->逐步升级到最高版本。高版本无法直接恢复低版本的备份文件。

1. 搭建老版本的gitlab

(1)建议将仓库地址修改为国内地址:

vi /etc/docker/daemon.json
添加内容如下:
{
"registry-mirrors": ["https://3laho3y3.mirror.aliyuncs.com"]
}
之后重启docker服务:
service docker restart

(2)拉镜像

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

(3)启动容器

export GITLAB_HOME=/gitlab
 
sudo docker run --detach \
--hostname 你的IP \
--publish 443:443 --publish 80:80 --publish 23:22 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab:Z \
--volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
--volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
gitlab/gitlab-ce:10.5.6-ce.0

(4)启动过程比较长,可以查看日志观察进度:docker logs -f gitlab

  同时可以docker ps观察启动状态,启动状态依次为starting->unhealthy->healthy
 

2. 恢复备份文件

(1)复制备份文件

复制到容器中默认备份路径/var/opt/gitlab/backups,或者直接放到宿主机的映射目录$GITLAB_HOME/data/backups,如下为复制到容器命令
docker cp 1597959631_2020_08_20_11.2.3_gitlab_backup.tar.tar gitlab:/XXX

(2)恢复备份文件

进入到容器中:docker exec -it gitlab /bin/bash 
之后恢复命令为:
gitlab-rake gitlab:backup:restore BACKUP=1597959631_2020_08_20_11.2.3

3. 升级gitlab

需要注意gitlab官网提示升级需要遵照一定的升级路线,具体官方建议的路线如下

Gitlab Docker升级路线

我的升级路线如下,怀疑可以直接升级到最新版本,或者中间版本有些没有必要,有兴趣的自己尝试吧。

10.5.6-> 10.8.7-> 11.11.8-> 12.0.12-> 12.10.6->13.0.0->13.9.2->13.12.12->14.0.11-14.1.6-latest(最新为14.4.1)

(1)拉取所有镜像

 
docker pull gitlab/gitlab-ce:10.8.7-ce.0
docker pull gitlab/gitlab-ce:11.11.8-ce.0
docker pull gitlab/gitlab-ce:12.0.12-ce.0
docker pull gitlab/gitlab-ce:12.10.6-ce.0
docker pull gitlab/gitlab-ce:13.0.0-ce.0
docker pull gitlab/gitlab-ce:13.9.2-ce.0
docker pull gitlab/gitlab-ce:13.12.12-ce.0
docker pull gitlab/gitlab-ce:14.0.11-ce.0
docker pull gitlab/gitlab-ce:14.1.6-ce.0
docker pull gitlab/gitlab-ce:latest

(2)停止并删除现有的docker容器,不要删除宿主机的映射目录

docker stop gitlab
docker rm gitlab

(3)启动docker容器,注意确认必须有GITLAB_HOME变量

sudo docker run --detach \
--hostname 你的IP \
--publish 443:443 --publish 80:80 --publish 23:22 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab:Z \
--volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
--volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
gitlab/gitlab-ce:10.8.7-ce.0

(4)按升级路线,反复执行(2)->(3),docker run命令只有最后一行需要改为当前升级的目标tag

 

二、nginx配置stream

 需要在其他服务器的nginx跳转到gitlab,使用stream模块

1. 查看version是否包含了stream模块:

./nginx -V
是否包含
configure arguments: --with-stream

2.如果未包含则重新configure,比较简单,下载并进入nginx安装包目录

./configure --with-stream
make install

3. 修改stream

stream{
upstream gitlab {
#转发到gitlab的内网IP
server 你的GitlabIP:80;
}
server{
listen 你对外的端口;
proxy_pass gitlab;
#可选择只允许指定IP访问,注意deny放到最下边,如果放到第一个将禁止任何访问
allow 192.168.1.0/24;
deny all;
}
}
 

三、 配置定时备份并将备份文件上传到指定服务器

在宿主机配置定时任务,使用rsync上传到其他服务器

 

1. 修改gitlab.rb

位于宿主机的$GITLAB_HOME/config目录下,打开如下前两行注释,修改第三条的备份有效时间,改为3天,即超过三天的备份文件自动删除
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
gitlab_rails['backup_keep_time'] = 259200
 

2. 安装输入密码的辅助包:expect

yum install expect

3. 修改shell脚本

我的目录为: /mm/uploadGitLabBak,注意修改shell脚本、exp文件为你的真实目录

upload.sh

#!/bin/bash
docker exec gitlab /bin/bash -c 'gitlab-rake gitlab:backup:create'
expect /mm/uploadGitLabBak/upload.exp

 

 upload.exp文件内容
#/bin/bash/expect 

 #备份目标服务器用户
set user mmfiles
 #备份目标服务器密码
set pwd 你的密码
 #备份目标服务器IP
set destIpAddr 192.168.1.201
 #备份目标服务器目录
set destFilePath /dest/gitlab-bak-14/
 #备份目标服务器ssh端口
set sshPort 22
#备份文件夹
set srcFilePath /此处为你的宿主机变量GITLAB_HOME/data/backups/

spawn rsync -av -e "ssh -p $sshPort" --delete $srcFilePath $user@$destIpAddr:$destFilePath

#等待如上命令执行完成,超时时间无限
set timeout -1
expect "*password:" 
send "$pwd\n"


expect eof 

 4.配置定时任务每天0点运行

0 0 * * * /mm/uploadGitLabBak/upload.sh > /mm/uploadGitLabBak/uploadGitBak.log 2>&1

posted on 2021-11-08 14:34  mcyandy  阅读(164)  评论(0编辑  收藏  举报

导航