最近工作中用到了有关gitlab备份与迁移的东西,分享一下。
手动备份
gitlab提供了方便的备份方式,但在此前先修改一下配置。
在/etc/gitlab/gitlab.rb下进行配置修改。
backup_path可以修改为自己想存备份的目录,这里是/data/gitlab_backup
gitlab_rails['backup_path'] = "/data/gitlab_backup"
backup_keep_time可以设置备份过期的时间,这里设置为十五天。
gitlab_rails['backup_keep_time'] = 1296000
注意要把#删掉才生效,不然是注释。然后重启配置文件,使修改生效。
gitlab-ctl reconfigure
进行备份
执行备份命令
gitlab-rake gitlab:backup:create
这一步将会在先前设置的目录下产生格式为tar的备份包,如:
其中包含备份日期与gitlab的版本号。
需注意,如果要通过备份恢复gitlab,版本号必须与备份版本号一致,这里是13.6.0。
附:gitlab自带的备份功能并不会备份配置文件,如果需要得自己备份,以下为官方文档截图
官方文档地址:Back up and restore GitLab | GitLab
自动备份
实现gitlab的自动备份要用到Linux自带的crontab定时任务功能。
vim /etc/crontab
打开后是这样的
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
添加下面的命令,每天四点进行备份
# gitlab自动备份
0 4 * * * root /opt/gitlab/bin/gitlab-rake gitlab:backup:create
不会crontab的话:Linux crontab 命令
不会vim的话:Linux vi/vim
crontab修改好后,重新加载crond配置并重启cron服务
/usr/sbin/service crond reload
/usr/sbin/service crond restart
成功重启cron服务后,gitlab的自动备份就算实现了。
自动迁移至其他的服务器
ssh免密配置
如果已经实现了免密登录,可以跳过此步骤。
执行scp时,系统需要接收方服务器上账号的密码。所以需要先配置好ssh免密。
不会scp:Linux scp命令
例:
实验环境:
test01,ip 10.78.110.110
test02,ip 10.78.110.111
实现test01的root免密登录test02的root
一、生成密钥
为test01生成密钥,使用rsa加密算法,后面参数一直回车即可。
[root@test01 ~]# ssh-keygen -t rsa
二、将公钥传到test02上,使用ssh-copy-id可以自动配置好接收方的相关配置。还可以用手动scp的方法,网上很多。
[root@test01 ~]# ssh-copy-id -i root@10.78.110.111
执行完ssh-copy-id后会需要输入一次密码,此后就不需要了。
【这里需要注意的是有关ssh的文件和目录的权限都不能改,改了会导致免密设置不成功。】
脚本编写
备份是存在/data/gitlab_backup之下的,建立脚本文件和log目录
touch auto_scp.sh
mkdir scp_log
修改脚本文件内容为:
#!/bin/bash
# 新旧服务器 gitlab备份文件存放路径
BACKUPDIR=/data/gitlab_backup
# 远程备份服务器 登录账户
RemoteUser=root
# 远程备份服务器 IP地址
RemoteIP1=10.78.110.110
RemoteIP2=10.78.110.111
#当前系统日期
DATE=`date "+%Y-%m-%d-%H-%M-%S"`
#Log存放路径
LogFile=$BACKUPDIR/scp_log/$DATE.log
#查找本地备份目录下时间为1天之内并且后缀为.tar的gitlab备份文件
BACKUPFILE_SEND_TO_REMOTE=$(find $BACKUPDIR -type f -mmin -1440 -name '*.tar')
#新建日志文件
touch $LogFile
#追加日志到日志文件
echo "---------------------------------开始-----------------------------------" >> $LogFile
echo "gitlab auto backup to remote server, start at $DATE" >> $LogFile
echo "---------------------------------分割线---------------------------------" >> $LogFile
#输出日志,打印出每次scp的文件名
echo "the file to scp to remote server is $BACKUPFILE_SEND_TO_REMOTE" >> $LogFile
#备份到远程服务器1
scp $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP1:$BACKUPDIR
echo "---------------------------------分割线---------------------------------" >> $LogFile
echo "remote server is $RemoteUser@$RemoteIP1:$BACKUPDIR" >> $LogFile
#备份到远程服务器2
scp $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP2:$BACKUPDIR
echo "---------------------------------分割线---------------------------------" >> $LogFile
echo "remote server is $RemoteUser@$RemoteIP2:$BACKUPDIR" >> $LogFile
#追加日志到日志文件
echo "---------------------------------结束-----------------------------------" >> $LogFile
自动执行脚本
修改crontab内容
vim /etc/crontab
加入以下语句,每天五点scp至其他服务器
# gitlab备份自动scp至其他服务器
0 5 * * * root sh /data/gitlab_backup/auto_scp.sh
重启cron服务
/usr/sbin/service crond reload
/usr/sbin/service crond restart
至此自动scp也完成了。
自动删除过期备份
备份是传输到位了,但如果不进行定期清理的话,过期的备份会越堆越多,占用大量空间。
以下操作就是在接受方的服务器上进行了。
用shell脚本+cron定时服务实现定期清理备份:
建立清理备份脚本
cd /data/gitlab_backup
touch rm_backup.sh
脚本内容为:
#!/bin/bash
#gitlab备份文件存放路径
GITLABDIR=/data/gitlab_backup
# 查找备份路径下,超过15天且文件后缀为.tar的文件,然后删除
find $GITLABDIR -type f -mtime +15 -name '*.tar' -exec rm {} \;
crontab设置
vim /etc/crontab
添加
# 定期清理gitlab备份
0 6 * * * root sh /data/gitlab_backup/rm_backup.sh
重加载配置并重启cron
/usr/sbin/service crond reload
/usr/sbin/service crond restart