48 lines
2.2 KiB
Bash
Executable File
48 lines
2.2 KiB
Bash
Executable File
#!/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}"
|