diff --git a/.github/workflows/deploy-to-zhuyuan-server.yml b/.github/workflows/deploy-to-zhuyuan-server.yml index 823b0051..60464f43 100644 --- a/.github/workflows/deploy-to-zhuyuan-server.yml +++ b/.github/workflows/deploy-to-zhuyuan-server.yml @@ -201,6 +201,14 @@ jobs: # Nginx中 _ 是标准的catch-all server_name,不匹配任何实际域名 sed -i "s/ZY_DOMAIN_PREVIEW_PLACEHOLDER/_/g" /tmp/zhuyuan-sovereign.conf fi + ZY_BRAIN_HOST="${{ secrets.ZY_BRAIN_HOST }}" + if [ -n "$ZY_BRAIN_HOST" ]; then + sed -i "s/ZY_BRAIN_HOST_PLACEHOLDER/$ZY_BRAIN_HOST/g" /tmp/zhuyuan-sovereign.conf + echo "✅ 大脑服务器已注入V3桥接: $ZY_BRAIN_HOST" + else + echo "⚠️ ZY_BRAIN_HOST 未配置,V3桥接不可用" + sed -i '/ZY_BRAIN_HOST_PLACEHOLDER/d' /tmp/zhuyuan-sovereign.conf + fi scp -i ~/.ssh/zy_key \ /tmp/zhuyuan-sovereign.conf \ ${{ secrets.ZY_SERVER_USER }}@${{ secrets.ZY_SERVER_HOST }}:/opt/zhuyuan/config/nginx/zhuyuan-sovereign.conf diff --git a/.github/workflows/infinity-evolution.yml b/.github/workflows/infinity-evolution.yml index 3b26c53c..8ce709a9 100644 --- a/.github/workflows/infinity-evolution.yml +++ b/.github/workflows/infinity-evolution.yml @@ -25,6 +25,7 @@ on: - 'server/proxy/service/bandwidth-pool-agent.js' - 'server/proxy/service/swarm-defense-agent.js' - 'server/proxy/service/user-guardian-agent.js' + - 'server/proxy/service/subscription-server-v3.js' - 'server/proxy/config/release-notes.json' - 'server/proxy/ecosystem.brain-proxy-v3.config.js' schedule: @@ -40,6 +41,10 @@ on: - monthly-evolution - deploy-infinity - status + - add-user + - remove-user + - list-users + - send-subscription-v3 - send-monthly-reset - send-update-notify - send-update-notify-single @@ -55,9 +60,14 @@ on: required: false type: string email: - description: '目标邮箱 (send-update-notify-single/send-bandwidth-auth-single时需要 · 可先用list-user-emails查看)' + description: '目标邮箱 (add-user/remove-user/send-subscription-v3/send-update-notify-single/send-bandwidth-auth-single时需要)' required: false type: string + quota_gb: + description: '月配额GB (add-user时可选,默认500)' + required: false + type: string + default: '500' permissions: contents: read @@ -89,6 +99,7 @@ jobs: ACTION: ${{ github.event_name == 'push' && 'deploy-infinity' || github.event.inputs.action || 'monthly-evolution' }} MESSAGE: ${{ github.event.inputs.message || '' }} EMAIL: ${{ github.event.inputs.email || '' }} + QUOTA: ${{ github.event.inputs.quota_gb || '500' }} ZY_SMTP_USER: ${{ secrets.ZY_SMTP_USER }} ZY_SMTP_PASS: ${{ secrets.ZY_SMTP_PASS }} run: | @@ -98,18 +109,20 @@ jobs: REMOTE_HOST="${{ secrets.ZY_BRAIN_USER }}@${{ secrets.ZY_BRAIN_HOST }}" # ── 同步邮件模块到服务器 ── - # 确保服务器上的email-hub.js和release-notes.json是最新版本 + # 确保服务器上的email-hub.js和相关模块是最新版本 sync_email_files() { echo "📦 同步邮件模块到服务器..." $SSH_CMD "mkdir -p $PROXY_DIR/.deploy-tmp $PROXY_DIR/config" $SCP_CMD \ server/proxy/service/email-hub.js \ server/proxy/service/bandwidth-pool-agent.js \ + server/proxy/service/subscription-server-v3.js \ server/proxy/config/release-notes.json \ ${REMOTE_HOST}:$PROXY_DIR/.deploy-tmp/ $SSH_CMD " cp $PROXY_DIR/.deploy-tmp/email-hub.js $PROXY_DIR/service/ cp $PROXY_DIR/.deploy-tmp/bandwidth-pool-agent.js $PROXY_DIR/service/ + cp $PROXY_DIR/.deploy-tmp/subscription-server-v3.js $PROXY_DIR/service/ cp $PROXY_DIR/.deploy-tmp/release-notes.json $PROXY_DIR/config/ rm -rf $PROXY_DIR/.deploy-tmp " @@ -133,6 +146,7 @@ jobs: server/proxy/service/bandwidth-pool-agent.js \ server/proxy/service/swarm-defense-agent.js \ server/proxy/service/user-guardian-agent.js \ + server/proxy/service/subscription-server-v3.js \ server/proxy/config/release-notes.json \ server/proxy/ecosystem.brain-proxy-v3.config.js \ ${{ secrets.ZY_BRAIN_USER }}@${{ secrets.ZY_BRAIN_HOST }}:$PROXY_DIR/.deploy-tmp/ @@ -144,6 +158,7 @@ jobs: cp $PROXY_DIR/.deploy-tmp/bandwidth-pool-agent.js $PROXY_DIR/service/ cp $PROXY_DIR/.deploy-tmp/swarm-defense-agent.js $PROXY_DIR/service/ cp $PROXY_DIR/.deploy-tmp/user-guardian-agent.js $PROXY_DIR/service/ + cp $PROXY_DIR/.deploy-tmp/subscription-server-v3.js $PROXY_DIR/service/ mkdir -p $PROXY_DIR/config cp $PROXY_DIR/.deploy-tmp/release-notes.json $PROXY_DIR/config/ cp $PROXY_DIR/.deploy-tmp/ecosystem.brain-proxy-v3.config.js $PROXY_DIR/ @@ -185,6 +200,71 @@ jobs: " ;; + add-user) + if [ -z "$EMAIL" ]; then + echo "❌ 请提供目标邮箱 (email字段)" + exit 1 + fi + if ! echo "$EMAIL" | grep -qE '^[^@]+@[^@]+\.[^@]+$'; then + echo "❌ 邮箱格式不正确: $EMAIL" + exit 1 + fi + echo "➕ 新增用户: $EMAIL (配额: ${QUOTA}GB/月)" + $SSH_CMD " + cd $PROXY_DIR + node service/user-manager.js add '$EMAIL' '${QUOTA}' + " + echo "" + echo "════════════════════════════════════════" + echo "✅ 用户已添加" + echo "下一步: 运行 send-subscription-v3 发送V3订阅链接到 $EMAIL" + echo "════════════════════════════════════════" + ;; + + remove-user) + if [ -z "$EMAIL" ]; then + echo "❌ 请提供目标邮箱 (email字段)" + exit 1 + fi + if ! echo "$EMAIL" | grep -qE '^[^@]+@[^@]+\.[^@]+$'; then + echo "❌ 邮箱格式不正确: $EMAIL" + exit 1 + fi + echo "➖ 移除用户: $EMAIL" + $SSH_CMD " + cd $PROXY_DIR + node service/user-manager.js remove '$EMAIL' + " + ;; + + list-users) + echo "📋 用户列表:" + $SSH_CMD " + cd $PROXY_DIR + node service/user-manager.js list + " + ;; + + send-subscription-v3) + if [ -z "$EMAIL" ]; then + echo "❌ 请提供目标邮箱 (email字段)" + echo "💡 可先使用 list-users 或 list-user-emails 查看用户" + exit 1 + fi + if ! echo "$EMAIL" | grep -qE '^[^@]+@[^@]+\.[^@]+$'; then + echo "❌ 邮箱格式不正确: $EMAIL" + exit 1 + fi + sync_email_files + echo "发送V3订阅链接 (含系统介绍+带宽共享邀请) 给: $EMAIL ..." + $SSH_CMD " + cd $PROXY_DIR + export ZY_SMTP_USER='$ZY_SMTP_USER' + export ZY_SMTP_PASS='$ZY_SMTP_PASS' + node service/email-hub.js send-subscription-v3 '$EMAIL' + " + ;; + send-monthly-reset) sync_email_files echo "发送月初重置邮件..." diff --git a/.github/workflows/staging-auto-deploy.yml b/.github/workflows/staging-auto-deploy.yml index 5d26bec9..7055f642 100644 --- a/.github/workflows/staging-auto-deploy.yml +++ b/.github/workflows/staging-auto-deploy.yml @@ -172,6 +172,12 @@ jobs: else sed -i "s/ZY_DOMAIN_PREVIEW_PLACEHOLDER/_/g" /tmp/zhuyuan-sovereign.conf fi + ZY_BRAIN_HOST="${{ secrets.ZY_BRAIN_HOST }}" + if [ -n "$ZY_BRAIN_HOST" ]; then + sed -i "s/ZY_BRAIN_HOST_PLACEHOLDER/$ZY_BRAIN_HOST/g" /tmp/zhuyuan-sovereign.conf + else + sed -i '/ZY_BRAIN_HOST_PLACEHOLDER/d' /tmp/zhuyuan-sovereign.conf + fi scp -i $KEY /tmp/zhuyuan-sovereign.conf \ $USER@$HOST:/opt/zhuyuan/config/nginx/zhuyuan-sovereign.conf 2>&1 || true diff --git a/server/nginx/zhuyuan-sovereign.conf b/server/nginx/zhuyuan-sovereign.conf index 7c6ee53b..6b21ee1d 100644 --- a/server/nginx/zhuyuan-sovereign.conf +++ b/server/nginx/zhuyuan-sovereign.conf @@ -153,6 +153,25 @@ server { try_files $uri $uri/ /index.html; } + # ─── 光湖语言世界V3 · 带宽授权桥接 (大脑服务器反向代理) ─── + # QQ邮箱拦截大脑服务器域名链接,此桥接通过guanghulab.online域名 + # 将V3授权/订阅请求透传到大脑服务器的V3订阅服务 (端口3805) + # 部署时由 workflow 自动将 ZY_BRAIN_HOST_PLACEHOLDER 替换为实际IP + location /api/proxy-v3/ { + proxy_pass http://ZY_BRAIN_HOST_PLACEHOLDER/api/proxy-v3/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_connect_timeout 10s; + proxy_read_timeout 30s; + proxy_send_timeout 30s; + add_header X-Content-Type-Options nosniff always; + add_header X-Frame-Options DENY always; + add_header Cache-Control "no-store, no-cache, must-revalidate" always; + } + # ─── 铸渊 API 反向代理 (端口 3801 · 预览端口) ─── location /api/ { proxy_pass http://127.0.0.1:3801;