Docker部署的Gitlab14.6.1备份恢复全网最详细教程

一、环境准备

1、1 检查版本一致性

1)通过配置的个人令牌acces_token访问接口获取版本号

curl --header "PRIVATE-TOKEN: ChRewxxxxxxxxscEADzj" http://XXXXXX:9800/api/v4/version

以上命令运行结果如下图所示:

查询gitlab版本号
查询gitlab版本号

2)通过gitlab命令获取版本号

sudo docker exec -it gitlab gitlab-rake gitlab:env:info | grep "GitLab version"

或者使用docker exec -it gitlab bash 命令进入到gitlab的docker容器内部执行指令:

cat /opt/gitlab/version-manifest.txt | grep "gitlab-ce"

以上命令执行结果如下图所示:

使用gitlab指令查询版本号
查询gitlab版本号

1、2 部署新的gitlab

如果原来的gitlab镜像版本是latest,那么需要执行以下命令保存镜像:

docker save -o gitlab.tar.gz gitlab/gitlab-ce:latest

然后上传到新的服务器上以便于构建gitlab容器实例做备份恢复,如下图所示:

上传到新的服务器上后,执行docker的解压命令解压gitlab.tar.gz镜像包,指令如下:

docker load -i gitlab.tar.gz

然后创建build.sh脚本,并赋予执行权限chmod +x build.sh,文件内容如下:

# 第一个参数设置docker实例名 
#docker run -d --restart always --network=host --name $1  -m $3 -v /home/xuzfile/bi-admin/$2:/opt/app -v /etc/hosts:/etc/hosts -d bi-dev:1.2
# 如果想 http克隆地址监听不同端口需要修改 external_url 'http://git.xxx.com:8080',同时gitlab的nginx映射端口是 -p 8080:8080
docker run -d --hostname 192.168.8.9 --name gitlab --restart always -p 8080:80 -p 9443:443 -p 2222:22 -v /home/xuzfile/gitlab/config:/etc/gitlab -v /home/xuzfile/gitlab/logs:/var/log/gitlab -v /home/xuzfile/gitlab/data:/var/opt/gitlab  -d gitlab/gitlab-ce:latest

使用如上命令可以构建出gitlab新的容器实例

gitlab容器实例
gitlab容器

查询映射到宿主机目录下的初始密码文件,登录到gitlab页面

1、3 恢复前停止关键服务

Gitlab备份恢复只需要开启3个进程:关闭gitlab其他进程只保留3个进程用于备份恢复,进入到docker容器内部后执行以下命令:
 

gitlab-ctl stop
gitlab-ctl start postgresql
gitlab-ctl start redis
gitlab-ctl start gitaly
gitlab-ctl status
gitlab-ctl status | grep postgres
gitlab-ctl status | grep redis
gitlab-ctl status | grep gitaly

二、原gitlab备份与配置打包

、通过使用如下命令进行gitlab备份

#!/bin/bash
set -e

LOG_PATH="/data/gitlab/backup/logs"
BACKUP_PATH="/data/gitlab/backup"
at_date=$(date +%Y-%m-%d)
LOG_FILE="${LOG_PATH}/${at_date}_backup.log"

log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') $1" | tee -a "$LOG_FILE"
}

echo "[INFO] 开始执行 GitLab 容器内备份..." | tee -a "$LOG_FILE"
docker exec -i gitlab /usr/bin/gitlab-rake gitlab:backup:create >> "$LOG_FILE" 2>&1

if grep -q "Backup::Error" "$LOG_FILE"; then
    echo "[ERROR] 备份失败,详情请查看日志:$LOG_FILE"
    exit 1
fi

# 获取最新备份文件名
LATEST_BACKUP_FILE=$(docker exec gitlab bash -c "ls -t /var/opt/gitlab/backups/*.tar 2>/dev/null | head -n 1")
if [ -z "$LATEST_BACKUP_FILE" ]; then
    log "[ERROR] 未找到备份文件,备份可能失败。"
    exit 1
fi

BASENAME=$(basename "$LATEST_BACKUP_FILE")
log "[INFO] 发现最新备份文件: $BASENAME"

# 从容器复制到宿主机
log "[INFO] 从容器复制最新备份文件到宿主机..."
docker cp "gitlab:/var/opt/gitlab/backups/$BASENAME" "${BACKUP_PATH}/backups"

#echo "[INFO] 从容器复制备份文件到宿主机..." | tee -a "$LOG_FILE"
#docker cp gitlab:/var/opt/gitlab/backups "${BACKUP_PATH}/backups"

echo "[INFO] 设置权限..." | tee -a "$LOG_FILE"
chmod -R 777 "$BACKUP_PATH"

echo "[INFO] 清理旧的备份文件(保留最近 10 个)..." | tee -a "$LOG_FILE"
find "${BACKUP_PATH}/backups" -type f -name "*.tar" | sort -r | awk 'NR>10' | xargs -r rm -f

echo "[DONE] GitLab 备份完成。" | tee -a "$LOG_FILE"

通过rsync 或者scp命令将备份包传输到新的gitlab服务器上的docker容器内的备份目录下/var/opt/gitlab/backups/,或者该目录映射的宿主机目录/home/xuzfile/gitlab/data/backups

如果需要恢复webhooks,还需要将原gitlab的秘钥配置文件覆盖到新的gitlab对应目录下。

gitlab-secrets.json文件存储在gitlab的docker目录下/etc/gitlab,映射在本文中的宿主机目录下:

/home/xuzfile/gitlab/config

如果需要配置域名和指定端口访问则需要修改配置文件vim /etc/gitlab/gitlab.rb

#### 注意以下3个配置一定要放到配置文件最前面,且端口是docker容器内部映射端口
比如下面配置8080则需要 -p 8080:8080
 

external_url 'http://xxx.com:8080'
gitlab_rails['gitlab_ssh_host'] = 'xxx.com'
gitlab_rails['gitlab_shell_ssh_port'] = 22

### 修改完以上配置后 一定要重新配置编译生效
 

sudo gitlab-ctl reconfigure

三、新gitlab数据恢复

### 备份恢复步骤
0、将备份文件放到指定目录下


1、进入到docker容器内部
docker exec -it gitlab bash

2、赋予备份文件权限
chmod 777 /var/opt/gitlab/backups/1752290284_2025_07_12_14.6.1_gitlab_backup.tar
chown -R git:git /var/opt/gitlab/backups/1752290284_2025_07_12_14.6.1_gitlab_backup.tar

3、# 修改postgresql配置
vi /var/opt/gitlab/postgresql/data/postgresql.conf
# 如下修改:
listen_addresses = '*'

4、# 修改pg_hba配置
vi /var/opt/gitlab/postgresql/data/pg_hba.conf
# 最后添加:
local   all         all                               trust
host    all         all                               127.0.0.1/32 trust

5、# 重启gitlab服务
gitlab-ctl restart

6、# 修改gitlab账号为超级用户
su - gitlab-psql
/opt/gitlab/embedded/bin/psql -h 127.0.0.1 gitlabhq_production
ALTER USER gitlab WITH SUPERUSER;
\q
exit

7、关闭gitlab其他进程只保留3个进程用于备份恢复
gitlab-ctl stop
gitlab-ctl start postgresql
gitlab-ctl start redis
gitlab-ctl start gitaly
gitlab-ctl status
gitlab-ctl status | grep postgres
gitlab-ctl status | grep redis
gitlab-ctl status | grep gitaly

8、开始执行备份恢复(35min)
gitlab-rake gitlab:backup:restore BACKUP=1752290284_2025_07_12_14.6.1

大概5min后有个确认继续执行过程 输入yes (有2次),以上是第一次输入完yes后开始恢复数据库数据。
后面会先恢复数据库
然后再恢复git仓

9、备份恢复完成后(重启时间比较久 大概需要5min)
gitlab-ctl restart

四、登录gitlab验证

如下图所示webhooks已恢复成功

也可以使用http克隆对应代码仓代码验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

若依Leo - 弹架构

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

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

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

打赏作者

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

抵扣说明:

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

余额充值