1. 程式人生 > 其它 >記錄升級gitlab、恢復歷史資料及配置自動備份過程

記錄升級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)拉取所有映象

附gitlab hub地址 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 -it 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