#!/bin/bash # GitLab 密码重置脚本 # 解决 initial_root_password 文件丢失的问题 set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo -e "${GREEN}🔑 GitLab 密码重置工具${NC}" echo "========================" # 检查 GitLab 容器 echo -e "${YELLOW}检查 GitLab 容器状态...${NC}" CONTAINER_ID=$(docker ps -q --filter "name=gitlab-ce" | head -1) if [[ -z "$CONTAINER_ID" ]]; then echo -e "${RED}错误: GitLab 容器未运行${NC}" echo "请先启动 GitLab: docker-compose up -d" exit 1 fi echo -e "${GREEN}✅ GitLab 容器正在运行: ${CONTAINER_ID:0:12}${NC}" # 检查服务可用性 echo -e "${YELLOW}检查 GitLab 服务状态...${NC}" if ! curl -f http://localhost:8891/users/sign_in >/dev/null 2>&1; then echo -e "${RED}错误: GitLab 服务不可访问${NC}" echo "请等待 GitLab 完全启动后再试" exit 1 fi echo -e "${GREEN}✅ GitLab 服务可访问${NC}" # 选择重置方式 echo "" echo -e "${BLUE}请选择密码重置方式:${NC}" echo "1) 自动生成安全密码" echo "2) 手动输入密码" echo "3) 重置为默认密码 (admin123456)" echo "" read -p "请选择 (1-3): " choice case $choice in 1) # 自动生成安全密码 NEW_PASSWORD="GL$(date +%s%N | tail -c 7)!" echo -e "${YELLOW}生成的新密码: ${NEW_PASSWORD}${NC}" ;; 2) # 手动输入密码 while true; do read -s -p "请输入新密码 (至少8位): " NEW_PASSWORD echo "" if [[ ${#NEW_PASSWORD} -lt 8 ]]; then echo -e "${RED}密码太短,请至少输入8位字符${NC}" continue fi read -s -p "请确认密码: " CONFIRM_PASSWORD echo "" if [[ "$NEW_PASSWORD" != "$CONFIRM_PASSWORD" ]]; then echo -e "${RED}两次输入的密码不一致${NC}" continue fi break done ;; 3) # 默认密码 NEW_PASSWORD="admin123456" echo -e "${YELLOW}将使用默认密码: admin123456${NC}" ;; *) echo -e "${RED}无效选择${NC}" exit 1 ;; esac # 执行密码重置 echo -e "${YELLOW}重置 root 用户密码...${NC}" # 尝试重置密码 RESET_RESULT=$(docker exec "$CONTAINER_ID" /opt/gitlab/bin/gitlab-rails runner " user = User.find_by_username('root') if user user.password = '$NEW_PASSWORD' user.password_confirmation = '$NEW_PASSWORD' begin user.save! puts 'SUCCESS' puts \"用户名: root\" puts \"密码: $NEW_PASSWORD\" rescue => e puts 'ERROR' puts e.message end else puts 'NO_USER' end " 2>&1) # 检查结果 if echo "$RESET_RESULT" | grep -q "SUCCESS"; then echo -e "${GREEN}✅ 密码重置成功!${NC}" echo "" echo -e "${BLUE}登录信息:${NC}" echo "==================================" echo "📱 访问地址: http://192.168.1.83:8891" echo "👤 用户名: root" echo "🔒 密码: ${NEW_PASSWORD}" echo "==================================" echo "" echo -e "${YELLOW}建议:${NC}" echo "1. 登录后立即修改密码" echo "2. 启用两步验证" echo "3. 配置邮件通知" elif echo "$RESET_RESULT" | grep -q "ERROR"; then echo -e "${RED}❌ 密码重置失败${NC}" ERROR_MSG=$(echo "$RESET_RESULT" | grep -A 5 "ERROR" | tail -n +2) echo "错误信息: $ERROR_MSG" echo "" echo -e "${YELLOW}常见问题:${NC}" echo "- 密码过于简单,请使用更复杂的密码" echo "- 密码包含常用组合,建议添加数字和特殊字符" echo "- 可以选择选项1使用自动生成的安全密码" elif echo "$RESET_RESULT" | grep -q "NO_USER"; then echo -e "${RED}❌ 未找到 root 用户${NC}" echo "这可能表示 GitLab 数据库存在问题" else echo -e "${RED}❌ 未知错误${NC}" echo "输出结果: $RESET_RESULT" fi # 提供额外的故障排除信息 echo "" echo -e "${BLUE}🔧 故障排除:${NC}" echo "如果仍然无法登录,请尝试:" echo "1. 检查 GitLab 服务状态: docker exec $CONTAINER_ID gitlab-ctl status" echo "2. 查看服务日志: docker logs $CONTAINER_ID" echo "3. 重启 GitLab 服务: docker-compose restart" echo "4. 等待服务完全启动后再试" # 创建密码记录文件 if echo "$RESET_RESULT" | grep -q "SUCCESS"; then RECORD_FILE="./gitlab-password-$(date +%Y%m%d).txt" cat > "$RECORD_FILE" << EOF GitLab 登录信息记录 ================== 记录时间: $(date) 容器ID: ${CONTAINER_ID} 访问地址: http://192.168.1.83:8891 用户名: root 密码: ${NEW_PASSWORD} ⚠️ 请妥善保管此文件,使用后建议删除 EOF echo -e "${GREEN}📝 密码已保存到: ${RECORD_FILE}${NC}" fi