Gitlab日常備份及遷移
Gitlab安裝體驗一文介紹了如何在阿里雲上安裝Gitlab,安裝是很簡單方便,但是出於數據安全的考慮,我們需要做一些備份,以防萬一。
本文重點介紹Gitlab的日常備份及遷移恢復
Gitlab創建備份
使用Gitlab一鍵安裝包安裝Gitlab非常簡單, 同樣的備份恢復與遷移也非常簡單. 使用一條命令即可創建完整的Gitlab備份:
gitlab-rake gitlab:backup:create
使用以上命令會在/var/opt/gitlab/backups目錄下創建一個名稱類似為1393513186_gitlab_backup.tar的壓縮包, 這個壓縮包就是Gitlab整個的完整部分, 其中開頭的1393513186是備份創建的日期。
Gitlab修改備份文件默認目錄
你也可以通過修改/etc/gitlab/gitlab.rb來修改默認存放備份文件的目錄
gitlab_rails['backup_path'] = '/mnt/backups'
/mnt/backups修改為你想存放備份的目錄即可,修改完成之后使用gitlab-ctl reconfigure命令重載配置文件即可。
Gitlab恢復備份
同樣, Gitlab的從備份恢復也非常簡單
# 停止相關數據連接服務
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
# 從1393513186編號備份中恢復
gitlab-rake gitlab:backup:restore BACKUP=1393513186_gitlab_backup
# 啟動Gitlab
sudo gitlab-ctl start
Gitlab遷移
遷移如同備份與恢復的步驟一樣,只需要將老服務器/var/opt/gitlab/backups目錄下的備份文件拷貝到新服務器上的/var/opt/gitlab/backups即可(如果你沒修改過默認備份目錄的話)。
但是需要注意的是新服務器上的Gitlab的版本必須與創建備份時的Gitlab版本號相同。
比如新服務器安裝的是最新的7.60版本的Gitlab,那么遷移之前,最好將老服務器的Gitlab升級為7.60在進行備份。
Gitlab定時自動異地備份
由於Gitlab部署在了阿里雲上,把Gitlab再備份在本地意義不是特別大,所以這里利用了家里的NAS做了一個簡單的異地備份。
服務器備份腳本
在阿里雲服務器上創建如下腳本,存儲在/home/scripts/gitlab_backup.sh文件中
#!/bin/bash
# Gitlab自動備份腳本
#Gitlab 備份地址
LocalBackDir=/var/opt/gitlab/backups
#備份日志文件
LogFile=$LocalBackDir/remote_backup.log
#新建備份日志文件
touch $LogFile
echo "-------------------------------------------------------------------------" >> $LogFile
#記錄本地生成gitlab備份日志
echo "Gitlab auto backup at local server, start at $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
#執行gitlab本地備份
gitlab-rake gitlab:backup:create >> $LogFile 2>&1
# $?符號顯示上一條命令的返回值,如果為0則代表執行成功,其他表示失敗
if [ $? -eq 0 ];then
#追加日志到日志文件
echo "Gitlab auto backup at local server successed at $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
else
#追加日志到日志文件
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' | tail -1` >> $LogFile 2>&1
echo $Backfile_Send_To_Remote
NAS免密登錄阿里雲
異地備份思路需要在NAS上登錄到阿里雲服務器上執行對應的備份命令並下載文件,所以需要讓NAS可以免密登錄阿里雲服務器,以定時自動執行這個任務。
免密登錄的配置,可以參考SSH免密登錄配置
NAS服務器腳本
SSH進入NAS,然后創建腳本,自動在服務器上執行備份,並下載到NAS本地來。腳本存儲在/volume1/homes/gitlab_back/scripts/gitlab_backup_download.sh文件中。
#!/bin/bash
# 遠程登錄gitlab服務器,執行自動備份腳本,然后傳輸至本地
#Gitlab服務器
RemoteServer=git.ufeng.top
RemoteServerUser=root
#Gitlab服務器備份地址
RemoteBackDir=/var/opt/gitlab/backups
#NAS本地備份地址
LocalBackDir=/volume1/homes/gitlab_back
#備份日志文件
LogFile=$LocalBackDir/remote_backup.log
#新建備份日志文件
touch $LogFile
echo "-------------------------------------------------------------------------" >> $LogFile
#記錄NAS下載gitlab備份日志
echo "Gitlab backup auto download at NAS, start at $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
#遠程登錄gitlab服務器並執行備份腳本,獲取備份文件的名字
result=`ssh $RemoteServerUser@$RemoteServer "sh /home/scripts/gitlab_backup.sh"`
#遠程下載備份文件到本地
scp $RemoteServerUser@$RemoteServer:$result $LocalBackDir
echo "Gitlab remote backup file is ${result}" >> $LogFile
# 備份結果追加到備份日志
if [ $? -eq 0 ];then
echo ""
echo "$(date +"%Y-%m-%d %H:%M:%S") Gitlab Remote download Succeed!" >> $LogFile
else
echo "$(date +"%Y-%m-%d %H:%M:%S") Gitlab Remote download Failed!" >> $LogFile
fi
然后配置群暉的定時任務,每天自動執行。
群暉計划任務.png
自動清理歷史備份文件
由於阿里雲的存儲空間有限,所以對Gitlab的歷史備份文件需要定期刪除,釋放磁盤空間。
同樣在/home/scripts/gitlab_auto_del_backup.sh文件中存儲自動清理歷史備份的腳本內容。
#!/bin/bash
#清理多余的歷史備份
#Gitlab 備份地址
LocalBackDir=/var/opt/gitlab/backups
#備份日志文件
LogFile=$LocalBackDir/remote_clean.log
#新建備份日志文件
touch $LogFile
echo "--------------------------------------------------------------------- " >> $LogFile
echo "Gitlab auto clean local backup, start at $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
# 找到3*24*60分鍾前,以tar結尾的文件並刪除
find $LocalBackDir -type f -mmin +4320 -name "*.tar" -exec rm -rf {} \;
# $?符號顯示上一條命令的返回值,如果為0則代表執行成功,其他表示失敗
if [ $? -eq 0 ];then
#追加日志到日志文件
echo "Gitlab auto clean local backup success at $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
else
#追加日志到日志文件
echo "Gitlab auto clean local backup failed at $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
fi
然后賦予執行權限
chmod u+x /home/scripts/gitlab_auto_del_backup.sh
配置定時任務
crontab -e
0 3 * * * /home/scripts/gitlab_auto_del_backup.sh