轉載:遠端備份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