gitlab迁移和定时备份

本文介绍如何使用rsync实现服务器之间的文件同步,并详细记录了一套完整的GitLab备份及恢复方案,包括服务端配置、客户端监控脚本编写、自动化备份流程以及恢复测试步骤。

一、服务端rsync

# 在Ubuntu server上,rsync和inotify默认都是安装了的。配置以xinetd方式运行。
sudo apt-get install rsync xinetd 

# 创建存放文件目录,命令如下: 
sudo mkdir /data/tongbu

# 修改rsync启动方式 
sudo vim /etc/default/rsync

## 第14行
RSYNC_ENABLE=inetd 
# rsync启动方式的配置文件 
sudo vim /etc/xinetd.d/rsync (新文件)
## 添加以下内容
service rsync
{
        disable         = no
        wait            = no
        socket_type     = stream
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure += USERID
}
# 修改配置文件
# 空文件,可以通过以下代码复制模板
# sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc 
sudo vim /etc/rsyncd.conf 
max connections = 65535
log file = /var/log/rsync.log
timeout = 300
read only = no
list = yes
uid = root
gid = root
auth users = rsync
secrets file = /etc/rsyncd.secrets
[gitlab]
path = /data/gitlab



# 用户组最好设置为root,不然文件权限同步过去的时候会变化。
sudo mkdir /data
sudo chown -R xxx:xxx /data
mkdir -p /data/beifen/gitlab


# 创建rsync传输过程中的认证文件 
sudo vim /etc/rsyncd.secrets

rsync:123

# 修改文件权限
sudo chmod 600 /etc/rsyncd.secrets

# 重启xinetd
sudo /etc/init.d/xinetd restart

# 查看端口,查看服务是否启动成功
sudo netstat -ntpl|grep 873

# 测试
rsync rsync@xxx.xxx.x.xxx::gitlab

二、客户端:sersync

cd /home/xxx
mkdir sersync
# 下载
sudo wget http://down.whsir.com/downloads/sersync2.5.4_64bit_binary_stable_final.tar.gz
# 解包
sudo tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz 
# 解压后两个文件直接放在/usr/local/sersync2.5/目录下即可
sudo mkdir /usr/local/sersync
sudo mv /opt/GNU-Linux-x86/confxml.xml /usr/local/sersync
sudo mv /opt/GNU-Linux-x86/sersync2 /usr/local/sersync

监控脚本

# 修改配置文件
sudo vim /usr/local/sersync/confxml.xml     

修改 目录、密码文件、日志路径。其他不变

        <localpath watch="/opt/gitlab_backup">   #需同步的目录
            <remote ip="xxx.xxx.xxx.xxx" name="gitlab"/>
        </localpath>
        <rsync>
            <commonParams params="-auvPz"/> 
            <auth start="true" users="test" passwordfile="/etc/rsync.pas"/> #密码文件,需创建
            <userDefinedPort start="false" port="874"/><!-- port=874 -->
            <timeout start="true" time="100"/><!-- timeout=100 -->
            <ssh start="false"/>
        </rsync>
        <failLog path="/home/cmcc/sersync/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
# 错误日志文件,指定路径

# 创建密码文件
sudo vim /etc/rsync.pas
123 #不需要写验证用户
# 赋权
sudo chmod 600 /etc/rsync.pas
# 开启
sudo /usr/local/sersync/sersync2 -r -d -o /usr/local/sersync/confxml.xml
sudo /usr/local/sersync/sersync2 -r -d -o /usr/local/sersync/mntxml.xml
#关闭
kill -9 `pidof sersync2`

定时任务

创建定时任务
crontab -e
0 0 */3  *  *  sudo bash 脚本名称

三、gitlab备份脚本(脚本分为两部分,一个备份,一个打包需在目录下)

#!/usr/bin/bash
  
#获取当前时间
locale_date=`date +%Y-%m-%d.%H.%M`
docker_id=`sudo docker ps -a | grep gitlab-ce | awk '{print $1}'`

#本地备份路径
backup_path=/opt/gitlab_backup

#日志路径
backup_log=/opt/gitlab_backup/gitlab_back.log

#判断/opt/gitlab_backup目录是否存在,否则创建
if [ ! -d ${backup_path} ]; then
        sudo mkdir ${backup_path}
fi



#删除15天之前的备份数据
sudo find ${backup_path} -mtime +15 -name "*" -exec rm -rf {} \;

#CRON=1 环境变量CRON=1的作用是如果没有任何错误发生时, 抑制备份脚本的所有进度输出
#BACKUP=${locale_date}改变backup文件名称 例: 2021-06-15_11:22:52_gitlab_backup.tar
echo "###############开始备份gitlab数据###################"
sudo docker exec -i ${docker_id} /bin/bash -c 'cd opt/gitlab/bin/ && gitlab-backup create '
if [ $? -eq 0 ];then
	echo "当次备份文件名称:/home/gitlab/data/backups/${filename}"
        echo "${locale_date} ${backup_path}_gitlab_backup.tar 备份创建成功." >> ${backup_log}

else
        echo "${locale_date} ${backup_path}_gitlab_backup.tar 备份创建失败." >>  ${backup_log}
        exit 1
fi
echo "#################备份完成,复制配置文件############"
sudo bash gitlab_cp_tar.sh

存放备份包文件加要和sersync监控文件夹一致,否则无法实时同步

#!/bin/bash
filename=`sudo ls  /home/gitlab/data/backups/ |grep '^[0-9]*' |tail  -1 `
#获取当前时间
locale_date=`date +%Y-%m-%d.%H.%M`
docker_id=`sudo docker ps -a | grep gitlab-ce | awk '{print $1}'`

#本地备份路径
backup_path=/opt/gitlab_backup
backup_tar=${locale_date}_bak

#日志路径
backup_log=/opt/gitlab_backup/gitlab_back.log

echo "#拷贝配置文件至本地备份目录/opt/gitlab_backups"
cd /home/gitlab/data
sudo cp ./backups/${filename} /opt/gitlab_backup
sudo cp  /home/gitlab/config/gitlab-secrets.json ${backup_path}/${locale_date}_gitlab-secrets.json >> ${backup_log}
sudo cp  /home/gitlab/config/gitlab.rb ${backup_path}/${locale_date}_gitlab.rb >> ${backup_log}

echo "#创建压缩文件包" 
cd /opt/gitlab_backup/
echo "#################开始移动打包所需文件##############"

if [ ! -d ${backup_tar} ]; then
        sudo mkdir ${backup_tar}
fi

sudo mv ./${filename} ./${backup_tar} 
sudo mv ${backup_path}/${locale_date}_gitlab-secrets.json  ./${backup_tar}
sudo mv ${backup_path}/${locale_date}_gitlab.rb  ./${backup_tar}
sudo mv gitlab_back.log  ./${backup_tar}
sudo ls ./${backup_tar}
echo "开始打包"
sudo tar -cvf ${locale_date}_gitlab_bak.tar  ./${backup_tar}
sudo rm -rf ./${backup_tar}
sleep 3
echo "本地打包完成"

四、恢复测试

注:在rsync服务端上容器运行gitlab   # gitlab版本需要一致12.13.0
#需要同步本机时间
sudo docker run -d  -p 443:443 -p 8080:80 -p 10022:22 --name gitlab --restart always -v /home/gitlab/config:/etc/gitlab -v /etc/localtime:/etc/localtime:ro -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce

将备份的文件包,解压至/home/cmcc/gitlab_bak/
cd /data/beifen/gitlab/
sudo tar -xvf xxx.xxx.xxx_gitlab_bak.tar -C  /home/cmcc/gitlab_bak/   #gitlab备份包

#复制配置文件,复制地址根据解压目录而定。此处参考
cd /home/cmcc/gitlab_bak/
sudo cp -f  *gitlab.rb  /home/gitlab/config/gitlab.rb
sudo cp -f  *gitlab-secrets.json  /home/gitlab/config/gitlab-secrets.json

#导入备份代码至容器
docker cp 1638170628_2021_11_29_13.12.0_gitlab_backup.tar $(sudo docker ps -a | grep gitlab-ce | awk '{print $1}'):/var/opt/gitlab/backups/
#进入容器
sudo docker exec -it $(sudo docker ps -a | grep gitlab-ce | awk '{print $1}') bash

#停止对应服务
/opt/gitlab/bin/gitlab-ctl stop unicorn
/opt/gitlab/bin/gitlab-ctl stop puma
/opt/gitlab/bin/gitlab-ctl stop sidekiq

#恢复
/opt/gitlab/bin/gitlab-backup restore BACKUP=1638170628_2021_11_29_13.12.0
#根据提示输入yes

#重启服务
/opt/gitlab/bin/gitlab-ctl reconfigure
/opt/gitlab/bin/gitlab-ctl restart

#等待约一分钟后访问测试
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人生不过大梦一场

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值