Gitlab 代码库迁移恢复
前言
承接之前写过的公司gitlab代码库备份文档,此文档为对进行备份的gitlab代码库备份包进行数据迁移恢复测试。
首先,执行备份的脚本
如下:
#!/usr/bin/bash
## gitlab backup
## by shanhai
gitlab_docker_id=`docker ps | grep gitlab-ce | awk '{print $1}'`
gitlab_image_id=`docker images | grep gitlab-ce | awk '{print $3}'`
gitlab_backup(){
docker exec -it $gitlab_docker_id gitlab-rake gitlab:backup:create
find /home/gbase/app/gitlab/data/backups/ -name "*_13.2.6_gitlab_backup.tar"
if [ $? -eq 0 ];then
cp /home/gbase/app/gitlab/data/backups/*_13.2.6_gitlab_backup.tar /data/gitlab_backup
cp /home/gbase/app/gitlab/config/gitlab.rb /data/gitlab_backup
cp /home/gbase/app/gitlab/config/gitlab-secrets.json /data/gitlab_backup
else
echo "gitlab backup faild, Please check it"
exit
fi
}
images_backup(){
cd /data/gitlab_backup
docker save -o "gitlab_image_backup_`date +%F`.tar.gz" $gitlab_image_id
find /data/gitlab_backup/ -name "gitlab_image_backup_`date +%F`.tar.gz" && find /data/gitlab_backup/ -name "*_13.2.6_gitlab_backup.tar"
if [ $? -eq 0 ];then
/usr/bin/python3 /home/gbase/app/gitlab_backup.py #邮件发送脚本
else
echo "gitlab image backup faild, Please check it"
exit
fi
}
gitlab_backup
images_backup
邮件发送脚本
如下:
#!/usr/bin/env python3
## send email
## by shanhai
import time
import sys
from datetime import datetime
import subprocess
time_start=time.time()
datetime.now()
current_tm=datetime.now().strftime('%Y%m%d%H%M')
today=datetime.now().strftime('%Y-%m-%d')
import smtplib
from socket import gaierror
port = 25
smtp_server = "10.0.0.99"
login = "**@**.com"
password = "****"
sender - "**@**,cin"
receiver_1 = "shanhai@**.com"
receiver_2 = "**@**.com"
message - f"""\
Subject: Gitlab Backup Norification E-Mail {today}
To: {receiver_1},{receiver_2}
From: {sender}
------------------------------------------------------------
The gitalb_package backup is successful
The path is \\10.0.0.1\data\gitlab_backup
------------------------------------------------------------
This is a message by scm_backup with Pythn."""
try:
with smtplib.SMTP(smtp_server, port) as server:
server.login(login, password)
server.sendmail(sender, receiver_1, message)
server.sendmail(sencer, receiver_2, message)
print('Sent')
except (gaierror, ConnectionRefusecdError):
print('Failed to connect to the server. Bad connection settings?')
except smtplib.SMTPServerDisconnected:
print('Failed to connect to the server. Wrong user/password?')
except smtplib.SMTPException as e:
print('SMTP error occurred: ' + str(e))
执行完脚本,备份包存于/data/gitlab_backup目录下,scp此目录下的所有文件到备份恢复测试机
scp /data/gitlab_backup/* root@10.*.*.*:/home/backup
1. docker容器恢复
首先,启动docker
systemctl start docker
systemctl enable docker
然后,将gitlab的docker镜像的备份tar包加载成镜像
docker load -i gitlab_image_backup_2021-09-03.tar.gz
#查看镜像
docker images
#启动容器,并设置端口映射
docker run -itd -p 9180:9180 -p 9443:443 -p 9022:9022 5ff8172ebbfd #docker 镜像ID
#查看容器状态
docker ps -a
效果如下
至此,gitlab的docker容器已恢复成功,下面开始进行gitlab代码库的恢复。
2. gitlab代码库恢复
拷贝本地的gitlab代码库备份文件到容器内,并赋予权限
docker cp /home/backup/1630657992_2021.09.03_13.2.6_gitlab_backup.tar 8ff130655419:/var/opt/gitlab/backups
#进入容器内
docker exec -it 8ff130655419 /bin/bash
#赋予备份包权限
chmod -R 777 /var/opt/gitlab/backups
将压缩包拷进之后,对gitlab.rb文件和nginx下的gitlab-http.conf文件进行编辑,将gitlab.rb文件中的external_url 修改为本地ip+端口号
external_url 'http://10.*.*.*:9180'
wq保存退出,进行nginx配置文件的修改
修改地方如下:
listen *:9180;
server_name 10.*.*.*;
set $http_host_with_default "10.*.*.*:9180";
wq保存退出,执行gitlab-ctl reconfigure
,使配置生效。
然后进行代码库恢复
gitlab-rake gitlab:backup:restore BACKUP=1630657992_2021.09.03_13.2.6 #注意,此处为备份包编号,不是整个备份包的名称
#出现交互界面,输入yes,直至恢复完成。
代码库恢复结束后,重启gitlab服务gitlab-ctl restart
,并查看服务状态gitlab-ctl status
浏览器访问本地ip+端口号,输入原来的管理员账号密码,登陆成功,代码库数据无丢失,至此gitlab服务恢复成功。
3. gitlab项目SSH克隆恢复
进入恢复后的gitlab容器中,ps -ef | grep sshd
,找到sshd_config的配置文件位置,通过vim进行修改配置文件的端口。修改后配置文件内容如下:
修改配置文件后,gitlab-ctl reconfigure,gitlab-ctl restart
,使配置文件生效。
进入任意目录新建测试目录,进入测试目录执行git init
,初始化为git仓库,执行ssh-keygen -t rsa
生成秘钥,cat /root/.ssh/id_rsa.pub
查看公钥,并复制公钥粘贴到gitlab的SSH免密设置中,如下图所示:
生成秘钥后,选择任意一个项目,复制SSH克隆地址,回到测试仓库,执行git clone +SSH克隆地址
。
如项目成功克隆,则SSH已恢复成功。如克隆失败,可查看SSH日志,cat /gitlab/logs/sshd/current
,如显示有.ssh权限报错问题,则是/root/.ssh/
下的文件权限太高,需降低权限chmod -R 700 /root/.ssh
。如报错显示为listening on 0.0.0.0 port 22.
则说明sshd_config配置文件修改错误,gitlab容器内ssh默认22端口没有进行更改。
以下为docker-compose.yaml
文件内容,可进行参考,如端口映射与目录挂载等。此迁移方式是将之前的挂载目录gitlab迁移到新机器后,直接docker-compose up -d
通过docker-compose直接进行恢复。
version: '3'
services:
gitlab:
images: 'gitlab/gitlab-ce'
restart: unless-stopped
ports:
- '9180:9180'
- '9443:443'
- '9022:9022'
volumes:
- ./config:/etc/gitlab
- ./data:/var/opt/gitlab
- ./logs:/var/log/gitlab
- ./ssh/sshd_config:/assets/sshd_config
networks:
defaults:
external:
name: app_bus