if command -v nginx &> /dev/null; then echo "✅ Nginx 已安装,跳过安装步骤" else echo "🚀 安装 Nginx" # 检测系统类型 if command -v apt &> /dev/null; then # Debian/Ubuntu 系统 apt install -y nginx elif command -v yum &> /dev/null; then # CentOS/RHEL 系统 yum install -y nginx elif command -v dnf &> /dev/null; then # 较新版本的 Fedora/RHEL 系统 dnf install -y nginx else echo "❌ 不支持的操作系统:未找到支持的包管理器" exit 1 fi fi # 函数:尝试使用指定的包管理器安装 try_install() { local cmd=$1 if command -v "$cmd" &> /dev/null; then echo "📦 尝试使用 $cmd 安装 snapd..." if sudo "$cmd" install -y snapd; then return 0 fi fi return 1 } # 检查 Certbot 是否已安装 if command -v certbot &> /dev/null; then echo "✅ Certbot 已安装,跳过安装步骤" else echo "🚀 安装 Certbot" # 检测系统类型 if [ -f /etc/debian_version ]; then # Ubuntu/Debian 系统 apt install -y certbot python3-certbot-nginx # 也可以使用snapd安装 # apt install -y snapd # # 使用snap安装 certbot # snap install --classic certbot # # Prepare the Certbot command # sudo ln -s /snap/bin/certbot /usr/bin/certbot elif [ -f /etc/redhat-release ]; then # CentOS/RHEL 系统 # 首先安装 EPEL 仓库 yum install -y epel-release # 安装 snapd # 检查是否已安装 if command -v snap &> /dev/null; then echo "✅ snapd 已经安装" exit 0 fi echo "🔍 检测系统包管理器..." # 尝试使用 dnf 安装 if try_install "dnf"; then echo "✅ 使用 dnf 安装 snapd 成功" # 尝试使用 yum 安装 elif try_install "yum"; then echo "✅ 使用 yum 安装 snapd 成功" # 尝试使用 apt-get 安装(适用于 Debian/Ubuntu) elif try_install "apt-get"; then echo "✅ 使用 apt-get 安装 snapd 成功" else echo "❌ 无法安装 snapd,未找到支持的包管理器" exit 1 fi # 启用 snapd 服务 systemctl enable --now snapd.socket # 创建符号链接 ln -s /var/lib/snapd/snap /snap # 安装 certbot snap install --classic certbot # Prepare the Certbot command sudo ln -s /snap/bin/certbot /usr/bin/certbot else echo "❌ 不支持的操作系统" exit 1 fi fi # 验证安装 echo "🔍 验证安装" if command -v nginx &> /dev/null && command -v certbot &> /dev/null; then echo "✅ Nginx 和 Certbot 安装成功" nginx -v certbot --version else echo "❌ 安装验证失败" exit 1 fi # ===== 域名配置交互与文件生成 ===== prompt_domain() { local domain while true; do read -r -p "🌐 请输入域名(例如 demo.example.com): " domain domain=$(echo "$domain" | xargs) if [ -n "$domain" ] && [[ "$domain" =~ ^[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)+$ ]]; then echo "$domain" return 0 fi echo "❌ 域名格式不正确,请重新输入。" done } escape_sed() { echo "$1" | sed 's/[.[\*^$()+?{}|/]/\\&/g' } get_primary_domain_from_conf() { local conf_file=$1 awk ' /server_name/ { for (i = 2; i <= NF; i++) { gsub(";", "", $i) if ($i !~ /^www\./ && $i !~ /^\*/ && $i != "localhost") { print $i exit } } } ' "$conf_file" } create_conf_by_template() { local domain=$1 local target_file=$2 if [ -f "./demo.51easyai.com.conf" ]; then cp "./demo.51easyai.com.conf" "./$target_file" sed -i.bak "s/www\.demo\.51easyai\.com/www.$domain/g; s/demo\.51easyai\.com/$domain/g" "./$target_file" rm -f "./$target_file.bak" return 0 fi if [ -f "./2.conf" ]; then cp "./2.conf" "./$target_file" sed -i.bak "s/www\.2/www.$domain/g; s/\b2\b/$domain/g" "./$target_file" rm -f "./$target_file.bak" return 0 fi cat > "./$target_file" </dev/null || true else find /etc/nginx/conf.d/ -name "easyai-proxy.conf" -exec grep "server_name" {} \; 2>/dev/null || true fi ) DOMAINS=$(echo "$SERVER_NAME_LINES" | \ grep -v "#" | \ awk '{for(i=2;i<=NF;i++) if($i!=";") print $i}' | \ sed 's/;//g' | \ sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | \ grep -E '^[A-Za-z0-9.-]+$' | \ grep -vE '^(\*|localhost)$' | \ sort -u | \ tr '\n' ' ') if [ -n "$DOMAINS" ]; then # 停止 Nginx 服务 echo "停止 Nginx 服务..." sudo nginx -s stop # 构建域名参数字符串 DOMAIN_ARGS=() for domain in $DOMAINS; do DOMAIN_ARGS+=("-d" "$domain") done # 使用 certbot --nginx 插件安装证书 sudo certbot --nginx \ --non-interactive \ --agree-tos \ --email wangbo@51easyai.com \ --rsa-key-size 2048 \ --preferred-challenges http \ --force-renewal \ "${DOMAIN_ARGS[@]}" # 启动 Nginx 服务 echo "启动 Nginx 服务..." sudo nginx fi