手把手教你实现Gitlab远程备份(超详细,图文并茂)

       为防止服务器的磁盘损坏数据无法取出,因此我们得做好代码的备份工作,因此除了每天在Gitlab那台服务器上自动备份之外,还需要将每天的备份文件copy到另外一台文件备份服务器上,已达到双保险的要求。

1.服务器**配对,取消scp传输密码限制

       远程手动备份数据费时费力且不及时。最好的方法就是通过脚本实现远程自动互备。但远程无论是通过SSH登陆,还是通过scp拷贝文件都需要输入密码。为了克服这个问题,首先需要实现不需要密码的SSH登陆,这样就可以使用 rsync,scp,rexec等命令来做的远程备份了。

前提:本地服务器:A(gitlab服务器), 远程服务器:B

2.生成**对

     假设A,B两服务器,现在需要在A机上用root登陆B机,而不需要输入密码。那我们可按照下面的步骤来做:

  2.1 在本地服务器A上生成rsa证书

    在本地服务器A上生成rsa证书,运行命令:

    ssh-****** -t rsa

手把手教你实现Gitlab远程备份(超详细,图文并茂) (1) 生成的过程中提示输入**对保存位置,直接回车,接受默认值就行了。

 (2) 因为之前已经有/root/.ssh/id_rsa 文件存在,因此提示你是否覆盖,输入y表示覆盖

(3) 接着会提示输入一个密码,直接回车,让它空着。当然,也可以输入一个密码。

(4) 接着输入确认密码,输入完之后,回车**对就生成完了。

在/root/.ssh下生成id_rsa 和 id_rsa.pub 两个文件,

其中公共**保存在 /root/.ssh/id_rsa.pub,私有**保存在/root/.ssh/id_rsa。

2.2 在本地服务器A上cp生成rsa公钥证书

然后在/root/.ssh下复制备份一份id_rsa.pub 命名为 id_rsa.pub.A,以便拷贝到远程服务器B。

执行cp命令复制

cp id_rsa.pub id_rsa.pub.A

2.3 cp生成rsa公钥证书到远程服务器B

使用scp命令进行远程复制,将A机生成的id_rsa.pub.A拷贝到远程服务器B的/root/.ssh目录下

[email protected]:~/.ssh# scp /root/.ssh/id_rsa.pub.A [email protected]远程服务器ip:/root/.ssh/

[email protected]远程服务器ip's password:

id_rsa.pub.A     

这里使用scp命令需要输入密码,当我们把下面的第三步执行完毕之后,以后本地服务器A使用scp命令复制文件到远程服务器B的话,就不需要再次输入密码。

3.**配对

3.1 创建authorized_keys文件

现在我们在 B 的/root/.ssh下创建authorized_keys文件,使用如下命令

touch authorized_keys

3.2 设置authorized_keys 文件

通过 cat 命令 把id_rsa.pub.A 追写到 authorized_keys 文件中,命令依次如下:

cat id_rsa.pub.A >> authorized_keys

3.3 修改authorized_keys文件的权限

执行如下命令,修改authorized_keys文件的权限

chmod 400 authorized_keys

authorized_keys文件的权限很重要,如果设置为777,那么登录的时候,还是需要提供密码的。

3.4 测试

测试服务器A使用scp命令复制文件到服务器B是否还需要密码

在服务A上,再次使用刚才的命令,发现已经可以不需要输入密码

4.创建Shell定时远程备份脚本

4.1 在本地服务器A上创建定时远程备份脚本

本地服务器A上创建定期备份脚本auto_backup_to_remote.sh,脚本内容如下

#!/bin/bash

# gitlab 机房备份路径

LocalBackDir=/data/gitlabData/backups

# 远程备份服务器 gitlab备份文件存放路径

RemoteBackDir=/root/gitlabDataBackup

# 远程备份服务器 登录账户

RemoteUser=root

# 远程备份服务器 IP地址

RemoteIP=(你的远程服务器地址)请自己修改

#当前系统日期

DATE=`date +"%Y-%m-%d"`

#Log存放路径

LogFile=$LocalBackDir/log/$DATE.log

# 查找 本地备份目录下 时间为60分钟之内的,并且后缀为.tar的gitlab备份文件

BACKUPFILE_SEND_TO_REMOTE=$(find /data/gitlabData/backups -type f -mmin -60  -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 [email protected]$RemoteIP:$RemoteBackDir

#追加日志到日志文件

echo "---------------------------------------------------------------------------" >> $LogFile

4.2 修改备份脚本权限

chmod 777 auto_backup_to_remote.sh

4.3 手动执行脚本

现在为了验证脚本是否可以正常运行,我们需要手动执行脚本。

先在终端执行find命令,看是否能够正常查找出我们要scp到远程服务器的Gitlab备份文件

[email protected]:/data/gitlabData/backups# find /data/gitlabData/backups -type f -mmin -1000  -name '*.tar*'

/data/gitlabData/backups/1502906429_2017_08_17_9.4.3_gitlab_backup.tar

将定时远程备份脚本auto_backup_to_remote.sh修改完毕之后,我们试着手动执行该脚本,看是否能够正常运行。

[email protected]:/data/gitlabData/backups# ./auto_backup_to_remote.sh

切换到远程服务器B,在指定位置查看文件是否复制成功

5.定时执行脚本

5.1 编辑/etc/crontab 文件

即vi /etc/crontab,然后添加相应的任务。

在上面的定时任务后面,再添加一个执行复制刚备份好的Gitlab备份文件到服务器B的脚本任务。如下所示:

# 添加定时任务,每天凌晨三点,执行gitlab备份到远程服务器

0 3    * * *   root   /data/gitlabData/backups/auto_backup_to_remote.sh

 

手把手教你实现Gitlab远程备份(超详细,图文并茂) 

5.2 重启cron服务

/sbin/service crond reload //重新载入配置

/sbin/service crond restart //重启服务  

5.3 测试自动化脚本

为了能够测试,该脚本是否能够在指定时间的时候,真的能够自动执行,我们将时间修改为15:55分。修改如下:

# 添加定时任务,每天凌晨三点,执行gitlab备份到远程服务器

55  15    * * *   root   /data/gitlabData/backups/auto_backup_to_remote.sh

重启cron服务,切换到远程服务器B,查看结果

  1. 定时删除远程服务器上的备份文件

6.1 创建定期删除过期的备份文件的脚本

创建定期删除过期的备份文件的脚本auto_remove_old_backup.sh

[[email protected] gitlabDataBackup]# touch auto_remove_old_backup.sh

6.2 编写脚本auto_remove_old_backup.sh

vi auto_remove_old_backup.sh

脚本内容如下 :

#!/bin/bash

# 远程备份服务器 gitlab备份文件存放路径

GitlabBackDir=/root/gitlabDataBackup

# 查找远程备份路径下,超过30天 且文件后缀为.tar 的 Gitlab备份文件 然后删除

find $GitlabBackDir -type f -mtime +30 -name '*.tar*' -exec rm {} \;

6.3定时执行删除脚本

将脚本加入/etc/crontab 文件

#添加定时任务,每天凌晨4点,执行删除过期的Gitlab备份文件

 0 4 * * * root /root/gitlabDataBackup/auto_remove_old_backup.sh

6.4重启crond服务