diff --git a/install.sh b/install.sh index b240976..580a9a7 100644 --- a/install.sh +++ b/install.sh @@ -1358,15 +1358,25 @@ deploy_certbot() { print_success "Certbot SSL证书申请成功" return 0 else - print_error "Certbot SSL证书申请失败" - echo "" - print_warning "常见失败原因:" - echo " 1. 域名未正确解析到此服务器" - echo " 2. 防火墙阻止了80端口" - echo " 3. Nginx未正确配置或未启动" - echo " 4. Let's Encrypt速率限制" - echo "" - return 1 + # 检查证书是否已存在 + if [[ -d "/etc/letsencrypt/live/${DOMAIN}" ]]; then + print_warning "检测到证书已存在,使用已有证书" + mkdir -p /etc/nginx/ssl + ln -sf "/etc/letsencrypt/live/${DOMAIN}/fullchain.pem" "/etc/nginx/ssl/${DOMAIN}.crt" + ln -sf "/etc/letsencrypt/live/${DOMAIN}/privkey.pem" "/etc/nginx/ssl/${DOMAIN}.key" + print_success "已有证书已链接到Nginx目录" + return 0 + else + print_error "Certbot SSL证书申请失败" + echo "" + print_warning "常见失败原因:" + echo " 1. 域名未正确解析到此服务器" + echo " 2. 防火墙阻止了80端口" + echo " 3. Nginx未正确配置或未启动" + echo " 4. Let's Encrypt速率限制" + echo "" + return 1 + fi fi } @@ -1486,18 +1496,25 @@ deploy_acme_letsencrypt() { fi # 使用webroot模式申请证书(更可靠) + # 先尝试正常申请,如果证书已存在则使用--force强制更新 if ~/.acme.sh/acme.sh --issue -d "$DOMAIN" --webroot "${PROJECT_DIR}/frontend"; then print_success "证书申请成功" else - print_error "证书申请失败" - echo "" - print_warning "常见失败原因:" - echo " 1. 域名未正确解析到此服务器" - echo " 2. Nginx未正确配置或未启动" - echo " 3. 80端口被占用或防火墙阻止" - echo " 4. 前端目录权限不足" - echo "" - return 1 + # 检查是否是因为证书已存在 + if ~/.acme.sh/acme.sh --list | grep -q "$DOMAIN"; then + print_warning "检测到证书已存在,使用已有证书" + print_success "将直接安装现有证书" + else + print_error "证书申请失败" + echo "" + print_warning "常见失败原因:" + echo " 1. 域名未正确解析到此服务器" + echo " 2. Nginx未正确配置或未启动" + echo " 3. 80端口被占用或防火墙阻止" + echo " 4. 前端目录权限不足" + echo "" + return 1 + fi fi # 安装证书 @@ -1646,8 +1663,14 @@ deploy_acme_zerossl() { if ~/.acme.sh/acme.sh --server zerossl --issue -d "$DOMAIN" --webroot "${PROJECT_DIR}/frontend"; then print_success "证书申请成功" else - print_error "证书申请失败" - return 1 + # 检查是否是因为证书已存在 + if ~/.acme.sh/acme.sh --list | grep -q "$DOMAIN"; then + print_warning "检测到证书已存在,使用已有证书" + print_success "将直接安装现有证书" + else + print_error "证书申请失败" + return 1 + fi fi # 安装证书 @@ -1796,8 +1819,14 @@ deploy_acme_buypass() { if ~/.acme.sh/acme.sh --server buypass --issue -d "$DOMAIN" --webroot "${PROJECT_DIR}/frontend"; then print_success "证书申请成功" else - print_error "证书申请失败" - return 1 + # 检查是否是因为证书已存在 + if ~/.acme.sh/acme.sh --list | grep -q "$DOMAIN"; then + print_warning "检测到证书已存在,使用已有证书" + print_success "将直接安装现有证书" + else + print_error "证书申请失败" + return 1 + fi fi # 安装证书