一、环境准备
1、1 检查版本一致性
1)通过配置的个人令牌acces_token访问接口获取版本号
curl --header "PRIVATE-TOKEN: ChRewxxxxxxxxscEADzj" http://XXXXXX:9800/api/v4/version
以上命令运行结果如下图所示:
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"
以上命令执行结果如下图所示:
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页面

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克隆对应代码仓代码验证。
                  
                  
                  
                  
                            
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
                    
              
            
                  
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
					
					
					


            