Centos 8 上定時備份Gitlab ,指令碼實現定時備份,備份恢復
阿新 • • 發佈:2021-06-26
定時備份
要求
為了能夠備份和恢復,請確保你的系統上安裝了Rsync
yum install rsync -y
配置備份目標機器免密認證
執行ssh-keygen -t rsa 生成私鑰和公鑰
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected];此時輸入133的密碼,後期就會實現免密登入。
修改gitlab配置檔案:
vim /etc/gitlab/gitlab.rb
指定備份後資料存放的路徑、許可權、時間配置
gitlab_rails['manage_backup_path'] = true #292行 開啟備份功能 gitlab_rails['backup_path'] = "/opt/gitlab_backups" #293行 指定備份的路徑 gitlab_rails['backup_archive_permissions'] = 0644 #296行 備份檔案的許可權 gitlab_rails['backup_keep_time'] = 7776000 #301行 備份保留時間(保留90天 單位:秒)
注意備份路徑,備份主機要與本機一致,修改後記得執行gitlab-ctl reconfigure
建立備份目錄並授權:
mkdir /opt/gitlab_backups && chown -R git.git /opt/gitlab_backups/
重新生效Gitlabb配置:
gitlab-ctl reconfigure
手動備份:
[root@gitlabdev ~]# gitlab-backup create 2021-06-15 10:37:09 +0800 -- Dumping database ... Dumping PostgreSQL database gitlabhq_production ... [DONE] 2021-06-15 10:37:12 +0800 -- done 2021-06-15 10:37:12 +0800 -- Dumping repositories ... * eda_groups/naura_eda (@hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278) ... * eda_groups/naura_eda (@hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278) ... [DONE] * eda_groups/naura_eda.wiki (@hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.wiki) ... * eda_groups/naura_eda.wiki (@hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.wiki) ... [EMPTY] [SKIPPED] * eda_groups/naura_eda.design (@hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.design) ... * eda_groups/naura_eda.design (@hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.design) ... [EMPTY] [SKIPPED] 2021-06-15 10:37:15 +0800 -- done 2021-06-15 10:37:15 +0800 -- Dumping uploads ... 2021-06-15 10:37:15 +0800 -- done 2021-06-15 10:37:15 +0800 -- Dumping builds ... 2021-06-15 10:37:15 +0800 -- done 2021-06-15 10:37:15 +0800 -- Dumping artifacts ... 2021-06-15 10:37:15 +0800 -- done 2021-06-15 10:37:15 +0800 -- Dumping pages ... 2021-06-15 10:37:15 +0800 -- done 2021-06-15 10:37:15 +0800 -- Dumping lfs objects ... 2021-06-15 10:37:15 +0800 -- done 2021-06-15 10:37:15 +0800 -- Dumping container registry images ... 2021-06-15 10:37:15 +0800 -- [DISABLED] Creating backup archive: 1623724635_2021_06_15_13.12.3_gitlab_backup.tar ... done Uploading backup archive to remote storage ... skipped Deleting tmp directories ... done done done done done done done done Deleting old backups ... done. (0 removed) Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data and are not included in this backup. You will need these files to restore a backup. Please back them up manually. Backup task is done.
ps:這裡提示 gitlab.rb 和 gitlab-secrets.json 包涵敏感資料需要手動備份
檢視備份:
ll -sh /opt/gitlab_backups/
編寫備份指令碼,結合crontab實施自動定時備份,比如每天0點、6點、12點、18點各備份一次
編寫備份指令碼:
#!/usr/bin/bash #獲取當前時間 locale_date=`date +%Y-%m-%d.%H.%M.%S` #遠端IP備份主機ip backup_host=192.168.101.133 #本地備份路徑 backup_path=/opt/gitlab_backups #日誌路徑 backup_log=/opt/gitlab_backups/gitlab_back.log #CRON=1 環境變數CRON=1的作用是如果沒有任何錯誤發生時, 抑制備份指令碼的所有進度輸出 #BACKUP=${locale_date}改變backup檔名稱 例: 2021-06-15_11:22:52_gitlab_backup.tar /opt/gitlab/bin/gitlab-backup create BACKUP=${locale_date} CRON=1 if [ $? -eq 0 ];then echo "${locale_date} ${backup_path}_gitlab_backup.tar 備份建立成功." >> ${backup_log} else echo "${locale_date} ${backup_path}_gitlab_backup.tar 備份建立失敗." >> ${backup_log} exit 1 fi #判斷/opt/gitlab_backups目錄是否存在,否則建立 if [ ! -d ${backup_path} ]; then mkdir ${backup_path} fi #拷貝配置檔案至本地備份目錄/opt/gitlab_backups cp -af /etc/gitlab/gitlab-secrets.json ${backup_path}/${locale_date}_gitlab-secrets.json >> ${backup_log} cp -af /etc/gitlab/gitlab.rb ${backup_path}/${locale_date}_gitlab.rb >> ${backup_log} #同步本地 /opt/gitlab_backups目錄到遠端/opt/目錄下 rsync -avzPr --delete /opt/gitlab_backups root@${backup_host}:/opt/ >> ${backup_log} [root@gitlabdev ~]# chmod +x /opt/gitlab_backups/gitlab_back.sh 加入定時任務: crontab -e #新增定時任務 crontab -l #檢視已新增定時任務 [root@gitlabdev ~]# crontab -l 0 0,6,12,18 * * * /bin/bash /opt/gitlab_backups/gitlab_back.sh > /dev/null 2>&1
GItlab只能還原到與備份檔案相同的gitlab版本。
備份恢復指令碼
#!/bin/bash
local_ip=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
echo -e "本機IP:${local_ip} \n"
echo -e "\033[36m發現以下下備份檔案:\n \033[0m"
ls -lt /opt/gitlab_backups/*.tar|awk -F '/' '{print $4}'
echo -e "\n\033[36m請輸入要恢復的檔案或時間節點:\033[0m"
read input
gitlab_backup=${input%%_*}
gitlab_rb=/opt/gitlab_backups/${gitlab_backup}_gitlab.rb
secrets_json=/opt/gitlab_backups/${gitlab_backup}_gitlab-secrets.json
echo -e "\n\033[36m即將恢復以下檔案:\033[0m"
echo "/opt/gitlab_backups/${gitlab_backup}_gitlab_backup.tar"
echo ${gitlab_rb}
echo ${secrets_json}
sed -i "s#\(^external_url .*\)#external_url 'http://${local_ip}' #g" ${gitlab_rb}
chown -Rf git:git /opt/gitlab_backups
#/bin/cp -f /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb-`date +%Y-%m-%d_%H_%M_%S`-backup
#/bin/cp -f /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json-`date +%Y-%m-%d_%H_%M_%S`-backup
#/bin/cp -f ${gitlab_rb} /etc/gitlab/gitlab.rb
#/bin/cp -f ${secrets_json} /etc/gitlab/gitlab-secrets.json
#/opt/gitlab/bin/gitlab-ctl reconfigure
echo -e "\n\033[36m停止資料庫服務\033[0m"
/opt/gitlab/bin/gitlab-ctl stop unicorn
/opt/gitlab/bin/gitlab-ctl stop puma
/opt/gitlab/bin/gitlab-ctl stop sidekiq
echo -e "\n\033[36m開始恢復${gitlab_backup}備份:\033[0m"
/opt/gitlab/bin/gitlab-backup restore BACKUP=${gitlab_backup}
echo -e "\n\033[36m備份本機配置檔案\033[0m"
/bin/cp -f /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb-`date +%Y-%m-%d_%H_%M_%S`-backup
/bin/cp -f /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json-`date +%Y-%m-%d_%H_%M_%S`-backup
ls -lt /etc/gitlab/|grep `date +%Y-%m-%d_%H_%M_%S`
echo -e "\n\033[36m覆蓋本機配置檔案\033[0m"
/bin/cp -f ${gitlab_rb} /etc/gitlab/gitlab.rb
/bin/cp -f ${secrets_json} /etc/gitlab/gitlab-secrets.json
echo "/etc/gitlab/gitlab.rb"
echo "/etc/gitlab/gitlab-secrets.json"
echo -e "\n\033[36m重新載入配置檔案並重啟服務\033[0m"
/opt/gitlab/bin/gitlab-ctl reconfigure
/opt/gitlab/bin/gitlab-ctl restart