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
  • 生成的过程中提示输入密钥对保存位置,直接回车,接受默认值就行了。
  • 如果之前已经有/root/.ssh/id_rsa 文件存在,就会多一个提示问是否需要覆盖,输入y表示覆盖(因为我之前没有这个文件所以是没有这个提示的)。
  • 接着会提示输入一个密码,直接回车,让它空着。当然,也可以输入一个密码。
  • 接着输入确认密码,输入完之后,回车密钥对就生成完了。
    生成完之后会在/root/.ssh下生成id_rsa 和 id_rsa.pub 两个文件,其中公共密钥为id_rsa.pub,私有密钥为id_rsa。
    (2)在A服务器上复制一份rsa公钥证书
    在/root/.ssh下复制备份一份id_rsa.pub 命名为 id_rsa.pub.A,以便拷贝到远程服务器B。
    执行cp命令复制
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

重启后任务即可生效,等指定时间自动备份就可以了;