1. 程式人生 > >git學習------> Gitlab如何進行備份恢復與遷移?

git學習------> Gitlab如何進行備份恢復與遷移?

前段時間,在某臺CenterOS伺服器上搭建了Gitlab環境,並且大家陸陸續續的都把程式碼從svn遷移到了gitlab,但是之前的CenterOS伺服器並不是搭建在公司的機房環境,而是搭建在辦公室的某臺閒置的電腦上,因此為了保證資料安全性,領導要求為將之前的Gitlab資料全部重新遷移到公司機房的伺服器上面去。

1、Gitlab 建立備份

1.1 建立備份檔案

首先我們得把老伺服器上的Gitlab整體備份,使用Gitlab一鍵安裝包安裝Gitlab非常簡單, 同樣的備份恢復與遷移也非常簡單. 使用一條命令即可建立完整的Gitlab備份。

gitlab-rake gitlab
:backup:create

使用以上命令會在/var/opt/gitlab/backups目錄下建立一個名稱類似為1502357536_2017_08_10_9.4.3_gitlab_backup.tar的壓縮包, 這個壓縮包就是Gitlab整個的完整部分, 其中開頭的1502357536_2017_08_10_9.4.3是備份建立的日期

  • /etc/gitlab/gitlab.rb 配置檔案須備份
  • /var/opt/gitlab/nginx/conf nginx配置檔案
  • /etc/postfix/main.cfpostfix 郵件配置備份

這裡寫圖片描述

生成完後,/var/opt/gitlab/backups目錄建立一個名稱類似為1502357536_2017_08_10_9.4.3_gitlab_backup.tar

的壓縮包

這裡寫圖片描述

1.1 更改Gitlab備份目錄

當然你也可以通過/etc/gitlab/gitlab.rb配置檔案來修改預設存放備份檔案的目錄

gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"

/var/opt/gitlab/backups修改為你想存放備份的目錄即可,例如下面程式碼將備份路徑修改為/mnt/backups

gitlab_rails['backup_path'] = '/mnt/backups'

這裡寫圖片描述

修改完成之後使用下面命令過載配置檔案即可.

gitlab-ctl reconfigure

1.2 Gitlab自動備份

1.2.1 定時自動備份

在crontab檔案裡面,每一行代表一項任務,每行的每個欄位代表一項設定,它的格式共分為六個欄位,前五段是時間設定段,第六段是要執行的命令段,每個欄位之間用空格分割,沒用的段用*代替,格式如下:

m h dom mon dow user command

其中:

  • m: 表示分鐘,可以是從0到59之間的任何整數。
  • h:表示小時,可以是從0到23之間的任何整數。
  • dom:表示日期,可以是從1到31之間的任何整數。
  • mon:表示月份,可以是從1到12之間的任何整數。
  • dow:表示星期幾,可以是從0到7之間的任何整數,這裡的0或7代表星期日。
  • user : 表示執行的使用者。
  • command:要執行的命令,可以是系統命令,也可以是自己編寫的指令碼檔案(如shell檔案)。

實現每天凌晨2點進行一次自動備份:通過crontab使用備份命令實現,需重啟cron服務
方法1、在命令列輸入: crontab -e 然後新增相應的任務,wq存檔退出。

#輸入命令crontab -e
sudo crontab -e  
#輸入相應的任務
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1  

方法2、直接編輯/etc/crontab 檔案,即vi /etc/crontab,然後新增相應的任務

#編輯 /etc/crontab
vi /etc/crontab 

然後再編輯框內輸入相應的任務

# edited by ouyang 2017-8-11 新增定時任務,每天凌晨兩點,執行gitlab備份
0  2    * * *   root    /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1  

這裡寫圖片描述

或者直接定時執行一個指令碼 auto_backup.sh ,指令碼內容為

/opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1

然後再 /etc/crontab中,新增相關任務定時執行 auto_backup.sh 指令碼檔案

sudo chmod +x auto_backup.sh
sudo vim auto_backup.sh

這裡寫圖片描述

/etc/crontab 中新增執行指令碼的定時任務,程式碼如下:

#也可以按照如下所示的方法,定時執行 auto_backup.sh指令碼,指令碼內容就填寫: /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1 

0 2    * * *   root    /data/gitlabData/backups/auto_backup.sh -D 1   

編寫完 /etc/crontab 檔案之後,需要重新啟動cron服務

#重新載入cron配置檔案
sudo /usr/sbin/service cron reload
#重啟cron服務
sudo /usr/sbin/service cron restart 

實際執行如下

root@ubuntu4146:~# sudo /usr/sbin/service cron reload
root@ubuntu4146:~# sudo /usr/sbin/service cron restart 
cron stop/waiting
cron start/running, process 17738

關於Cron表示式可以參考連結:

關於gitlab備份可以參考連結:

關於如何將gitlab備份檔案備份到遠端備份伺服器,參考連結:

1.2.2 設定備份過期時間

設定只儲存最近7天的備份,編輯 /etc/gitlab/gitlab.rb 配置檔案,找到gitlab_rails[‘backup_keep_time’],設定為你想要設定的值,然後儲存。

gitlab_rails['backup_keep_time'] = 604800  

這裡寫圖片描述

2、 Gitlab遷移

2.1 copy老伺服器上面的備份檔案到新伺服器

2.1.1 確保新Gitlab伺服器和老Gitlab伺服器版本相同

第一步,新伺服器上的Gitlab的版本必須與建立備份時的Gitlab版本號相同. 比如新伺服器安裝的是最新的9.4.3版本的Gitlab, 那麼遷移之前, 最好將老伺服器的Gitlab 升級為9.4.3再進行備份.

這裡寫圖片描述

2.1.2 copy老伺服器上面的備份檔案到新伺服器

第二步,如果你沒修改過預設備份目錄的話,需要將老伺服器上的備份檔案目錄(/var/opt/gitlab/backups目錄)下的備份檔案拷貝到新伺服器上的/var/opt/gitlab/backups目錄。

使用scp命令從遠端伺服器copy檔案或者目錄到本地

scp 使用者名稱 @IP 地址 : 檔名 1 遠端使用者名稱 @IP 地址 : 檔名 2

[使用者名稱 @IP 地址 :] 可以不輸入 , 可能需要輸入遠端使用者名稱所對應的密碼 .

可能有用的幾個引數 :

  • -v 和大多數 linux 命令中的 -v 意思一樣 , 用來顯示進度 . 可以用來檢視連線 , 認證 , 或是配置錯誤 .

  • -C 使能壓縮選項 .

  • -P 選擇埠 . 注意 -p 已經被 rcp 使用 .

  • -4 強行使用 IPV4 地址 .

  • -6 強行使用 IPV6 地址 .

例如我使用如下命令,從遠端伺服器copy剛才的備份檔案到了新伺服器的/var/opt/gitlab/backups/ 目錄下

scp root@172.28.17.155:/var/opt/gitlab/backups/1502357536_2017_08_10_9.4.3_gitlab_backup.tar /var/opt/gitlab/backups/

copy完後,檢視copy的檔案如下

這裡寫圖片描述

2.1.3 從備份檔案中恢復gitlab

1、將備份檔案許可權修改為777

第一步,將備份檔案許可權修改為777,不然可能恢復的時候會出現許可權不夠,不能解壓的問題

chmod 777 1502357536_2017_08_10_9.4.3_gitlab_backup.tar 

2、執行命令停止相關資料連線服務

第二步,執行命令停止相關資料連線服務

# 停止相關資料連線服務
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq

3、執行命令從備份檔案中恢復Gitlab

第三步,執行命令從備份檔案中恢復Gitlab

gitlab-rake gitlab:backup:restore BACKUP=備份檔案編號

例如我們的備份檔案的編號是1502357536_2017_08_10_9.4.3,因此執行下面的命令即可恢復gitlab

gitlab-rake gitlab:backup:restore BACKUP=1502357536_2017_08_10_9.4.3

敲完命令後,出現第一個互動頁面,

root@ubuntu4146:/var/opt/gitlab/backups# gitlab-rake gitlab:backup:restore BACKUP=1502357536_2017_08_10_9.4.3
Unpacking backup ... done
Before restoring the database we recommend removing all existing
tables to avoid future upgrade problems. Be aware that if you have
custom tables in the GitLab database these tables and all data will be
removed.

Do you want to continue (yes/no)? 

輸入“yes”繼續。
這裡寫圖片描述

恢復過程中。。。。。
這裡寫圖片描述

出現第二個互動頁面,

Put GitLab hooks in repositories dirs [DONE]
done
Restoring uploads ... 
done
Restoring builds ... 
done
Restoring artifacts ... 
done
Restoring pages ... 
done
Restoring lfs objects ... 
done
This will rebuild an authorized_keys file.
You will lose any data stored in authorized_keys file.
Do you want to continue (yes/no)? 

這裡寫圖片描述

輸入“yes”繼續。

這裡寫圖片描述

4、執行命令從備份檔案中恢復Gitlab

第四步,啟動Gitlab

sudo gitlab-ctl start

這裡寫圖片描述

3、開啟遷移後的Gitlab,進行對比

老Gitlab伺服器截圖

這裡寫圖片描述

新Gitlab伺服器截圖

這裡寫圖片描述

對比,可以發現,除了兩臺伺服器的ip地址不一樣之外,其他的內容完全一模一樣,遷移成功!

參考文件

關於Cron表示式可以參考連結:

關於gitlab備份可以參考連結:

關於如何將gitlab備份檔案備份到遠端備份伺服器,參考連結:

這裡寫圖片描述

這裡寫圖片描述