Files
gaoandClaude 2c616faba0 feat: 完成 GitLab macOS 优化部署和 CI/CD 配置
## 主要改进
- 升级 GitLab CE 到 16.11.7 (最新稳定版)
- 优化性能配置 (Puma worker, Sidekiq 并发控制)
- 禁用不必要服务节省资源 (Prometheus/Grafana)
- 配置国内 APT 镜像源加速更新
- 添加时区设置 Asia/Shanghai

## 新增功能
- 一键部署脚本 (init-gitlab-optimized.sh)
- 智能 Runner 注册 (register-runner-optimized.sh)
- 综合维护工具 (maintenance-gitlab.sh)
- SMTP 邮件配置向导 (setup-smtp.sh)
- 密码重置工具 (reset-gitlab-password.sh)
- 快速诊断脚本 (diagnose-gitlab.sh)

## CI/CD 配置
- 注册 Docker Runner (容器化构建)
- 注册 Shell Runner (本地脚本执行)
- 创建 CI/CD 模板文件
- Runner 配置优化和清理

## 文档完善
- 技术文档 (CLAUDE.md)
- 优化部署指南 (OPTIMIZATION_GUIDE.md)
- 使用说明和故障排除指南

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 11:49:57 +08:00

262 lines
7.2 KiB
Bash
Executable File

#!/bin/bash
# GitLab SMTP 邮件服务配置向导
# 支持多种邮件服务商
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
echo -e "${GREEN}📧 GitLab SMTP 配置向导${NC}"
echo "========================"
# 邮件服务商配置
show_providers() {
echo -e "${BLUE}请选择邮件服务商:${NC}"
echo "1) QQ 邮箱 (推荐)"
echo "2) 163 邮箱"
echo "3) Gmail"
echo "4) 自定义 SMTP"
echo ""
}
# QQ 邮箱配置
setup_qq_email() {
echo -e "${YELLOW}QQ 邮箱配置${NC}"
echo "=============="
echo "请准备以下信息:"
echo "- QQ 邮箱地址"
echo "- SMTP 授权码 (不是邮箱密码)"
echo "获取授权码步骤:"
echo "1. 登录 QQ 邮箱 → 设置 → 账户"
echo "2. 找到 POP3/SMTP 服务"
echo "3. 开启服务并获取授权码"
echo ""
read -p "请输入 QQ 邮箱地址: " EMAIL
read -p "请输入 SMTP 授权码: " PASSWORD
if [[ -z "$EMAIL" || -z "$PASSWORD" ]]; then
echo -e "${RED}错误: 邮箱地址和授权码不能为空${NC}"
exit 1
fi
update_smtp_config "smtp.qq.com" "587" "$EMAIL" "$PASSWORD" "qq.com"
}
# 163 邮箱配置
setup_163_email() {
echo -e "${YELLOW}163 邮箱配置${NC}"
echo "=============="
echo "请准备以下信息:"
echo "- 163 邮箱地址"
echo "- SMTP 授权码"
echo "获取授权码步骤:"
echo "1. 登录 163 邮箱 → 设置 → POP3/SMTP/IMAP"
echo "2. 开启 SMTP 服务"
echo "3. 获取客户端授权密码"
echo ""
read -p "请输入 163 邮箱地址: " EMAIL
read -p "请输入 SMTP 授权码: " PASSWORD
if [[ -z "$EMAIL" || -z "$PASSWORD" ]]; then
echo -e "${RED}错误: 邮箱地址和授权码不能为空${NC}"
exit 1
fi
update_smtp_config "smtp.163.com" "587" "$EMAIL" "$PASSWORD" "163.com"
}
# Gmail 配置
setup_gmail() {
echo -e "${YELLOW}Gmail 配置${NC}"
echo "============"
echo "请准备以下信息:"
echo "- Gmail 地址"
echo "- 应用专用密码"
echo "获取应用专用密码步骤:"
echo "1. 登录 Google 账户"
echo "2. 安全设置 → 两步验证"
echo "3. 应用专用密码 → 生成新密码"
echo ""
read -p "请输入 Gmail 地址: " EMAIL
read -p "请输入应用专用密码: " PASSWORD
if [[ -z "$EMAIL" || -z "$PASSWORD" ]]; then
echo -e "${RED}错误: 邮箱地址和应用密码不能为空${NC}"
exit 1
fi
update_smtp_config "smtp.gmail.com" "587" "$EMAIL" "$PASSWORD" "gmail.com"
}
# 自定义 SMTP 配置
setup_custom_smtp() {
echo -e "${YELLOW}自定义 SMTP 配置${NC}"
echo "=================="
read -p "SMTP 服务器地址: " SMTP_SERVER
read -p "SMTP 端口 (通常是 587 或 465): " SMTP_PORT
read -p "邮箱地址: " EMAIL
read -p "邮箱密码/授权码: " PASSWORD
read -p "SMTP 域名 (可选): " SMTP_DOMAIN
if [[ -z "$SMTP_SERVER" || -z "$SMTP_PORT" || -z "$EMAIL" || -z "$PASSWORD" ]]; then
echo -e "${RED}错误: 所有字段都是必填的${NC}"
exit 1
fi
update_smtp_config "$SMTP_SERVER" "$SMTP_PORT" "$EMAIL" "$PASSWORD" "$SMTP_DOMAIN"
}
# 更新 SMTP 配置
update_smtp_config() {
local SMTP_SERVER="$1"
local SMTP_PORT="$2"
local EMAIL="$3"
local PASSWORD="$4"
local SMTP_DOMAIN="$5"
echo -e "${YELLOW}更新 SMTP 配置...${NC}"
# 更新环境变量文件
ENV_FILE="$SCRIPT_DIR/.env"
if [[ ! -f "$ENV_FILE" ]]; then
echo "SMTP_USER=$EMAIL" > "$ENV_FILE"
echo "SMTP_PASSWORD=$PASSWORD" >> "$ENV_FILE"
else
# 更新或添加 SMTP 配置
if grep -q "SMTP_USER=" "$ENV_FILE"; then
sed -i.bak "s/SMTP_USER=.*/SMTP_USER=$EMAIL/" "$ENV_FILE"
else
echo "SMTP_USER=$EMAIL" >> "$ENV_FILE"
fi
if grep -q "SMTP_PASSWORD=" "$ENV_FILE"; then
sed -i.bak "s/SMTP_PASSWORD=.*/SMTP_PASSWORD=$PASSWORD/" "$ENV_FILE"
else
echo "SMTP_PASSWORD=$PASSWORD" >> "$ENV_FILE"
fi
fi
# 更新 docker-compose.yml 中的 SMTP 配置
COMPOSE_FILE="$SCRIPT_DIR/docker-compose.yml"
if [[ -f "$COMPOSE_FILE" ]]; then
# 备份原文件
cp "$COMPOSE_FILE" "$COMPOSE_FILE.backup"
# 创建临时文件更新 SMTP 配置
TEMP_FILE=$(mktemp)
awk -v server="$SMTP_SERVER" -v port="$SMTP_PORT" -v email="$EMAIL" -v password="$PASSWORD" -v domain="$SMTP_DOMAIN" '
/gitlab_rails\[.smtp_address.\]/ {
sub($3, "\"" server "\"")
}
/gitlab_rails\[.smtp_port.\]/ {
sub($3, port)
}
/gitlab_rails\[.smtp_user_name.\]/ {
sub($3, "\"" email "\"")
}
/gitlab_rails\[.smtp_password.\]/ {
sub($3, "\"" password "\"")
}
/gitlab_rails\[.smtp_domain.\]/ {
if (domain != "") sub($3, "\"" domain "\"")
}
/gitlab_rails\[.gitlab_email_from.\]/ {
sub($3, "\"" email "\"")
}
{print}
' "$COMPOSE_FILE" > "$TEMP_FILE"
mv "$TEMP_FILE" "$COMPOSE_FILE"
fi
echo -e "${GREEN}✅ SMTP 配置已更新${NC}"
echo ""
echo -e "${BLUE}配置详情:${NC}"
echo " SMTP 服务器: $SMTP_SERVER:$SMTP_PORT"
echo " 邮箱地址: $EMAIL"
echo " SMTP 域名: ${SMTP_DOMAIN:-自动}"
# 询问是否重启服务
echo ""
echo -e "${YELLOW}是否重启 GitLab 服务以应用新的邮件配置?(y/N):${NC}"
read -r RESTART
if [[ "$RESTART" =~ ^[Yy]$ ]]; then
echo -e "${YELLOW}重启 GitLab 服务...${NC}"
cd "$SCRIPT_DIR"
docker-compose down
sleep 5
docker-compose up -d
echo -e "${YELLOW}等待服务启动...${NC}"
sleep 30
# 测试邮件配置
test_email_config
else
echo -e "${BLUE}请稍后手动重启 GitLab 服务以应用配置:${NC}"
echo " cd $SCRIPT_DIR"
echo " docker-compose restart"
fi
}
# 测试邮件配置
test_email_config() {
echo -e "${YELLOW}测试邮件配置...${NC}"
# 等待服务完全启动
for i in {1..10}; do
if curl -f http://localhost:8891/-/readiness >/dev/null 2>&1; then
break
fi
echo "等待服务启动... ($i/10)"
sleep 10
done
# 发送测试邮件
echo -e "${BLUE}发送测试邮件...${NC}"
# 这里应该通过 GitLab API 或命令行发送测试邮件
# 由于 API 复杂度,这里提供手动测试说明
echo -e "${YELLOW}请手动测试邮件配置:${NC}"
echo "1. 访问 GitLab 管理界面"
echo "2. 进入 Admin Area → Settings → Email"
echo "3. 点击 'Send test email'"
echo ""
echo -e "${GREEN}🎉 SMTP 配置完成!${NC}"
}
# 主逻辑
show_providers
read -p "请选择 (1-4): " choice
case $choice in
1)
setup_qq_email
;;
2)
setup_163_email
;;
3)
setup_gmail
;;
4)
setup_custom_smtp
;;
*)
echo -e "${RED}无效选择${NC}"
exit 1
;;
esac