From ffd9b8c80338ae99ef5d063e56e701b30978bdf4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Apr 2026 04:13:43 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20=E9=82=AE=E4=BB=B6SMTP=E5=87=AD?= =?UTF-8?q?=E6=8D=AE=E6=B3=A8=E5=85=A5+=E9=83=A8=E7=BD=B2=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E8=A1=A5=E5=85=A8=E2=88=9E=E7=89=88=E6=9C=AC=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 邮件错误提示优化: 隐藏内部SMTP配置细节,显示友好的"邮件服务维护中" - 部署脚本: 新增inject_smtp_credentials函数,deploy-v3/deploy-infinity自动注入SMTP到.env.keys - 部署脚本: 补全∞版本服务文件部署(email-hub.js/bandwidth-pool-agent.js/user-guardian-agent.js/auto-evolution.js) - 部署workflow: 传递ZY_SMTP_USER/ZY_SMTP_PASS到大脑服务器部署步骤 Agent-Logs-Url: https://github.com/qinfendebingshuo/guanghulab/sessions/a6f72ab2-7227-4382-920c-0e1aa91dba2e Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> --- .github/workflows/deploy-brain-proxy.yml | 4 ++ server/proxy/deploy-brain-proxy.sh | 47 +++++++++++++++++++ .../proxy/service/subscription-server-v3.js | 7 ++- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-brain-proxy.yml b/.github/workflows/deploy-brain-proxy.yml index 2ecc87a0..cc9a0d6a 100644 --- a/.github/workflows/deploy-brain-proxy.yml +++ b/.github/workflows/deploy-brain-proxy.yml @@ -109,6 +109,8 @@ jobs: ZY_SVR_SV_REALITY_PUBLIC_KEY: ${{ secrets.ZY_SVR_SV_REALITY_PUBLIC_KEY }} ZY_SVR_SV_REALITY_SHORT_ID: ${{ secrets.ZY_SVR_SV_REALITY_SHORT_ID }} ZY_SVR_SV_PORT: ${{ secrets.ZY_SVR_SV_PORT }} + ZY_SMTP_USER: ${{ secrets.ZY_SMTP_USER }} + ZY_SMTP_PASS: ${{ secrets.ZY_SMTP_PASS }} run: | ACTION="${{ github.event.inputs.action }}" ssh -i ~/.ssh/id_brain \ @@ -118,6 +120,8 @@ jobs: export ZY_SVR_SV_REALITY_PUBLIC_KEY=${ZY_SVR_SV_REALITY_PUBLIC_KEY:-} && \ export ZY_SVR_SV_REALITY_SHORT_ID=${ZY_SVR_SV_REALITY_SHORT_ID:-} && \ export ZY_SVR_SV_PORT=${ZY_SVR_SV_PORT:-443} && \ + export ZY_SMTP_USER='${ZY_SMTP_USER:-}' && \ + export ZY_SMTP_PASS='${ZY_SMTP_PASS:-}' && \ cd /opt/zhuyuan-brain/proxy-deploy && \ bash deploy-brain-proxy.sh ${ACTION}" diff --git a/server/proxy/deploy-brain-proxy.sh b/server/proxy/deploy-brain-proxy.sh index 0b3e507a..9b176e84 100644 --- a/server/proxy/deploy-brain-proxy.sh +++ b/server/proxy/deploy-brain-proxy.sh @@ -186,6 +186,14 @@ EOF echo "ZY_SVR_SV_PORT=${ZY_SVR_SV_PORT:-443}" >> "$KEYS_FILE" fi + # 保存SMTP邮件凭据 (带宽共享验证码·邮件通知) + if [ -n "${ZY_SMTP_USER:-}" ] && [ -n "${ZY_SMTP_PASS:-}" ]; then + echo "" >> "$KEYS_FILE" + echo "# SMTP邮件凭据 (带宽共享验证码·邮件通知)" >> "$KEYS_FILE" + echo "ZY_SMTP_USER=${ZY_SMTP_USER}" >> "$KEYS_FILE" + echo "ZY_SMTP_PASS=${ZY_SMTP_PASS}" >> "$KEYS_FILE" + fi + chmod 600 "$KEYS_FILE" echo "" @@ -198,6 +206,33 @@ EOF echo " ═══════════════════════════════════" } +# ── 注入SMTP邮件凭据到.env.keys ────────────── +# 如果环境变量中有SMTP凭据且.env.keys中没有,自动追加 +inject_smtp_credentials() { + local KEYS_FILE="$PROXY_DIR/.env.keys" + if [ ! -f "$KEYS_FILE" ]; then + echo " ⚠️ .env.keys不存在,跳过SMTP注入" + return + fi + if [ -z "${ZY_SMTP_USER:-}" ] || [ -z "${ZY_SMTP_PASS:-}" ]; then + echo " ℹ️ ZY_SMTP_USER/ZY_SMTP_PASS未提供,跳过SMTP注入" + return + fi + # 如果.env.keys已有SMTP配置,更新之 + if grep -q "ZY_SMTP_USER" "$KEYS_FILE" 2>/dev/null; then + # 移除旧的SMTP行并重新追加 + sed -i '/^ZY_SMTP_USER=/d' "$KEYS_FILE" + sed -i '/^ZY_SMTP_PASS=/d' "$KEYS_FILE" + sed -i '/^# SMTP邮件凭据/d' "$KEYS_FILE" + fi + echo "" >> "$KEYS_FILE" + echo "# SMTP邮件凭据 (带宽共享验证码·邮件通知)" >> "$KEYS_FILE" + echo "ZY_SMTP_USER=${ZY_SMTP_USER}" >> "$KEYS_FILE" + echo "ZY_SMTP_PASS=${ZY_SMTP_PASS}" >> "$KEYS_FILE" + chmod 600 "$KEYS_FILE" + echo " ✅ SMTP凭据已注入到 .env.keys" +} + # ── 部署V2服务代码 ──────────────────────────── deploy_services() { mkdir -p "$PROXY_DIR"/{service,data,logs,config} @@ -217,6 +252,12 @@ deploy_services() { cp "$REPO_PROXY_DIR"/service/proxy-guardian.js "$PROXY_DIR/service/" cp "$REPO_PROXY_DIR"/ecosystem.brain-proxy-v3.config.js "$PROXY_DIR/" + # 复制∞版本服务文件 (邮件·带宽共享·守护·自动进化) + cp "$REPO_PROXY_DIR"/service/email-hub.js "$PROXY_DIR/service/" 2>/dev/null || true + cp "$REPO_PROXY_DIR"/service/bandwidth-pool-agent.js "$PROXY_DIR/service/" 2>/dev/null || true + cp "$REPO_PROXY_DIR"/service/user-guardian-agent.js "$PROXY_DIR/service/" 2>/dev/null || true + cp "$REPO_PROXY_DIR"/service/auto-evolution.js "$PROXY_DIR/service/" 2>/dev/null || true + # 复制V2 Nginx配置参考 cp "$REPO_PROXY_DIR"/config/nginx-brain-proxy-snippet.conf "$PROXY_DIR/config/" 2>/dev/null || true cp "$REPO_PROXY_DIR"/config/nginx-brain-proxy-v3-snippet.conf "$PROXY_DIR/config/" 2>/dev/null || true @@ -595,6 +636,9 @@ deploy_v3() { echo "部署V3生产环境 (V2继续可用)..." deploy_services + # 注入SMTP凭据到.env.keys (如果环境变量中有且.env.keys中没有) + inject_smtp_credentials + # 清理 sites-enabled/ 中残留的备份文件(防止 duplicate default_server) clean_stale_nginx_backups @@ -771,6 +815,9 @@ deploy_infinity() { echo "部署 ∞ 版本 (在V3基础上添加自主进化能力)..." deploy_services + # 注入SMTP凭据到.env.keys (如果环境变量中有且.env.keys中没有) + inject_smtp_credentials + # 确保V3进程已在运行 if ! pm2 list 2>/dev/null | grep -q "zy-proxy-v3-sub"; then echo " ⚠️ V3进程未运行,先部署V3..." diff --git a/server/proxy/service/subscription-server-v3.js b/server/proxy/service/subscription-server-v3.js index 812c0bae..85b9c74a 100644 --- a/server/proxy/service/subscription-server-v3.js +++ b/server/proxy/service/subscription-server-v3.js @@ -2223,13 +2223,16 @@ async function submitCode(e) { } else { const errDetail = result.error || '未知原因'; console.error('[bandwidth-send-code] 邮件发送失败:', errDetail); + // 对用户隐藏内部配置细节,只显示友好提示 + const userMsg = errDetail.includes('SMTP') ? '邮件服务维护中' : errDetail; res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' }); - res.end(JSON.stringify({ success: false, message: `📧 邮件发送失败(${errDetail}),请稍后重试或联系冰朔获取验证码` })); + res.end(JSON.stringify({ success: false, message: `📧 ${userMsg},请稍后重试或联系冰朔获取验证码` })); } }).catch((err) => { console.error('[bandwidth-send-code] 邮件发送异常:', err.message || err); + const userMsg = (err.message || '').includes('SMTP') ? '邮件服务维护中' : (err.message || '发送异常'); res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' }); - res.end(JSON.stringify({ success: false, message: `📧 邮件发送异常(${err.message}),请稍后重试或联系冰朔获取验证码` })); + res.end(JSON.stringify({ success: false, message: `📧 ${userMsg},请稍后重试或联系冰朔获取验证码` })); }); } catch { // Email module not available - code was still created