1.备份需求
1.gitlab服务器每天凌晨1点在gitlab服务器本地打包备份(gitlab的nginx配置,主配置和gitlab自带备份文件,这也是gitlab所需要备份的)
2.gitlab服务器备份的数据必须存放至以主机名ip地址当前时间命名的目录中
3.gitlab服务器最后通过rsync推送本地已经打包好的备份文件至backup服务器,并就传输结果进行判断,如果传输失败,发送邮件通知,否则不发。
4.gitlab服务器本地保留最近7天的备份数据,避免浪费磁盘空间
5.准备好backup服务器用于接收gitlab服务端推送过来的备份数据
6.backup服务器需要每天早上5点校验gitlab服务端推送过来的数据是否完整
7.backup服务器需要每天校验的结果进行判断,如果数据不完整,则邮件将详细信息进行邮件通知,否则不通知
8.服务端仅保留 1 个月的备份数据,其余的全部删除
2.脚本总结
1.gitlab服务端脚本
这里注意脚本执行之前创建好对应的备份主目录,安装rsync服务,和配置好邮件服务,让gitlab服务端可以对外发送邮件。
[root@github-no gitlab]# cat /data/gitlab-backup.sh #!/bin/bash #定义相关变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin Host=$(hostname) Addr=$(ifconfig enp94s0f0|awk 'NR==2{print $2}') Date=$(date +%F) Dest=${Host}_${Addr}_${Date} email="boliu16@iflytek.com" Path=/iflytek/git-backup
#判断备份目录是否当天的备份目录是否生成,否的话,就创建当天对应备份目录 [ -d $Path/$Dest ] || mkdir -p $Path/$Dest #判断当天备份目录是否有对应备份文件了,有就直接跳过,没有的话执行对应备份打包步骤。
[ -f $Path/$Dest/git_conf.tar.gz ] || tar czPf $Path/$Dest/git_conf.tar.gz /etc/gitlab && [ -f $Path/$Dest/git_nginx.tar.gz ] || tar czPf $Path/$Dest/git_nginx.tar.gz /var/opt/gitlab/nginx/conf && [ -f $Path/$Dest/gitlab_backup.tar.gz ] || gitlab-rake gitlab:backup:create >> $Path/$Dest/gitlab-backup.log && tar czPf $Path/$Dest/gitlab_backup.tar.gz /disk1/gitlab/backups
#对备份文件打上标签,携带 md5 验证信息
[ -f $Path/$Dest/flag_$Date ] || md5sum $Path/$Dest/*.tar.gz > $Path/$Dest/flag_$Date #推送本地数据至备份服务器
export RSYNC_PASSWORD=iflytek_zf@2020 rsync -avz $Path/ iflytek_zf@172.31.242.190::git-backup #对推送结果进行判断,推送失败的话,发送对应提醒邮件。
if [ $? -eq 0 ];then echo -e "$Date ------------stop rsync-----------" >> $Path/$Dest/gitlab-backup.log echo -e "主机:$Host 机器IP:$Addr 时间:$Date 描述:CI平台gitlab备份成功!" >> $Path/$Dest/gitlab-backup.log else echo -e "$Date ------------stop rsync-----------" >> $Path/$Dest/gitlab-backup.log echo -e "主机:$Host 机器IP:$Addr 时间:$Date 描述:CI平台gitlab备份失败!"| mail -s "备份反馈" $email fi
#本地保留最近 7 天的数据 find $Path/ -type d -mtime +7|xargs rm -rf
#编写对应定时任务,操作和vim很像 [root@github-no data]# crontab -e #查看当前用户的定时任务设置情况,我这里为了服务器时间准确做了每5分钟向时间服务器同步一次时间,然后就是每天的凌晨1点钟执行备份脚本。 [root@github-no data]# crontab -l */5 * * * * /usr/sbin/ntpdate 172.16.100.21 0 1 * * * /usr/bin/bash /data/gitlab-backup.sh > /dev/null 2>&1
2.backup服务器脚本
[root@no git-backup]# cat gitlab_check_backup.sh #!/bin/bash #定义全局的变量和局部变量
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin Path=/iflytek/git-backup Date=$(date +%F) email="boliu16@iflytek.com" #查看 flag 文件,并对该文件进行校验, 然后将校验的结果保存至 result文件中。
find $Path/ -type f -name "flag_$Date"|xargs md5sum -c > $Path/result_${Date} #判断上面效验结果,失败就发送提醒邮件
if [ $? -ne 0 ];then mail -s "Rsync Backup $Date" $email < $Path/result_${Date} fi
#删除超过 7 天的校验结果文件, 删除超过 30天的备份数据文件
find $Path/ -type f -name "result*" -mtime +7|xargs rm -rf find $Path/ -type d -mtime +30|xargs rm -rf
[root@github-no data]# crontab -e [root@github-no data]# crontab -l */5 * * * * /usr/sbin/ntpdate 172.16.100.21 0 5 * * * /usr/bin/bash /iflytek/git-backup/gitlab_check_backup.sh > /dev/null 2>&1