記錄升級gitlab、恢復歷史資料及配置自動備份過程
阿新 • • 發佈:2021-11-08
公司的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": ["(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
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.33. 升級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)拉取所有映象
附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-stream2.如果未包含則重新configure,比較簡單,下載並進入nginx安裝包目錄
./configure --with-stream make install3. 修改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'] = 2592002. 安裝輸入密碼的輔助包:expect
yum install expect3. 修改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