1. 程式人生 > 其它 >Centos 8 上定時備份Gitlab ,指令碼實現定時備份,備份恢復

Centos 8 上定時備份Gitlab ,指令碼實現定時備份,備份恢復

定時備份

要求
為了能夠備份和恢復,請確保你的系統上安裝了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