name: Deploy Backend to ECS # 数字我后端(纯成人版)。真正的生产目录 = /var/www/digitalme-api.invoratec.cn # (它有正确 .env: creator_cn 共享库+前缀 / DASHSCOPE / JWT),nginx digitalme-api → :3603。 on: workflow_dispatch: {} # ★ 允许在 Actions 页面手动触发部署(老板要求 2026-07-28) push: # ⚠ 只监听 master。原来 [master, main] 是一把上膛的枪: # main 是落后 169 个提交的僵尸分支,往它推任何一行代码, # 都会把旧代码盖到生产上。(已发生过一次。main 现已删除。) branches: [master] paths: - 'digital-me-backend/**' - '.github/workflows/deploy-adult-backend.yml' jobs: # 说明:原「测试门 test job」(node --test + mongo service)已按要求移除。 # 它总是报错、且 deploy 本就未 needs 它(不阻断部署),只让每次运行显示一个红叉、 # 看起来像"部署失败"。移除后部署运行恢复全绿。 # 要恢复 CI 测试:另建一个独立 workflow(如 test.yml)跑 node --test,不要再挂进部署流程误报。 deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Copy files to ECS uses: appleboy/scp-action@v0.1.7 with: host: ${{ secrets.ECS_HOST }} username: ${{ secrets.ECS_USER }} password: ${{ secrets.ECS_PASSWORD }} source: 'digital-me-backend/src,digital-me-backend/scripts,digital-me-backend/package.json,digital-me-backend/package-lock.json' target: /var/www/digitalme-api.invoratec.cn strip_components: 1 overwrite: true rm: false timeout: 60s command_timeout: 5m - name: Install + restart PM2 (:3603) uses: appleboy/ssh-action@v1 with: host: ${{ secrets.ECS_HOST }} username: ${{ secrets.ECS_USER }} password: ${{ secrets.ECS_PASSWORD }} command_timeout: 10m script: | cd /var/www/digitalme-api.invoratec.cn [ -f .env ] || { echo "❌ 生产 .env 缺失,中止"; exit 1; } # ★ 2026-07-28 上线前【关闭 stub 登录】:不再强制写 ALLOW_STUB_LOGIN=true。 # 代码层(config.js)已保证生产环境即使 .env 误设 true 也强制忽略(防账号接管); # 这里再把历史遗留的 =true 就地改成 false,彻底消除。要放开消费端登录 = 接真实 # 阿里云短信(SMS_PROVIDER=aliyun + ALIYUN_SMS_*) / 微信开放平台(WECHAT_APP_ID/SECRET)。 if grep -q '^ALLOW_STUB_LOGIN=true' .env; then sed -i 's/^ALLOW_STUB_LOGIN=true/ALLOW_STUB_LOGIN=false/' .env; fi # ★ 万相文生图开关(老板拍板开):开通后 inkArt/漫画轻版/二创样板间美术视频样板渲成真图=成品。 # 复用 DASHSCOPE key·国内 DashScope;用户点击才生成、结果缓存,非自动批量。 # ⚠ 若 DASHSCOPE 账号未开通万相文生图(账号层,同 TTS 曾遇),置 true 也不出图——那是账号问题非代码。 grep -q '^INK_ART_ENABLED=' .env || echo 'INK_ART_ENABLED=true' >> .env npm install --production --no-audit --no-fund --prefer-offline --no-progress 2>&1 | tail -8 || \ npm install --production --no-audit --no-fund 2>&1 | tail -20 # 收敛为单进程 digitalme-api on :3603(清掉错误的 adult/teen 空目录进程)。 pm2 delete digitalme-adult-api 2>/dev/null || true pm2 delete digitalme-teen-api 2>/dev/null || true pm2 delete digitalme-api 2>/dev/null || true fuser -k 3603/tcp 2>/dev/null || true sleep 2 PORT=3603 pm2 start src/index.js --name digitalme-api --node-args="--max-old-space-size=512" --update-env pm2 save sleep 6 echo "=== pm2 ==="; pm2 list | grep digitalme || true echo "=== 崩溃日志(如有) ==="; pm2 logs digitalme-api --lines 25 --nostream 2>/dev/null | tail -30 || true H=$(curl -sf http://localhost:3603/health || true); echo "health:[$H]" echo "$H" | grep -q '"ok":true' || { echo "❌ 后端没起来"; exit 1; } echo "$H" | grep -q '"edition"' && { echo "❌ 旧代码"; exit 1; } || echo "✓ 新代码已上线"