Gitlab本地备份与远程机备份
我们的需求是:首先将gitlab按照指定时间自动备份至本地机,然后将本地备份定时自动发送至远程机,以此来达到双备份双保险的目的。
1.本地机备份:
由于我们gitlab安装方式不一样,所以本地备份的具体方式也是有一定的区别的,这里主要介绍两种安装方式的备份:
1.1 yum等方式直接安装gitlab:
如果是直接安装gitlab,在备份上相对来说是比较简单的,我们可以直接使用定时任务来进行本地备份:
使用命令crontab -e;
crontab -e
按照自己的需求添加定时任务即可,比如我需要每天12:00以及20:00进行自动备份,我就要添加以下任务(/opt/gitlab/bin/根据自己的安装目录自行修改):
0 12 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create
0 20 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create
添加完定时任务即可保存退出,然后重启定时任务即可生效:
systemctl restart crond
1.2 docker安装gitlab:
使用docker安装的gitlab最主要的区别就是要进入到容器才可以执行命令,所以我们就不能单纯的使用一个定时任务来达到备份的目的,需要借助一个脚本来备份,我这里将脚本命令起名为gitlab_backup.sh;
#! /bin/bash
docker exec gitlab-dev gitlab-rake gitlab:backup:create
# gitlab-dev 为自己的容器名称,如果不知道可以使用 docker ps 来查询
很简单的一个脚本,就是进入容器然后执行备份命令,有了脚本以后还是要使用定时任务来定时执行脚本进行备份,同样我是按照每天12:00,20:00来进行脚本执行以此达到备份的目的;
使用crontab -e 命令
crontab -e
进入以后添加定时任务(/home/gitlab/为我自己存储脚本的路径,需要自行修改):
0 12 * * * sh /home/gitlab/gitlab_backup.sh
0 20 * * * sh /home/gitlab/gitlab_backup.sh
添加定时任务以后,保存退出,然后重启定时任务:
systemctl restart crond
重启以后定时任务即可生效,gitlab将会在你指定的时间进行自动备份至指定目录(默认路径为/home/gitlab/var/opt/backups,同样/home/gitlab为启动容器时映射的路径需要自行修改);
2.远程机备份
一般为了保险都会再使用一个远程机备份,使用远程机备份其实就是将本地机的备份文件发送至远程机,但是一般来说每次本地发送至远程机的时候都需要输入密码,所以我们需要先进行免密配置来省略输入密码这一步,让本地可以直接发送备份至远程机:
2.1 生成秘钥对
假设A,B两台服务器,我们现在要实现在A服务器上使用root登录B,且不需要输入密码:
(1)在本地服务器A上生成rsa证书:
使用命令:
ssh-keygen -t rsa
cp id_rsa.pub id_rsa.pub.A
(3)将复制的rsa公钥证书发送至服务器B,这里可以直接由A服务器下载至本地然后上传至B服务器,或者使用scp命令发送至B服务器,这里就不详细介绍了;
2.2 秘钥配对
(1)创建authorized_keys文件
在 B 的/root/.ssh下创建authorized_keys文件,可以使用如下命令
touch authorized_keys
(2)设置authorized_keys 文件
通过 cat 命令 把id_rsa.pub.A 追写到 authorized_keys 文件中,命令依次如下:
cat id_rsa.pub.A >> authorized_keys
(3)修改authorized_keys文件的权限
执行如下命令,修改authorized_keys文件的权限
chmod 400 authorized_keys
切记:authorized_keys文件的权限很重要,如果将文件的权限设置为777,那么登录的时候,还是需要提供密码的。
2.3 创建远程备份脚本
服务器A上创建定期备份脚本命名为auto_backup_to_remote.sh,脚本内容如下
#!/bin/bash
# gitlab 服务器A备份路径
LocalBackDir=/home/gitlab/var/opt/backups
# 服务器B备份文件存放路径
RemoteBackDir=/home/gitlab_backups
# 远程备份服务器 登录账户
RemoteUser=root
# 远程备份服务器 IP地址
RemoteIP=10.100.2.69
#当前系统日期
DATE=`date +"%Y-%m-%d"`
#Log存放路径
LogFile=$LocalBackDir/log/$DATE.log
# 查找 本地备份目录下 时间为1000分钟之内的,并且后缀为.tar的gitlab备份文件
#需要注意的一点是:查询时间要合理安排保证不多查不漏查
BACKUPFILE_SEND_TO_REMOTE=$(find /home/gitlab/var/opt/backups -type f -mmin -1000 -name '*.tar*')
#新建日志文件
touch $LogFile
#追加日志到日志文件
echo "Gitlab auto backup to remote server, start at $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
echo "---------------------------------------------------------------------------" >> $LogFile
# 输出日志,打印出每次scp的文件名
echo "---------------------The file to scp to remote server is: $BACKUPFILE_SEND_TO_REMOTE-------------------------------" >> $LogFile
#备份到远程服务器
scp $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP:$RemoteBackDir
#追加日志到日志文件
echo "---------------------------------------------------------------------------" >> $LogFile
创建脚本之后还要将脚本修改为可执行权限,命令如下:
chmod 777 auto_backup_to_remote.sh
2.4 添加定时任务,定时执行脚本备份gitlab
依旧是使用crontab -e 命令:
crontab -e
进入后添加定时任务(每天三点执行脚本进行备份):
0 3 * * * sh /home/gitlab/auto_backup_to_remote.sh
备份时间可以自己进行合理的安排,比如我的是每天12:00,20:00两次进行本地备份,然后次日凌晨三点进行远程备份;
2.5 重启定时任务
systemctl restart crond
重启后任务即可生效,等指定时间自动备份就可以了;