1. 程式人生 > >轉載:遠端備份gitlab

轉載:遠端備份gitlab

一、環境準備

1.gitlab所在的伺服器A(centos7,192.168.1.1)

2.備份伺服器B(centos7,192.168.1.2)

3.gitlab本地備份目錄設定為/var/opt/gitlab/backups/log,本篇也是以此展開

 

 

 

 


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

 手動備份資料費時費力。最好的方法就是通過指令碼實現遠端自動備份。但遠端無論是通過SSH登陸,還是通過scp拷貝檔案都需要輸入密碼。

 為了克服這個問題,首先需要實現不需要密碼的SSH登陸,這樣就可以使用 rsync,scp,rexec等命令來做的遠端備份了。

 

2.1 生成金鑰對

假設A,B兩伺服器,現在需要在A機上用root登陸B機,而不需要輸入密碼。那我們可按照下面的步驟來做:

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

ssh-keygen -t rsa

 

 (這裡需要增加截圖,我第一次部署時忘記截了之後補)

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

 

 這樣,在/root/.ssh下生成id_rsa 和 id_rsa.pub 兩個檔案,其中公共金鑰儲存在 /root/.ssh/id_rsa.pub,私有金鑰儲存在/root/.ssh/id_rsa。

 

 2)在gitlab伺服器A上cp生成rsa公鑰證書 

在/root/.ssh下複製備份一份id_rsa.pub 命名為 id_rsa.pub.A,以便拷貝到遠端伺服器B。

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

 

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

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

mkdir -p /root/.ssh

 

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

scp /root/.ssh/id_rsa.pub.A [email protected]:/root/.ssh/

 

此時使用scp命令需要輸入密碼,當把下面的“2.3 金鑰配對”執行後,以後gitlab伺服器A使用scp命令複製檔案到備份伺服器B的話,就不需要輸入密碼了。

 

2.3 金鑰配對

1)建立authorized_keys檔案

在備份伺服器B的/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伺服器A使用scp命令複製檔案到備份伺服器B是否還要輸入密碼。

scp /root/.ssh/id_rsa.pub.A [email protected]:/root/.ssh/

發現在2.3之前,由於沒有設定ssh證書授權認證時,上傳需要輸入密碼;2.3操作完後,由於授權認證,已經不需要輸入密碼了。

 

 


三、定時將備份檔案傳到備份伺服器

3.1 建立遠端備份指令碼

在gitlab伺服器A上,在/root目錄下建立定期備份指令碼auto_backup_to_remote.sh。

vim /root/auto_backup_to_remote.sh

 

新增下面的內容,並wq儲存。

複製程式碼

#!/bin/bash

# gitlab 伺服器備份路徑
LocalBackDir=/var/opt/gitlab/backups

# 遠端備份伺服器 gitlab備份檔案存放路徑
RemoteBackDir=/root/gitlab_backup

# 遠端備份伺服器 登入賬戶
RemoteUser=root

# 遠端備份伺服器 IP地址
RemoteIP=(備份伺服器B的地址,請你自行修改)

#當前系統日期
DATE=`date +"%Y-%m-%d"`

#Log存放路徑
LogFile=$LocalBackDir/log/$DATE.log

# 查詢 gitlab本地備份目錄下 時間為60分鐘之內的,並且字尾為.tar的gitlab備份檔案
BACKUPFILE_SEND_TO_REMOTE=$(find $LocalBackDir -type f -mmin -60  -name '*.tar*')

#新建日誌檔案
touch $LogFile

#追加日誌到日誌檔案
echo "Gitlab auto backup to remote server, start at  $(date +"%Y-%m-%d %H:%M:%S")" >>  $LogFile
echo "---------------------------------------------------------------------------" >> $LogFile

# 輸出日誌,打印出每次scp的檔名
echo "---------------------The file to scp to remote server is: $BACKUPFILE_SEND_TO_REMOTE-------------------------------" >> $LogFile


#備份到遠端伺服器
scp $BACKUPFILE_SEND_TO_REMOTE [email protected]$RemoteIP:$RemoteBackDir

#追加日誌到日誌檔案
echo "---------------------------------------------------------------------------" >> $LogFile

複製程式碼

 

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

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

chmod 777 auto_backup_to_remote.sh

 

3.3 建立日誌存放目錄 

mkdir -p /var/opt/gitlab/backups/log

 

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

現在為了驗證指令碼是否可以正常執行,我們需要手動執行指令碼。

 

在gitlab伺服器A上執行find命令,看是否能夠正常查找出我們要scp到遠端伺服器的Gitlab備份檔案。

find /var/opt/gitlab/backups/log -type f -mmin -60  -name '*.tar*'

 

手動執行指令碼auto_backup_to_remote.sh,看是否能夠正常上傳

cd

./auto_backup_to_remote.sh

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

在備份伺服器B上能找到伺服器A傳過來的備份檔案,說明遠端備份指令碼的功能OK。

 

如果每次上傳都通過人工執行指令碼的方式,人工的消耗太大,接著配置定時執行該指令碼。 

 

3.5 新增定時計劃

定時備份的思路建立在手動的基礎上,通過crontab新增定時計劃就可以解決這個問題。

一般新增定時計劃可以有2種方式:

1.使用命令crontab -e,將定時任務新增後儲存。

2.將定時任務新增到/etc/crontab檔案中。

 

我這裡採取第一種,使用crontab -e。

crontab -e

 

結合我之前對公司gitlab本地備份的設計,故設計在備份完10分鐘後上傳,故分別在每天12:10、19:10進行備份,故新增下面的內容,wq儲存。

10 12 * * * /root/auto_backup_to_remote.sh -D 1
10 19 * * * /root/auto_backup_to_remote.sh -D 1

 

重啟crontab

systemctl restart crond

 

 


四、定時刪除備份伺服器上的備份檔案 

每個Gitlab備份檔案都很大。因此每天備份兩次,過不了多久的話,備份伺服器B上的磁碟空間可能就會被Gitlab備份檔案佔用完。

故需要定期清理備份檔案,參考備份伺服器的空間,暫定保留14天的備份檔案。

 

4.1 建立刪除過期備份檔案的指令碼 

設計備份伺服器B的/root/gitlab_backup作為接收遠端上傳備份檔案的目錄,故在備份伺服器B上,先建立該目錄。  

mkdir -p /root/gitlab_backup

 

 建立刪除過期備份檔案的指令碼auto_remove_old_backup.sh。 

vim /root/auto_remove_old_backup.sh

  

新增下面的內容,並wq儲存。

複製程式碼

#!/bin/bash

# 遠端備份伺服器 gitlab備份檔案存放路徑
GitlabBackDir=/root/gitlab_backup


# 查詢遠端備份路徑下,超過14天且檔案字尾為.tar 的 Gitlab備份檔案 然後刪除
find $GitlabBackDir -type f -mtime +14 -name '*.tar*' -exec rm {} \;

複製程式碼

 

4.2 修改auto_remove_old_backup.sh指令碼的許可權 

chmod 777 auto_remove_old_backup.sh

 

4.3 新增定時計劃 

定時備份的思路建立在手動的基礎上,通過crontab新增定時計劃就可以解決這個問題。

一般新增定時計劃可以有2種方式:

1.使用命令crontab -e,將定時任務新增後儲存。

2.將定時任務新增到/etc/crontab檔案中。

 

我這裡採取第一種,使用crontab -e。

crontab -e

 

設計凌晨0點執行刪除過期備份檔案的指令碼,故新增下面的內容,wq儲存。

0 0 * * *  /root/auto_remove_old_backup.sh

 

重啟crontab

systemctl restart crond