在使用 Gitlab 之後,實現了自由自在的做版控,但隨之而來的就是資料安全問題,深怕哪一天硬碟掛掉不再運作,陷入心血付之一炬的窘境,雖然是使用 VN 來架設 Gitlab 的環境,可以設定 VM 的備份計畫,不過多備一份就多一份安心,不是嗎~
環境
Gitlab 環境 | |
---|---|
Name | GitlabServer |
OS | Ubuntu 14.04.4 LTS |
Gitlab | GitLab Community Edition 8.9.3 |
備份目的地 | |
---|---|
Name | BackupServer |
OS | Ubuntu 14.04.4 LTS |
Protocol | Samba |
操作步驟
以下操作是參考Gitlab 備份/還原設定筆記,並加上實作時其他問題的解決方法。
1.將 BackupServer 的分享資料夾掛載到 GitlabServer 上
MOUNT_POINT=/mnt/BackupServer/gitlab_backup
SHARE_FOLDER=//BackupServer/gitlab_backup
DOMAIN=BackupServer
USERNAME=backupuser
PASSWORD=backup1234
mount -t cifs $SHARE_FOLDER $MOUNT_POINT -o username="$USERNAME",password="$PASSWORD",domain="$DOMAIN",iocharset=utf8,file_mode=0777,dir_mode=0777,guest
// 這裡你也可以不用 guest, 可以使用 gid=xxxx 或 uid=xxxx 來指定給某個群組或個人, guest 只是比較偷懶的作法
// 如果遇到失敗可以檢查一下是否有套件沒裝到,再使用 apt-get install 安裝
// apt-get install nfs-common
// apt-get install cifs-utils
2.修改 GitLab 的設定檔 /etc/gitlab/gitlab.rb
,將備份路徑設定值 gitlab_rails['backup_path']
的內容,修改成 /mnt/BackupServer/gitlab_backup
3.執行下列指令使設定檔生效
// 讓 Gitlab 套用新設定
gitlab-ctl reconfigure
// 重新啟動 Gitlab
gitlab-ctl restart
4.此時可以使用 gitlab-rake gitlab:backup:create
來執行備份程序
5.使用 root 的身份設定 cron table
排程,做定時的備份
// 切換到 root 身份,修改系統排程設定檔
sudo crontab -e
6.開啟編輯氣候,在裡面加上下面這行,使系統每天 02:00 時,會執行 Gitlab 備份程序
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create
這樣就完成了相關備份手續。
實作時遇到的問題
在上述步驟 3 時,執行 gitlab-ctl reconfigure
時會出現
Error executing action `create` on resource 'directory[/mnt/BackupServer/gitlab_backup]'
這個錯誤應該是權限的問題造成無法成功寫入備份資料,但很神奇的是,在 /mnt/BackupServer/gitlab_backup
中,我是可以新增、修改、刪除檔案的。
山不轉路轉,於是我將 Gitlab 的備份路徑,改到 user 的家目錄底下,並在 cron table
中,增加一個排程
0 3 * * * find /home/user/gitlab_backup/ -name "*gitlab_backup.tar" -mtime -1 -exec /bin/cp -a {} /mnt/BackupServer$
就是在 02:00 的時候執行 Gitlab 的備份計畫(備份檔存在 user 家目錄下),於 03:00 的時候將該備份檔,複製至掛載的遠端硬碟中,順利解決備份至不同機器的目的。
定期清除備份資料
Gitlab 的備份檔案是不會被覆蓋的,依照上述做法,每天都會有一筆新的備份檔,這無形也是造成硬碟空間的耗損,因此可以在 cron table
中再增加一個排程,只保留七天內的備份檔。
0 3 * * * find /mnt/BackupServer/gitlab_backup/ -name "*gitlab_backup.tar" -mtime +3 -exec rm -rf {} \;
完整排程程式碼
## Gitlab Backup
# Launch Gitlab backup service
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create
# Retain backup data on local folder in 3 days
0 2 * * * find /home/user/gitlab_backup/ -name "*gitlab_backup.tar" -mtime +3 -exec rm -rf {} \;
# Move Gitlab backup file to remote server
0 3 * * * find /home/user/gitlab_backup/ -name "*gitlab_backup.tar" -mtime -1 -exec /bin/cp -a {} /mnt/BackupServer$
# Retain backup data on remote folder in 3 day
0 3 * * * find /mnt/BackupServer/gitlab_backup/ -name "*gitlab_backup.tar" -mtime +3 -exec rm -rf {} \;
參考資料: