GitLab的自動備份、清理備份與恢復

weixin_34208185發表於2019-01-17

參考文件:http://www.cnblogs.com/straycats/p/7671204.html

自動備份


備份策略

GitLab正式庫每日定時執行備份指令碼,實現:

  1. 自動備份應用資料(生成.tar包)
  2. 將備份資料與配置檔案(gitlab配置檔案、nginx配置檔案、郵件配置檔案)進行打包
  3. 將備份包遠端傳送至備份伺服器

1. 通過金鑰配對取消scp傳輸密碼的限制

1.1生成金鑰對

1)在gitlab伺服器上生成rsa證書

ssh-keygen -t rsa

提示:
1、生成的過程中提示輸入金鑰對儲存位置,直接回車,接受預設值就行了。
2、因為之前已經有/root/.ssh/id_rsa 檔案存在,因此提示你是否覆蓋,輸入y表示覆蓋
3、接著會提示輸入一個密碼,直接回車,讓它空著。當然,也可以輸入一個密碼。
4、接著輸入確認密碼,輸入完之後,回車金鑰對就生成完了。
這樣,在/root/.ssh下生成id_rsa 和 id_rsa.pub 兩個檔案,其中公共金鑰為id_rsa.pub,私有金鑰為/root/.ssh/id_rsa。

2)在gitlab伺服器上cp生成rsa公鑰證書
在/root/.ssh下複製備份一份id_rsa.pub 命名為 id_rsa.pub.A,以便拷貝到遠端伺服器B。

cd /root/.ssh
cp id_rsa.pub id_rsa.pub.A

1.2 生成rsa公鑰證書上傳到備份伺服器

先在備份伺服器上建立目錄/root/.ssh。

mkdir -p /root/.ssh

使用scp命令進行遠端複製,將GitLab伺服器生成的id_rsa.pub.A拷貝到備份伺服器的/root/.ssh目錄下。

scp /root/.ssh/id_rsa.pub.A root@(備份伺服器IP):/root/.ssh/

1.3 金鑰配對

1)建立authorized_keys檔案
在備份伺服器的/root/.ssh下建立authorized_keys檔案。

touch /root/.ssh/authorized keys

2)將id_rsa.pub.A檔案內容追加到authorized_keys 檔案中
通過 cat 命令 把id_rsa.pub.A 追寫到 authorized_keys 檔案中。

cd /root/.ssh/
cat id_rsa.pub.A >> authorized_keys

3)修改authorized_keys檔案的許可權
authorized_keys檔案的許可權很重要,如果設定為777,那麼登入的時候,還是需要提供密碼的。

chmod 400 authorized_keys

4)測試上傳檔案是否還要輸入密碼
不放心的話,立刻測試下gitlab伺服器使用scp命令複製檔案到備份伺服器是否還要輸入密碼。

scp /root/.ssh/id_rsa.pub.A root@(備份伺服器IP):/root/.ssh/

2. 定時將備份檔案傳到備份伺服器

2.1 建立(本地備份+遠端備份)指令碼

在gitlab伺服器上,在/home/dgd/gitlab/data/backups/目錄下建立定期備份指令碼auto_backup_to_remote.sh。
注:該為GitLab備份的存放目錄,存放備份指令碼的目錄自定義

vim /home/dgd/gitlab/data/backups/ auto_backup_to_remote.sh

新增下面的內容,並wq儲存。
注:本指令碼執行動作有:
本地備份GitLab資料(gitlab在docker容器內,注意命令差異)
將資料備份和gitlab配置檔案、nginx配置檔案、郵件配置檔案打包
將備份包遠端傳輸至備份伺服器

#!/bin/bash

#Gitlab 備份地址
LocalBackDir=/home/dgd/gitlab/data/backups

#服務機gitlab配置檔案地址
#正式環境地址:ConfigDir=/home/dgd/gitlab/config/gitlab.rb

#nginx配置檔案地址
#正式環境地址:NginxDir=/home/dgd/gitlab/data/nginx/conf

#郵件配置地址
MailDir=/etc/postfix/main.cf

#Backup server 儲存路徑
RemoteBackDir=/soft

#遠端備份使用使用者及埠
RemoteUser=root
RemotePort=22

#備份伺服器IP
RemoteIP=(備份伺服器IP)

#以當前時間戳建立備份目錄
bakname=$(date -d "today" +"%Y%m%d_%H%M%S")
BakDir=$LocalBackDir/$bakname
mkdir $BakDir

#備份日誌檔案
LogFile=$LocalBackDir/remote_backup.log

#新建備份日誌檔案
touch $LogFile

#記錄配置檔案備份日誌
echo "Gitlab configure file auto backup at local server, start at  $(date +"%Y-%m-%d %H:%M:%S")" >>  $LogFile
echo "--------------------------------------------------------------------------" >> $LogFile

#拷貝配置檔案
cp $ConfigDir $BakDir >> $LogFile 2>&1
cp -r $NginxDir $BakDir >> $LogFile 2>&1
cp $MailDir $BakDir >> $LogFile 2>&1

#記錄本地生成gitlab備份日誌
echo "Gitlab auto backup at local server, start at  $(date +"%Y-%m-%d %H:%M:%S")" >>  $LogFile
echo "--------------------------------------------------------------------------" >> $LogFile

#執行gitlab本地備份
docker exec  gitlab_ce_zh gitlab-rake gitlab:backup:create >> $LogFile 2>&1

# $?符號顯示上一條命令的返回值,如果為0則代表執行成功,其他表示失敗
if [ $? -eq 0 ];then
   #追加日誌到日誌檔案
   echo "--------------------------------Success!-------------------------------" >> $LogFile
   echo "Gitlab auto backup at local server, end at $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
else
   #追加日誌到日誌檔案
   echo "--------------------------------Failed!----------------------------------" >> $LogFile
   echo "Gitlab auto backup at local server failed at $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
fi


#查詢本地備份目錄修改時間為10分鐘以內且字尾為.tar的Gitlab備份檔案
Backfile_Send_To_Remote=`find $LocalBackDir -type f  -mmin -10 -name '*.tar'` >> $LogFile 2>&1

#移動生成的備份檔案到配置檔案備份地址
mv -bfu $Backfile_Send_To_Remote $BakDir 


#記錄備份日誌
echo "$(date +"%Y-%m-%d %H:%M:%S") Gitlab auto backup to remote server." >> $LogFile
echo "--------------------------------------------" >> $LogFile

#列印每次備份的檔案名
echo "The files need send to remote server is: $Backfile_Send_To_Remote" >> $LogFile

# 本地傳輸Gitlab備份檔案到遠端
scp -r $RemotePort $BakDir $RemoteUser@$RemoteIP:$RemoteBackDir

# 備份結果追加到備份日誌
if [ $? -eq 0 ];then
  echo ""
  echo "$(date +"%Y-%m-%d %H:%M:%S") Gitlab Remote Backup Succeed!" >> $LogFile
else
  echo "$(date +"%Y-%m-%d %H:%M:%S") Gitlab Remote Backup Failed!" >> $LogFile
fi

2.2 修改遠端備份指令碼auto_backup_to_remote.sh的許可權

要能讓系統執行auto_backup_to_remote.sh,必須修改該指令碼的許可權。

cd /home/dgd/gitlab/data/backups/
chmod 777 auto_backup_to_remote.sh

2.3測試遠端備份指令碼的功能是否可用

現在為了驗證指令碼是否可以正常執行,我們需要手動執行指令碼。
手動執行指令碼auto_backup_to_remote.sh,看是否能夠正常上傳

./auto_backup_to_remote.sh

等待1-2分鐘左右,檢視備份伺服器的目錄/data下是否有GitLab伺服器傳過來的備份檔案。

2.4 新增定時計劃

這裡新增定時計劃的方式是使用命令crontab -e,將定時任務新增後儲存。

crontab -e

設定定時任務,例如設定每日23點執行備份指令碼

0 23 * * * /home/dgd/gitlab/data/backups/auto_backup_to_remote.sh 

重啟crontab

systemctl restart crond

恢復GitLab資料


1. 將備份資料放到GitLab的備份目錄中

本伺服器備份路徑為:/home/dgd/gitlab/data/backups,以實際配置為準

2. 修改備份檔案許可權

將備份檔案的許可權改為777,否則恢復的時候會出現許可權不夠導致解壓失敗的問題。

chmod 777 /var/opt/gitlab/backups/1508412719_2017_10_19_10.0.2_gitlab_backup.tar

3. 停止相關資料連線服務

gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq

4. 恢復gitlab

使用“gitlab-rake gitlab:backup:restore BACKUP=備份檔案編號”指令可以根據備份檔案來恢復,因為示例中是使用1508412719_2017_10_19_10.0.2_gitlab_backup.tar來恢復,故備份檔案編號為1508412719_2017_10_19_10.0.2。

gitlab-rake gitlab:backup:restore BACKUP=1508412719_2017_10_19_10.0.2
等待,輸入兩次yes

5. 覆蓋配置檔案

如果是計劃在新的伺服器恢復原有伺服器,除了恢復原有伺服器的資料,還需要使用原有伺服器的GitLab配置檔案進行覆蓋。包括:(gitlab配置檔案、nginx配置檔案、郵件配置檔案),如果配置檔案中宣告瞭IP地址,需要修改。

重新生成配置
gitlab-ctl reconfigure
6.  重啟GitLab
gitlab-ctl start

自動清理備份


Gitlab支援修改配置引數,實現gitlab自行刪除備份資料。詳見:http://www.cnblogs.com/straycats/p/7671204.html
但由於我們對備份資料做了打包處理,並沒有嘗試配置gitlab是否可行,而是採取了執行定時清理指令碼的方法
1 在備份目錄下新增清理指令碼:auto_del.sh,備份伺服器的備份存放在:/data/

vi auto_del.sh

新增一下內容並儲存

find /data -mtime +7 -type d -name "*" -exec rm -rf {} \;
# 尋找並刪除/data目錄下內容修改時間(mtime)為7天以前的資料夾(-type d),並刪除(rm -rf)

2 手工執行指令碼,檢視一下是否正常執行

#進入指令碼存放路徑
./auto_del.sh 
#使用指令碼的絕對路徑
/data/auto_del.sh

3 新添定時任務,儲存

crontab -e
* 22 * * 6 /data/auto_del.sh
#每週6的22點執行清理備份指令碼

相關文章