#!/usr/bin/env node /** * 生成部署用 zip,排除 node_modules、构建产物、.git、本地 .env 等。 * 用法: node pack.mjs * 输出: release/thebet365-deploy-YYYYMMDD-HHmmss.zip */ import { execSync } from 'node:child_process'; import { mkdirSync, statSync } from 'node:fs'; import { basename, join } from 'node:path'; const root = process.cwd(); const projectName = basename(root); const parent = join(root, '..'); const stamp = new Date() .toISOString() .replace(/[-:]/g, '') .slice(0, 15) .replace('T', '-'); const outDir = join(root, 'release'); const outFile = join(outDir, `thebet365-deploy-${stamp}.zip`); /** 相对项目根目录的路径 */ const excludePaths = [ 'node_modules', '.git', '.env', '.env.local', '.env.docker', 'apps/api/.env', 'apps/api/dist', 'apps/player/dist', 'apps/admin/dist', 'release', ]; mkdirSync(outDir, { recursive: true }); const excludeArgs = excludePaths .map((p) => `--exclude=${projectName}/${p}`) .join(' '); const cmd = `tar -a -c -f "${outFile}" ${excludeArgs} -C "${parent}" "${projectName}"`; console.log('Packing deployment archive...'); console.log('Excluding:'); for (const p of excludePaths) console.log(` - ${p}/`); console.log(''); try { execSync(cmd, { stdio: 'inherit' }); } catch { console.error('\nPack failed. Ensure tar is available (Windows 10+ / Linux / macOS).'); process.exit(1); } const sizeMb = (statSync(outFile).size / (1024 * 1024)).toFixed(2); console.log(`\nDone: ${outFile}`); console.log(`Size: ${sizeMb} MB`); console.log('\nUpload to server, extract under /www/wwwroot/thebet365, then:'); console.log(' cp .env.docker.example .env.docker'); console.log(' docker compose -f docker-compose.prod.yml --env-file .env.docker up -d --build');