公司的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官网提示升级需要遵照一定的升级路线,具体官方建议的路线如下
我的升级路线如下,怀疑可以直接升级到最新版本,或者中间版本有些没有必要,有兴趣的自己尝试吧。
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
#/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