gitlab 遠程 定時備份

===============================================html

2017/11/1_第2次修改                       ccb_warlockgit

 

更新說明vim

2017/11/1:修正了「4.2添加定時計劃」中auto_remove_old_backup.sh路徑錯誤而致使不能刪除過時備份文件的問題。centos

===============================================安全

 部署:http://www.cnblogs.com/straycats/p/7637373.htmlbash

 升級:http://www.cnblogs.com/straycats/p/7707359.html服務器

 本地備份:http://www.cnblogs.com/straycats/p/7671204.html
ssh

 遷移/恢復:http://www.cnblogs.com/straycats/p/7702271.htmlgitlab

 

上一篇隨筆(http://www.cnblogs.com/straycats/p/7671204.html)已經記錄了給gitlab本地作自動備份的解決方案,可是源碼安全關乎研發部門的生命,仍是須要進一步提升容災能力。首先研發部門暫時沒有老法師可以在服務器掛了以後經過硬盤將服務器徹底恢復,雖然服務器作了raid5,謹慎起見仍是得實現遠程自動備份的解決方案,當源碼服務器出現災難性故障時能夠保證恢復源碼的功能。測試

 查找資料後發現,http://blog.csdn.net/ouyang_peng/article/details/77334215的教程可行,爲了可以符合個人部署步驟,我將其中部份內容從新整理並修改,也增補了一點細節說明。 

 


1、環境準備

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

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

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

 

gitlab已經配置了本地備份。若是沒有配置,能夠參考http://www.cnblogs.com/straycats/p/7671204.html

 

 


2、經過密鑰配對取消scp傳輸密碼的限制

 手動備份數據費時費力。最好的方法就是經過腳本實現遠程自動備份。但遠程不管是經過SSH登錄,仍是經過scp拷貝文件都須要輸入密碼。

 爲了克服這個問題,首先須要實現不須要密碼的SSH登錄,這樣就可使用 rsync,scp,rexec等命令來作的遠程備份了。

 

2.1 生成密鑰對

假設A,B兩服務器,如今須要在A機上用root登錄B機,而不須要輸入密碼。那咱們可按照下面的步驟來作:

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

ssh-keygen -t rsa

 

 (這裏須要增長截圖,我第一次部署時忘記截了以後補)

一、生成的過程當中提示輸入密鑰對保存位置,直接回車,接受默認值就好了。 
二、由於以前已經有/root/.ssh/id_rsa 文件存在,所以提示你是否覆蓋,輸入y表示覆蓋 
三、接着會提示輸入一個密碼,直接回車,讓它空着。固然,也能夠輸入一個密碼。 
四、接着輸入確認密碼,輸入完以後,回車密鑰對就生成完了。

 

 這樣,在/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 root@192.168.1.2:/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 root@192.168.1.2:/root/.ssh/

發如今2.3以前,因爲沒有設置ssh證書受權認證時,上傳須要輸入密碼;2.3操做完後,因爲受權認證,已經不須要輸入密碼了。

 

 


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 $RemoteUser@$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:十、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

 

 


4、定時刪除備份服務器上的備份文件 

每一個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

 

 

 

參考資料:

1. http://blog.csdn.net/ouyang_peng/article/details/77334215

相關文章
相關標籤/搜索