#!/usr/bin/env bash set -euo pipefail # ─── 配置 ─────────────────────────────────────────── SERVER="root@119.91.211.52" REMOTE_DIR="/root/apps/meme-studio" APP_NAME="meme-studio" # ─── 颜色 ─────────────────────────────────────────── GREEN='\033[0;32m' YELLOW='\033[0;33m' RED='\033[0;31m' NC='\033[0m' step() { echo -e "\n${GREEN}▶ $1${NC}"; } warn() { echo -e "${YELLOW}⚠ $1${NC}"; } fail() { echo -e "${RED}✖ $1${NC}"; exit 1; } START_TIME=$(date +%s) # ─── 1. 本地构建 ──────────────────────────────────── step "构建项目..." pnpm run build || fail "构建失败" # ─── 2. 创建远程目录 ──────────────────────────────── step "初始化远程目录..." ssh "$SERVER" "mkdir -p $REMOTE_DIR/.next/static $REMOTE_DIR/public" # ─── 3. 同步文件(排除 node_modules,由服务器安装)─── step "同步文件到服务器..." rsync -az --delete --exclude='node_modules' .next/standalone/ "$SERVER:$REMOTE_DIR/" rsync -az .next/static/ "$SERVER:$REMOTE_DIR/.next/static/" rsync -az public/ "$SERVER:$REMOTE_DIR/public/" rsync -az prisma/ "$SERVER:$REMOTE_DIR/prisma/" rsync -az .env.production "$SERVER:$REMOTE_DIR/.env" rsync -az ecosystem.config.js "$SERVER:$REMOTE_DIR/" rsync -az package.json package-lock.json "$SERVER:$REMOTE_DIR/" # ─── 4. 远程安装依赖 & 重启 ───────────────────────── step "安装依赖并重启服务..." ssh "$SERVER" "cd $REMOTE_DIR && npm install --production && npx prisma generate && (pm2 restart $APP_NAME 2>/dev/null || pm2 start ecosystem.config.js)" # ─── 完成 ─────────────────────────────────────────── END_TIME=$(date +%s) ELAPSED=$((END_TIME - START_TIME)) echo -e "\n${GREEN}✔ 部署完成!耗时 ${ELAPSED}s${NC}"