Gitlab无故障升级

升级路径

Upgrade-Path

验证当前环境

# 进入docker-compose目录
cd /path/to/docker-compose

# 检查当前状态
docker-compose ps

# 查看GitLab版本
docker-compose exec gitlab cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

# 检查卷使用情况
docker-compose exec gitlab df -h /etc/gitlab /var/opt/gitlab /var/log/gitlab

创建备份目录

变量仅对当前shell生效

# 创建备份目录结构
BACKUP_TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/docker-data/gitlab_backups/upgrade_${BACKUP_TIMESTAMP}"
mkdir -p ${BACKUP_DIR}/{config,data,logs}

# 验证磁盘空间
AVAILABLE_SPACE=$(df -h /docker-data | tail -1 | awk '{print $4}')
echo "可用空间: ${AVAILABLE_SPACE}"

使用GitLab内置工具(最安全)备份

# 1. 进入维护模式
docker-compose exec gitlab gitlab-ctl deploy-page up

# 2. 停止后台任务(减少数据写入)
docker-compose exec gitlab gitlab-ctl stop sidekiq
docker-compose exec gitlab gitlab-ctl stop mailroom

# 3. 等待10秒确保所有操作完成
sleep 10

# 4. 执行GitLab官方备份(包含数据库、仓库、附件等)
docker-compose exec gitlab gitlab-backup create \
  BACKUP_PATH=/var/opt/gitlab/backups \
  STRATEGY=copy \
  SKIP=builds,registry

# 5. 查看备份文件
docker-compose exec gitlab ls -lh /var/opt/gitlab/backups/

# 6. 将备份复制到宿主机
BACKUP_FILE=$(docker-compose exec gitlab bash -c 'ls -t /var/opt/gitlab/backups/*_gitlab_backup.tar | head -1')
if [ -n "$BACKUP_FILE" ]; then
    docker cp gitlab:${BACKUP_FILE} ${BACKUP_DIR}/data/
    echo "备份文件已复制到: ${BACKUP_DIR}/data/"
fi

# 7. 备份配置文件
cp -a /docker-data/gitlab/config ${BACKUP_DIR}/config/

# 8. 停止GitLab服务(准备升级)
docker-compose exec gitlab gitlab-ctl stop unicorn
docker-compose exec gitlab gitlab-ctl stop puma
docker-compose exec gitlab gitlab-ctl stop gitlab-workhorse

停止旧服务

# 完整停止所有GitLab服务
docker-compose exec gitlab gitlab-ctl stop

# 确认服务已停止
docker-compose exec gitlab gitlab-ctl status

# 停止容器
docker-compose stop gitlab

# 删除容器
docker compose down

修改配置文件

# 备份当前docker-compose文件
cp docker-compose.yaml docker-compose.yaml.18.2.8

# 更新镜像版本
sed -i 's|image: gitlab/gitlab-ce:18.2.8-ce.0|image: gitlab/gitlab-ce:18.5.5-ce.0|' docker-compose.yaml

# 验证修改
grep "image:" docker-compose.yaml

拉取新镜像

# 拉取新版本镜像
docker-compose pull

# 查看拉取的镜像
docker images | grep gitlab-ce

启动升级

# 启动新版本容器
docker compose up -d

# 监控升级日志(关键步骤)
docker-compose logs -f gitlab --tail=50 | grep -E \
  "Upgrading|migrate|upgrade|completed|success|ERROR|WARNING"

# 等待升级完成(通常需要5-15分钟)
echo "等待GitLab升级完成..."
sleep 300

# 检查服务状态
docker-compose exec gitlab gitlab-ctl status

升级验证脚本

结合页面和代码拉取推送判断

#!/bin/bash
# verify_upgrade_fixed.sh - 兼容所有shell的升级验证脚本

echo "=== GitLab升级验证 (兼容版本) ==="

# 函数:输出带颜色的消息
green() { echo -e "\033[32m$1\033[0m"; }
red() { echo -e "\033[31m$1\033[0m"; }
yellow() { echo -e "\033[33m$1\033[0m"; }

# 1. 检查容器状态(兼容性写法)
echo "1. 容器状态:"
docker-compose ps

# 获取容器状态(兼容性写法)
CONTAINER_NAME="gitlab"
CONTAINER_ID=$(docker-compose ps -q gitlab 2>/dev/null)

if [ -n "$CONTAINER_ID" ]; then
    # 使用docker inspect获取状态(兼容性写法)
    CONTAINER_STATUS=$(docker inspect --format='{{.State.Status}}' "$CONTAINER_ID" 2>/dev/null)
    HEALTH_STATUS=$(docker inspect --format='{{if .State.Health}}{{.State.Health.Status}}{{else}}no-healthcheck{{end}}' "$CONTAINER_ID" 2>/dev/null)
    
    echo "容器ID: $CONTAINER_ID"
    echo "运行状态: $CONTAINER_STATUS"
    echo "健康状态: $HEALTH_STATUS"
    
    # 检查容器是否运行(兼容性写法)
    if [ "$CONTAINER_STATUS" = "running" ]; then
        green "✓ 容器运行正常"
        
        # 如果有健康检查,检查健康状态
        if [ "$HEALTH_STATUS" = "healthy" ] || [ "$HEALTH_STATUS" = "no-healthcheck" ]; then
            green "✓ 健康检查通过"
        else
            yellow "⚠ 健康状态: $HEALTH_STATUS"
        fi
    else
        red "✗ 容器状态异常: $CONTAINER_STATUS"
        exit 1
    fi
else
    red "✗ 容器未找到"
    exit 1
fi

# 2. 检查版本(兼容性写法)
echo -e "\n2. 版本检查:"
NEW_VERSION=$(docker-compose exec -T gitlab cat /opt/gitlab/embedded/service/gitlab-rails/VERSION 2>/dev/null | tr -d '\r')

if echo "$NEW_VERSION" | grep -q "18.2.8"; then
    green "✓ 版本升级成功: $NEW_VERSION"
else
    red "✗ 版本未更新或检查失败"
    echo "当前版本: $NEW_VERSION"
    echo "目标版本: 18.2.8"
fi

# 3. 服务健康检查(使用GitLab内置命令)
echo -e "\n3. GitLab服务健康检查:"
if docker-compose exec -T gitlab gitlab-ctl status > /tmp/gitlab_services.log 2>&1; then
    RUNNING_SERVICES=$(grep -c "run" /tmp/gitlab_services.log || echo "0")
    
    if [ "$RUNNING_SERVICES" -ge 5 ]; then
        green "✓ 核心服务运行正常 ($RUNNING_SERVICES个服务运行中)"
    else
        yellow "⚠ 服务数量较少 ($RUNNING_SERVICES个服务运行中)"
    fi
    
    # 显示关键服务状态
    echo "关键服务状态:"
    grep -E "(puma|sidekiq|postgresql|redis|nginx|gitlab-workhorse)" /tmp/gitlab_services.log || cat /tmp/gitlab_services.log
else
    red "✗ 无法获取服务状态"
fi

# 4. Web访问测试(兼容性写法)
echo -e "\n4. Web服务测试:"
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 10 http://localhost:10100/-/health 2>/dev/null || echo "000")

case $HTTP_CODE in
    200)
        green "✓ Web服务正常 (HTTP 200)"
        ;;
    401|403)
        yellow "⚠ 认证相关错误 (HTTP $HTTP_CODE),但服务可访问"
        ;;
    000)
        red "✗ Web服务不可达 (超时或网络错误)"
        ;;
    *)
        red "✗ Web服务异常 (HTTP $HTTP_CODE)"
        ;;
esac

# 5. 数据库检查(简化版,避免复杂的输出解析)
echo -e "\n5. 数据库连接检查:"
if docker-compose exec -T gitlab gitlab-rake gitlab:db:check 2>/dev/null | grep -q "Connection to database established"; then
    green "✓ 数据库连接正常"
else
    # 尝试使用psql连接测试
    if docker-compose exec -T gitlab bash -c 'psql -h localhost -U gitlab -d gitlabhq_production -c "SELECT 1;" 2>&1 | grep -q "1 row"' 2>/dev/null; then
        green "✓ 数据库连接正常 (通过psql测试)"
    else
        yellow "⚠ 数据库连接可能有问题,请检查日志"
    fi
fi

# 6. 仓库访问测试(可选,如果有SSH配置)
echo -e "\n6. SSH服务测试:"
SSH_PORT=10000
if nc -z localhost $SSH_PORT 2>/dev/null; then
    green "✓ SSH端口($SSH_PORT)可访问"
    
    # 简单的SSH连接测试(不执行命令)
    if timeout 5 ssh -p $SSH_PORT -o StrictHostKeyChecking=no -o PasswordAuthentication=no -o BatchMode=yes git@localhost exit 2>&1 | grep -q "Welcome to GitLab"; then
        green "✓ SSH服务响应正常"
    else
        yellow "⚠ SSH服务可能未完全就绪"
    fi
else
    red "✗ SSH端口($SSH_PORT)不可访问"
fi

# 7. 错误日志检查(兼容性写法)
echo -e "\n7. 错误日志检查 (最近10分钟):"
ERROR_COUNT=$(docker-compose logs --since="10m" gitlab 2>/dev/null | grep -c -i -E "error|fatal|exception|cannot|failed" || echo "0")
WARNING_COUNT=$(docker-compose logs --since="10m" gitlab 2>/dev/null | grep -c -i "warning" || echo "0")

if [ "$ERROR_COUNT" -eq 0 ]; then
    green "✓ 近期无严重错误"
else
    red "⚠ 发现 $ERROR_COUNT 个错误/异常"
    echo "最近5个错误:"
    docker-compose logs --since="10m" gitlab 2>/dev/null | grep -i -E "error|fatal|exception|cannot|failed" | tail -5
fi

if [ "$WARNING_COUNT" -gt 0 ]; then
    yellow "提示: 发现 $WARNING_COUNT 个警告"
fi

# 8. 资源使用情况
echo -e "\n8. 资源使用情况:"
if command -v docker stats > /dev/null 2>&1; then
    echo "容器资源使用:"
    docker stats --no-stream gitlab 2>/dev/null || echo "无法获取容器状态"
else
    echo "容器CPU/内存使用:"
    docker-compose exec -T gitlab bash -c 'top -bn1 | head -5' 2>/dev/null || echo "无法获取资源信息"
fi

# 9. 磁盘空间检查
echo -e "\n9. 磁盘空间检查:"
docker-compose exec -T gitlab df -h /var/opt/gitlab /etc/gitlab /var/log/gitlab 2>/dev/null || echo "无法检查容器内磁盘空间"

# 10. 总结报告
echo -e "\n=== 验证总结 ==="
echo "验证时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "GitLab版本: $NEW_VERSION"
echo "容器状态: $CONTAINER_STATUS (健康: $HEALTH_STATUS)"
echo "Web服务: HTTP $HTTP_CODE"
echo "数据库: $(if docker-compose exec -T gitlab bash -c 'psql -h localhost -U gitlab -d gitlabhq_production -c "SELECT 1;" 2>&1 | grep -q "1 row"' 2>/dev/null; then echo '正常'; else echo '需检查'; fi)"
echo "错误数量: $ERROR_COUNT"

if [ "$CONTAINER_STATUS" = "running" ] && echo "$NEW_VERSION" | grep -q "18.2.8" && [ "$HTTP_CODE" = "200" ]; then
    green "✓ 升级验证通过"
else
    yellow "⚠ 升级验证部分通过,请检查上述问题"
fi

示例日志

root@MK-U:/docker-data/docker-composes/gitlab-ce# BACKUP_TIMESTAMP=$(date +%Y%m%d_%H%M%S)
root@MK-U:/docker-data/docker-composes/gitlab-ce# BACKUP_DIR="/docker-data/gitlab_backups/upgrade_${BACKUP_TIMESTAMP}"
root@MK-U:/docker-data/docker-composes/gitlab-ce# mkdir -p ${BACKUP_DIR}/{config,data,logs}
root@MK-U:/docker-data/docker-composes/gitlab-ce# docker-compose exec gitlab gitlab-ctl deploy-page up
cp /opt/gitlab/embedded/service/gitlab-rails/public/deploy.html /opt/gitlab/embedded/service/gitlab-rails/public/index.html
root@MK-U:/docker-data/docker-composes/gitlab-ce# docker-compose exec gitlab gitlab-ctl stop sidekiq
ok: down: sidekiq: 0s, normally up
root@MK-U:/docker-data/docker-composes/gitlab-ce# docker-compose exec gitlab gitlab-ctl stop mailroom
root@MK-U:/docker-data/docker-composes/gitlab-ce# sleep 10
root@MK-U:/docker-data/docker-composes/gitlab-ce# docker-compose exec gitlab gitlab-backup create \
  BACKUP_PATH=/var/opt/gitlab/backups \
  STRATEGY=copy \
  SKIP=builds,registry
2026-01-29 08:45:01 UTC -- Dumping database ... 
2026-01-29 08:45:01 UTC -- Dumping PostgreSQL database gitlabhq_production ... 
2026-01-29 08:45:05 UTC -- [DONE]
2026-01-29 08:45:05 UTC -- Dumping database ... done
2026-01-29 08:45:05 UTC -- Dumping repositories ... 
{"command.name":"create","gl_project_path":"luosong/BK","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b.git","storage_name":"default","time":"2026-01-29T08:45:05.387Z"}
{"command.name":"create","gl_project_path":"luosong/BK.wiki","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.537Z"}
{"command.name":"create","gl_project_path":"luosong/BK.wiki","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.556Z"}
{"command.name":"create","gl_project_path":"luosong/BkMgt","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35.git","storage_name":"default","time":"2026-01-29T08:45:05.556Z"}
{"command.name":"create","gl_project_path":"luosong/BK","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b.git","storage_name":"default","time":"2026-01-29T08:45:05.557Z"}
{"command.name":"create","gl_project_path":"luosong/BkMgt.wiki","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.557Z"}
{"command.name":"create","gl_project_path":"luosong/BkMgt.wiki","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.579Z"}
{"command.name":"create","gl_project_path":"luosong/UIm","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/e7/f6/e7f6c011776e8db7cd330b54174fd76f7d0216b612387a5ffcfb81e6f0919683.git","storage_name":"default","time":"2026-01-29T08:45:05.579Z"}
{"command.name":"create","gl_project_path":"luosong/BkMgt","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35.git","storage_name":"default","time":"2026-01-29T08:45:05.657Z"}
{"command.name":"create","gl_project_path":"luosong/UIm.wiki","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/e7/f6/e7f6c011776e8db7cd330b54174fd76f7d0216b612387a5ffcfb81e6f0919683.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.657Z"}
{"command.name":"create","gl_project_path":"luosong/UIm.wiki","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/e7/f6/e7f6c011776e8db7cd330b54174fd76f7d0216b612387a5ffcfb81e6f0919683.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.675Z"}
{"command.name":"create","gl_project_path":"luosong/UImMgt","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/79/02/7902699be42c8a8e46fbbb4501726517e86b22c56a189f7625a6da49081b2451.git","storage_name":"default","time":"2026-01-29T08:45:05.675Z"}
{"command.name":"create","gl_project_path":"luosong/UIm","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/e7/f6/e7f6c011776e8db7cd330b54174fd76f7d0216b612387a5ffcfb81e6f0919683.git","storage_name":"default","time":"2026-01-29T08:45:05.726Z"}
{"command.name":"create","gl_project_path":"luosong/UImMgt.wiki","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/79/02/7902699be42c8a8e46fbbb4501726517e86b22c56a189f7625a6da49081b2451.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.726Z"}
{"command.name":"create","gl_project_path":"luosong/UImMgt.wiki","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/79/02/7902699be42c8a8e46fbbb4501726517e86b22c56a189f7625a6da49081b2451.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.744Z"}
{"command.name":"create","gl_project_path":"luosong/taro","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/4f/c8/4fc82b26aecb47d2868c4efbe3581732a3e7cbcc6c2efb32062c08170a05eeb8.git","storage_name":"default","time":"2026-01-29T08:45:05.744Z"}
{"command.name":"create","gl_project_path":"luosong/taro","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/4f/c8/4fc82b26aecb47d2868c4efbe3581732a3e7cbcc6c2efb32062c08170a05eeb8.git","storage_name":"default","time":"2026-01-29T08:45:05.777Z"}
{"command.name":"create","gl_project_path":"luosong/taro.wiki","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/4f/c8/4fc82b26aecb47d2868c4efbe3581732a3e7cbcc6c2efb32062c08170a05eeb8.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.777Z"}
{"command.name":"create","gl_project_path":"luosong/UImMgt","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/79/02/7902699be42c8a8e46fbbb4501726517e86b22c56a189f7625a6da49081b2451.git","storage_name":"default","time":"2026-01-29T08:45:05.790Z"}
{"command.name":"create","gl_project_path":"luosong/youcats-mini","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.git","storage_name":"default","time":"2026-01-29T08:45:05.790Z"}
{"command.name":"create","gl_project_path":"luosong/taro.wiki","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/4f/c8/4fc82b26aecb47d2868c4efbe3581732a3e7cbcc6c2efb32062c08170a05eeb8.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.794Z"}
{"command.name":"create","gl_project_path":"luosong/youcats-mini.wiki","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.794Z"}
{"command.name":"create","gl_project_path":"luosong/youcats-mini.wiki","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.813Z"}
{"command.name":"create","gl_project_path":"luosong/vs","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git","storage_name":"default","time":"2026-01-29T08:45:05.813Z"}
{"command.name":"create","gl_project_path":"luosong/vs","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git","storage_name":"default","time":"2026-01-29T08:45:05.872Z"}
{"command.name":"create","gl_project_path":"luosong/vs.wiki","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.872Z"}
{"command.name":"create","gl_project_path":"luosong/vs.wiki","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.889Z"}
{"command.name":"create","gl_project_path":"luosong/youcatsmgt","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/45/23/4523540f1504cd17100c4835e85b7eefd49911580f8efff0599a8f283be6b9e3.git","storage_name":"default","time":"2026-01-29T08:45:05.890Z"}
{"command.name":"create","gl_project_path":"luosong/youcats-mini","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.git","storage_name":"default","time":"2026-01-29T08:45:05.986Z"}
{"command.name":"create","gl_project_path":"luosong/youcatsmgt.wiki","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/45/23/4523540f1504cd17100c4835e85b7eefd49911580f8efff0599a8f283be6b9e3.wiki.git","storage_name":"default","time":"2026-01-29T08:45:05.986Z"}
{"command.name":"create","gl_project_path":"luosong/youcatsmgt.wiki","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/45/23/4523540f1504cd17100c4835e85b7eefd49911580f8efff0599a8f283be6b9e3.wiki.git","storage_name":"default","time":"2026-01-29T08:45:06.004Z"}
{"command.name":"create","gl_project_path":"luosong/corenetworkmanage","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/4e/c9/4ec9599fc203d176a301536c2e091a19bc852759b255bd6818810a42c5fed14a.git","storage_name":"default","time":"2026-01-29T08:45:06.004Z"}
{"command.name":"create","gl_project_path":"luosong/corenetworkmanage","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/4e/c9/4ec9599fc203d176a301536c2e091a19bc852759b255bd6818810a42c5fed14a.git","storage_name":"default","time":"2026-01-29T08:45:06.069Z"}
{"command.name":"create","gl_project_path":"luosong/corenetworkmanage.wiki","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/4e/c9/4ec9599fc203d176a301536c2e091a19bc852759b255bd6818810a42c5fed14a.wiki.git","storage_name":"default","time":"2026-01-29T08:45:06.069Z"}
{"command.name":"create","gl_project_path":"luosong/corenetworkmanage.wiki","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/4e/c9/4ec9599fc203d176a301536c2e091a19bc852759b255bd6818810a42c5fed14a.wiki.git","storage_name":"default","time":"2026-01-29T08:45:06.090Z"}
{"command.name":"create","gl_project_path":"luosong/youcatsweb","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/94/00/9400f1b21cb527d7fa3d3eabba93557a18ebe7a2ca4e471cfe5e4c5b4ca7f767.git","storage_name":"default","time":"2026-01-29T08:45:06.090Z"}
{"command.name":"create","gl_project_path":"luosong/youcatsmgt","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/45/23/4523540f1504cd17100c4835e85b7eefd49911580f8efff0599a8f283be6b9e3.git","storage_name":"default","time":"2026-01-29T08:45:06.107Z"}
{"command.name":"create","gl_project_path":"luosong/youcatsweb.wiki","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/94/00/9400f1b21cb527d7fa3d3eabba93557a18ebe7a2ca4e471cfe5e4c5b4ca7f767.wiki.git","storage_name":"default","time":"2026-01-29T08:45:06.107Z"}
{"command.name":"create","gl_project_path":"luosong/youcatsweb.wiki","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/94/00/9400f1b21cb527d7fa3d3eabba93557a18ebe7a2ca4e471cfe5e4c5b4ca7f767.wiki.git","storage_name":"default","time":"2026-01-29T08:45:06.125Z"}
{"command.name":"create","gl_project_path":"luosong/api-manage","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/53/5f/535fa30d7e25dd8a49f1536779734ec8286108d115da5045d77f3b4185d8f790.git","storage_name":"default","time":"2026-01-29T08:45:06.125Z"}
{"command.name":"create","gl_project_path":"luosong/youcatsweb","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/94/00/9400f1b21cb527d7fa3d3eabba93557a18ebe7a2ca4e471cfe5e4c5b4ca7f767.git","storage_name":"default","time":"2026-01-29T08:45:06.223Z"}
{"command.name":"create","gl_project_path":"luosong/api-manage.wiki","level":"info","msg":"started create","pid":1695,"relative_path":"@hashed/53/5f/535fa30d7e25dd8a49f1536779734ec8286108d115da5045d77f3b4185d8f790.wiki.git","storage_name":"default","time":"2026-01-29T08:45:06.223Z"}
{"command.name":"create","gl_project_path":"luosong/api-manage","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/53/5f/535fa30d7e25dd8a49f1536779734ec8286108d115da5045d77f3b4185d8f790.git","storage_name":"default","time":"2026-01-29T08:45:06.229Z"}
{"command.name":"create","gl_project_path":"luosong/api-manage.wiki","level":"info","msg":"completed create","pid":1695,"relative_path":"@hashed/53/5f/535fa30d7e25dd8a49f1536779734ec8286108d115da5045d77f3b4185d8f790.wiki.git","storage_name":"default","time":"2026-01-29T08:45:06.246Z"}
2026-01-29 08:45:06 UTC -- Dumping repositories ... done
2026-01-29 08:45:06 UTC -- Dumping uploads ... 
2026-01-29 08:45:06 UTC -- Dumping uploads ... done
2026-01-29 08:45:06 UTC -- Dumping builds ... [SKIPPED]
2026-01-29 08:45:06 UTC -- Dumping artifacts ... 
2026-01-29 08:45:06 UTC -- Dumping artifacts ... done
2026-01-29 08:45:06 UTC -- Dumping pages ... 
2026-01-29 08:45:06 UTC -- Dumping pages ... done
2026-01-29 08:45:06 UTC -- Dumping lfs objects ... 
2026-01-29 08:45:06 UTC -- Dumping lfs objects ... done
2026-01-29 08:45:06 UTC -- Dumping terraform states ... 
2026-01-29 08:45:06 UTC -- Dumping terraform states ... done
2026-01-29 08:45:06 UTC -- Dumping container registry images ... [DISABLED]
2026-01-29 08:45:06 UTC -- Dumping packages ... 
2026-01-29 08:45:06 UTC -- Dumping packages ... done
2026-01-29 08:45:06 UTC -- Dumping ci secure files ... 
2026-01-29 08:45:06 UTC -- Dumping ci secure files ... done
2026-01-29 08:45:06 UTC -- Dumping external diffs ... 
2026-01-29 08:45:06 UTC -- Dumping external diffs ... done
2026-01-29 08:45:06 UTC -- Creating backup archive: 1769676301_2026_01_29_18.2.8_gitlab_backup.tar ... 
2026-01-29 08:45:06 UTC -- Creating backup archive: 1769676301_2026_01_29_18.2.8_gitlab_backup.tar ... done
2026-01-29 08:45:06 UTC -- Uploading backup archive to remote storage  ... [SKIPPED]
2026-01-29 08:45:06 UTC -- Deleting old backups ... [SKIPPED]
2026-01-29 08:45:06 UTC -- Deleting tar staging files ... 
2026-01-29 08:45:06 UTC -- Cleaning up /var/opt/gitlab/backups/backup_information.yml
2026-01-29 08:45:06 UTC -- Cleaning up /var/opt/gitlab/backups/db
2026-01-29 08:45:06 UTC -- Cleaning up /var/opt/gitlab/backups/repositories
2026-01-29 08:45:06 UTC -- Cleaning up /var/opt/gitlab/backups/uploads.tar.gz
2026-01-29 08:45:06 UTC -- Cleaning up /var/opt/gitlab/backups/artifacts.tar.gz
2026-01-29 08:45:06 UTC -- Cleaning up /var/opt/gitlab/backups/pages.tar.gz
2026-01-29 08:45:06 UTC -- Cleaning up /var/opt/gitlab/backups/lfs.tar.gz
2026-01-29 08:45:06 UTC -- Cleaning up /var/opt/gitlab/backups/terraform_state.tar.gz
2026-01-29 08:45:06 UTC -- Cleaning up /var/opt/gitlab/backups/packages.tar.gz
2026-01-29 08:45:06 UTC -- Cleaning up /var/opt/gitlab/backups/ci_secure_files.tar.gz
2026-01-29 08:45:06 UTC -- Cleaning up /var/opt/gitlab/backups/external_diffs.tar.gz
2026-01-29 08:45:06 UTC -- Deleting tar staging files ... done
2026-01-29 08:45:06 UTC -- Deleting backups/tmp ... 
2026-01-29 08:45:06 UTC -- Deleting backups/tmp ... done
2026-01-29 08:45:06 UTC -- Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data 
and are not included in this backup. You will need these files to restore a backup.
Please back them up manually.
2026-01-29 08:45:06 UTC -- Backup 1769676301_2026_01_29_18.2.8 is done.
2026-01-29 08:45:06 UTC -- Deleting backup and restore PID file at [/opt/gitlab/embedded/service/gitlab-rails/tmp/backup_restore.pid] ... done
root@MK-U:/docker-data/docker-composes/gitlab-ce# docker-compose exec gitlab ls -lh /var/opt/gitlab/backups/
total 93M
-rw------- 1 git git 47M Jan 29 15:59 1769673542_2026_01_29_18.2.1_gitlab_backup.tar
-rw------- 1 git git 47M Jan 29 16:45 1769676301_2026_01_29_18.2.8_gitlab_backup.tar
root@MK-U:/docker-data/docker-composes/gitlab-ce# BACKUP_FILE=$(docker-compose exec gitlab bash -c 'ls -t /var/opt/gitlab/backups/*_gitlab_backup.tar | head -1')
if [ -n "$BACKUP_FILE" ]; then
    docker cp gitlab:${BACKUP_FILE} ${BACKUP_DIR}/data/
    echo "备份文件已复制到: ${BACKUP_DIR}/data/"
fi
 in container gitlabdaemon: Could not find the file /var/opt/gitlab/backups/1769676301_2026_01_29_18.2.8_gitlab_backup.tar
备份文件已复制到: /docker-data/gitlab_backups/upgrade_20260129_164158/data/
root@MK-U:/docker-data/docker-composes/gitlab-ce# cp -a /docker-data/gitlab/config ${BACKUP_DIR}/config/
root@MK-U:/docker-data/docker-composes/gitlab-ce# docker-compose exec gitlab gitlab-ctl stop unicorn
root@MK-U:/docker-data/docker-composes/gitlab-ce# docker-compose exec gitlab gitlab-ctl stop puma
ok: down: puma: 1s, normally up
root@MK-U:/docker-data/docker-composes/gitlab-ce# docker-compose exec gitlab gitlab-ctl stop gitlab-workhorse
ok: down: gitlab-workhorse: 0s, normally up
root@MK-U:/docker-data/docker-composes/gitlab-ce# docker-compose exec gitlab gitlab-ctl stop
ok: down: gitaly: 0s, normally up
ok: down: gitlab-kas: 1s, normally up
ok: down: gitlab-workhorse: 48s, normally up
ok: down: logrotate: 0s, normally up
ok: down: nginx: 0s, normally up
ok: down: postgresql: 0s, normally up
ok: down: puma: 54s, normally up
ok: down: redis: 0s, normally up
ok: down: sidekiq: 169s, normally up
ok: down: sshd: 1s, normally up
root@MK-U:/docker-data/docker-composes/gitlab-ce# docker-compose exec gitlab gitlab-ctl status
down: gitaly: 197s, normally up; run: log: (pid 342) 1850s
down: gitlab-kas: 186s, normally up; run: log: (pid 531) 1838s
down: gitlab-workhorse: 233s, normally up; run: log: (pid 643) 1751s
down: logrotate: 185s, normally up; run: log: (pid 269) 1861s
down: nginx: 185s, normally up; run: log: (pid 723) 1743s
down: postgresql: 184s, normally up; run: log: (pid 472) 1844s
down: puma: 238s, normally up; run: log: (pid 593) 1763s
down: redis: 184s, normally up; run: log: (pid 289) 1856s
down: sidekiq: 353s, normally up; run: log: (pid 615) 1755s
down: sshd: 184s, normally up; run: log: (pid 35) 1879s
root@MK-U:/docker-data/docker-composes/gitlab-ce# docker-compose stop gitlab
Stopping gitlab ... done
root@MK-U:/docker-data/docker-composes/gitlab-ce# docker compose down
[+] down 1/1
 ✔ Container gitlab Removed                                                                                                                                                                                                               0.1s
root@MK-U:/docker-data/docker-composes/gitlab-ce# cp docker-compose.yaml docker-compose.yaml.18.2.8
root@MK-U:/docker-data/docker-composes/gitlab-ce# sed -i 's|image: gitlab/gitlab-ce:18.2.8-ce.0|image: gitlab/gitlab-ce:18.5.5-ce.0|' docker-compose.yaml
root@MK-U:/docker-data/docker-composes/gitlab-ce# grep "image:" docker-compose.yaml
    image: gitlab/gitlab-ce:18.5.5-ce.0
root@MK-U:/docker-data/docker-composes/gitlab-ce# docker compose up -d
[+] up 1/1
 ✔ Container gitlab Created