最近工作中用到了有关gitlab备份与迁移的东西,分享一下。


Gitlab自动备份与迁移

  • 手动备份
  • 在/etc/gitlab/gitlab.rb下进行配置修改。
  • 进行备份
  • 自动备份
  • 自动迁移至其他的服务器
  • ssh免密配置
  • 脚本编写
  • 自动执行脚本
  • 自动删除过期备份


手动备份

gitlab提供了方便的备份方式,但在此前先修改一下配置。

在/etc/gitlab/gitlab.rb下进行配置修改。

gitlab不同版本之间可以备份吗 gitlab 备份 迁移_gitlab


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 备份 迁移_gitlab_02


其中包含备份日期与gitlab的版本号。

需注意,如果要通过备份恢复gitlab,版本号必须与备份版本号一致,这里是13.6.0。附:gitlab自带的备份功能并不会备份配置文件,如果需要得自己备份,以下为官方文档截图

gitlab不同版本之间可以备份吗 gitlab 备份 迁移_shell_03


官方文档地址: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