diff --git a/.github/workflows/deploy-brain-proxy.yml b/.github/workflows/deploy-brain-proxy.yml index 5498f5f5..d73864ea 100644 --- a/.github/workflows/deploy-brain-proxy.yml +++ b/.github/workflows/deploy-brain-proxy.yml @@ -28,11 +28,12 @@ on: - remove-user - list-users - send-subscription + - send-subscription-v3 - deploy-v3 - switch-v3 default: 'status' email: - description: '用户邮箱 (add-user/remove-user/send-subscription时需要)' + description: '用户邮箱 (add-user/remove-user/send-subscription/send-subscription-v3时需要)' required: false type: string quota_gb: @@ -315,3 +316,75 @@ jobs: echo "" echo "✅ 完成!${LABEL} (${EMAIL}) 的独立专线已就绪" + + # ═══ §4 发送V3测试订阅 ═══ + send-subscription-v3: + name: '📧 发送V3测试订阅' + runs-on: ubuntu-latest + if: github.event.inputs.action == 'send-subscription-v3' + + steps: + - name: '📥 检出代码' + uses: actions/checkout@v4 + + - name: '🔑 配置SSH密钥' + env: + SSH_KEY: ${{ secrets.ZY_BRAIN_KEY }} + run: | + mkdir -p ~/.ssh + echo "$SSH_KEY" > ~/.ssh/id_brain + chmod 600 ~/.ssh/id_brain + ssh-keyscan -H ${{ secrets.ZY_BRAIN_HOST }} >> ~/.ssh/known_hosts 2>/dev/null + + - name: '📧 获取用户信息并发送V3链接' + env: + ZY_SMTP_USER: ${{ secrets.ZY_SMTP_USER }} + ZY_SMTP_PASS: ${{ secrets.ZY_SMTP_PASS }} + ZY_BRAIN_HOST: ${{ secrets.ZY_BRAIN_HOST }} + run: | + EMAIL="${{ github.event.inputs.email }}" + if [ -z "$EMAIL" ]; then + echo "❌ 发送V3订阅需要提供邮箱" + exit 1 + fi + + echo "📧 获取 $EMAIL 的V3订阅信息..." + + # 获取用户token + USER_INFO=$(ssh -i ~/.ssh/id_brain \ + ${{ secrets.ZY_BRAIN_USER }}@${{ secrets.ZY_BRAIN_HOST }} \ + "cd /opt/zhuyuan-brain/proxy && \ + node -e \" + const um = require('./service/user-manager'); + const user = um.loadUsers().users.find(u => u.email === '$EMAIL'); + if (user) console.log(JSON.stringify({token: user.token, label: user.label})); + else { console.error('用户不存在'); process.exit(1); } + \"") + + if [ -z "$USER_INFO" ]; then + echo "❌ 用户 $EMAIL 不存在,请先运行 add-user" + exit 1 + fi + + TOKEN=$(echo "$USER_INFO" | node -e "const d=JSON.parse(require('fs').readFileSync('/dev/stdin','utf8')); console.log(d.token)") + LABEL=$(echo "$USER_INFO" | node -e "const d=JSON.parse(require('fs').readFileSync('/dev/stdin','utf8')); console.log(d.label)") + + SUB_URL="http://${ZY_BRAIN_HOST}/api/proxy-v3/sub/${TOKEN}" + DASHBOARD_URL="http://${ZY_BRAIN_HOST}/api/proxy-v3/dashboard/${TOKEN}" + echo "📎 V3订阅链接: ${SUB_URL}" + echo "📊 V3仪表盘: ${DASHBOARD_URL}" + + # 通过大脑服务器发送V3邮件 + ssh -i ~/.ssh/id_brain \ + ${{ secrets.ZY_BRAIN_USER }}@${{ secrets.ZY_BRAIN_HOST }} \ + "export ZY_SMTP_USER='${ZY_SMTP_USER}' ZY_SMTP_PASS='${ZY_SMTP_PASS}' && \ + cd /opt/zhuyuan-brain/proxy && \ + node service/send-subscription.js send-v3 '$EMAIL' '$SUB_URL' '$DASHBOARD_URL'" || { + echo "" + echo "⚠️ 邮件发送失败,请手动访问以下链接:" + echo " 订阅: $SUB_URL" + echo " 仪表盘: $DASHBOARD_URL" + } + + echo "" + echo "✅ 完成!${LABEL} (${EMAIL}) 的V3光湖语言世界测试订阅已发送" diff --git a/server/proxy/service/send-subscription.js b/server/proxy/service/send-subscription.js index 059e3e84..a1e0dc1f 100644 --- a/server/proxy/service/send-subscription.js +++ b/server/proxy/service/send-subscription.js @@ -10,8 +10,9 @@ // 确保敏感信息不经过公开仓库 // // 用法: -// node send-subscription.js send — 发送订阅链接 -// node send-subscription.js alert — 发送告警邮件 +// node send-subscription.js send — 发送V2订阅链接 +// node send-subscription.js send-v3 — 发送V3订阅链接 +// node send-subscription.js alert — 发送告警邮件 // // 环境变量: // ZY_SMTP_USER, ZY_SMTP_PASS — SMTP认证 @@ -206,6 +207,99 @@ function generateSubscriptionEmail(config, urlOverride) { `; } +// ── 生成V3订阅邮件HTML (光湖语言世界) ───────── +function generateV3SubscriptionEmail(subUrl, dashboardUrl) { + const now = new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }); + + return ` + + + + +
+

🌐 光湖语言世界

+

铸渊专线 V3 测试版 · 私有订阅链接

+ +
+ 🧪 V3 测试版 + — 请测试后反馈体验,V2 继续可用 +
+ +
+ +

📱 V3 订阅链接

+
+ ${subUrl} +
+ +

+ ⚠️ 请勿分享此链接 · 所有订阅共享 2000GB 月流量池 +

+ +
+ +

📊 V3 流量仪表盘

+
+ ${dashboardUrl} +
+

+ 💡 V3新功能:在浏览器中查看实时流量统计和节点状态 +

+ +
+ +

📋 使用方法

+ +

🍎 iPhone (Shadowrocket)

+
    +
  1. 打开 Shadowrocket
  2. +
  3. 点击右上角 +
  4. +
  5. 选择 Subscribe (订阅)
  6. +
  7. 粘贴上方 V3 订阅链接
  8. +
  9. 点击完成 → 选择节点 → 开启连接
  10. +
+ +

💻 Mac / Windows (Clash Verge)

+
    +
  1. 打开 Clash Verge
  2. +
  3. 点击 Profiles (配置)
  4. +
  5. 粘贴上方 V3 订阅链接到输入框
  6. +
  7. 点击 Import (导入)
  8. +
  9. 选中新配置 → 开启系统代理
  10. +
+ +

🤖 Android (ClashMi / Clash Meta)

+
    +
  1. 打开 ClashMi
  2. +
  3. 点击 ProfileNew Profile
  4. +
  5. 选择 URL
  6. +
  7. 粘贴上方 V3 订阅链接
  8. +
  9. 保存 → 选中配置 → 启动
  10. +
+ +
+ +

🆕 V3 升级亮点

+ + + + + + + +
品牌光湖语言世界
流量池2000 GB / 月 (硬切 · 到量即停)
重置日期每月1日
协议VLESS + Reality (最高安全级别)
节点位置🇸🇬 新加坡 (多节点)
新增📊 流量仪表盘 · 增强分流 · 反向加速
+ +
+ +

+ 光湖语言世界 · 铸渊专线 V3 测试版 · ${now}
+ 国作登字-2026-A-00037559 +

+
+ +`; +} + // ── 生成告警邮件HTML ───────────────────────── function generateAlertEmail(message) { const now = new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }); @@ -226,12 +320,13 @@ function generateAlertEmail(message) { // ── 主入口 ─────────────────────────────────── async function main() { - const [,, action, target, urlOverride] = process.argv; + const [,, action, target, urlOverride, dashboardUrl] = process.argv; if (!action) { console.log('用法:'); - console.log(' node send-subscription.js send — 发送订阅链接'); - console.log(' node send-subscription.js alert — 发送告警邮件'); + console.log(' node send-subscription.js send — 发送V2订阅链接'); + console.log(' node send-subscription.js send-v3 — 发送V3订阅链接'); + console.log(' node send-subscription.js alert — 发送告警邮件'); process.exit(0); } @@ -255,6 +350,37 @@ async function main() { process.exit(1); } + } else if (action === 'send-v3') { + const email = target; + if (!email) { + console.error('❌ 请指定目标邮箱'); + process.exit(1); + } + if (!urlOverride) { + console.error('❌ 请提供V3订阅URL'); + process.exit(1); + } + + let dashboard = dashboardUrl; + if (!dashboard) { + if (urlOverride.includes('/sub/')) { + dashboard = urlOverride.replace('/sub/', '/dashboard/'); + } else { + console.error('❌ 订阅URL中未包含/sub/路径,请手动提供仪表盘URL'); + process.exit(1); + } + } + console.log(`📧 发送V3订阅链接到: ${email}`); + const html = generateV3SubscriptionEmail(urlOverride, dashboard); + + try { + await sendEmail(email, '🌐 光湖语言世界 · V3测试订阅链接', html); + console.log('✅ V3订阅链接已发送'); + } catch (err) { + console.error('❌ 发送失败:', err.message); + process.exit(1); + } + } else if (action === 'alert') { const message = target || '未知告警'; const email = config.smtp_user; // 告警发到管理员邮箱