From 1fd21ae12813a2c7c07df1f449bb5f6bb64a6555 Mon Sep 17 00:00:00 2001 From: sans Date: Sat, 18 Jul 2026 20:42:26 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B6=85=E6=97=B6=E8=AE=BE=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=90=8D=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/acme_service.py | 11 +++++++++-- frontend/src/api/index.js | 2 +- frontend/src/views/Domains.vue | 6 ++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/backend/acme_service.py b/backend/acme_service.py index f159e3b..73101cd 100644 --- a/backend/acme_service.py +++ b/backend/acme_service.py @@ -184,7 +184,8 @@ class AcmeService: # 写入临时凭据文件(certbot-dns-alicloud 需要 INI 格式) creds_content = ( f"dns_alicloud_access_key = {creds.get('access_key', '')}\n" - f"dns_alicloud_access_key_secret = {creds.get('access_secret', '')}\n" + f"dns_alicloud_secret_key = {creds.get('access_secret', '')}\n" + f"dns_alicloud_region = {creds.get('region', 'cn-hangzhou')}\n" ) creds_file = tempfile.NamedTemporaryFile( mode="w", suffix=".ini", prefix="certbot-dns-", delete=False @@ -192,8 +193,14 @@ class AcmeService: creds_file.write(creds_content) creds_file.close() + # 用当前 Python 环境对应的 certbot,避免调到系统装的 + import sys + certbot_bin = str(Path(sys.prefix) / "bin" / "certbot") + if not Path(certbot_bin).exists(): + certbot_bin = "certbot" # fallback + cmd = [ - "certbot", "certonly", + certbot_bin, "certonly", "--non-interactive", "--agree-tos", "--email", self.config.email, diff --git a/frontend/src/api/index.js b/frontend/src/api/index.js index 544cf97..6afc3c4 100644 --- a/frontend/src/api/index.js +++ b/frontend/src/api/index.js @@ -2,7 +2,7 @@ import axios from 'axios' const api = axios.create({ baseURL: '/admin/api', - timeout: 10000, + timeout: 180000, }) // 请求拦截器:自动添加 token diff --git a/frontend/src/views/Domains.vue b/frontend/src/views/Domains.vue index 501318f..130ec9d 100644 --- a/frontend/src/views/Domains.vue +++ b/frontend/src/views/Domains.vue @@ -111,11 +111,13 @@ const handleDelete = async (d) => { const copyDeployCmd = async (d) => { // 根据服务器平台生成不同的部署命令 const baseUrl = window.location.origin + const safeName = d.domain.replace(/^\*\./, '') // 泛域名去掉 *. + const encodedDomain = encodeURIComponent(d.domain) let cmd if (d.platform === 'windows') { - cmd = `Invoke-WebRequest "${baseUrl}/api/script/${d.domain}?server=${d.server_name}" -OutFile C:\\scripts\\deploy-cert.ps1` + cmd = `Invoke-WebRequest "${baseUrl}/api/script/${encodedDomain}?server=${d.server_name}" -OutFile C:\\scripts\\deploy-cert-${safeName}.ps1` } else { - cmd = `curl -fsSL "${baseUrl}/api/script/${d.domain}?server=${d.server_name}" -o /usr/local/bin/deploy-cert.sh && chmod +x /usr/local/bin/deploy-cert.sh` + cmd = `curl -fsSL "${baseUrl}/api/script/${encodedDomain}?server=${d.server_name}" -o /usr/local/bin/deploy-cert-${safeName}.sh && chmod +x /usr/local/bin/deploy-cert-${safeName}.sh` } await navigator.clipboard.writeText(cmd) showCopied.value = true