## 主要改进 - 升级 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 <[email protected]>
262 lines
7.2 KiB
Bash
Executable File
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 |