ci: 归档 ECS 专用工作流;新增 NAS 自动部署流水线
This commit is contained in:
+74
@@ -0,0 +1,74 @@
|
||||
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 "✓ 新代码已上线"
|
||||
Reference in New Issue
Block a user