#!/bin/bash # 此脚本用来一键部署到生产服务器 # 需事先配置好ssh免密登录,目标服务器需要安装好node、pnpm、tsx、pm2来运行程序 set -e # 配置 REMOTE_USER="" REMOTE_HOST="" REMOTE_PORT="" PROJECT_NAME="" REMOTE_DIR="~/$PROJECT_NAME" pnpm run lint echo "🔨 开始构建项目..." pnpm run build echo "📦 准备部署文件..." # 创建临时目录 TEMP_DIR=$(mktemp -d) trap "rm -rf $TEMP_DIR" EXIT # 复制必要文件 cp -r .next-prod $TEMP_DIR/ cp -r public $TEMP_DIR/ cp -r prisma $TEMP_DIR/ cp package.json $TEMP_DIR/ cp pnpm-lock.yaml $TEMP_DIR/ cp next.config.ts $TEMP_DIR/ echo "🚀 上传文件到服务器..." ssh ${REMOTE_USER}@${REMOTE_HOST} "mkdir -p ${REMOTE_DIR}" rsync -avz --delete \ --exclude=node_modules \ --exclude=.git \ $TEMP_DIR/ ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/ # 上传环境变量文件 echo "📝 上传环境变量文件..." [ -f .env ] && scp .env ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/.env [ -f .env.production ] && scp .env.production ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/.env.production echo "⚙️ 在服务器上配置和启动服务..." ssh ${REMOTE_USER}@${REMOTE_HOST} << ENDSSH cd ${REMOTE_DIR} # 安装生产依赖(包括prisma用于数据库迁移和pm2用于进程管理) echo "📥 安装依赖..." pnpm install --prod # 运行数据库迁移 echo "🗄️ 运行数据库迁移..." npx prisma migrate deploy npx prisma generate # 使用PM2管理Next.js服务 echo "🔄 使用PM2重启服务..." /home/user/.local/share/pnpm/pm2 delete $PROJECT_NAME || true /home/user/.local/share/pnpm/pm2 start pnpm --name $PROJECT_NAME -- start -p ${REMOTE_PORT} # 保存当前 PM2 进程列表的快照,使其在系统重启后能自动恢复 /home/user/.local/share/pnpm/pm2 save echo "✅ 部署完成!服务运行在端口 ${REMOTE_PORT}" echo "📊 查看服务状态: pm2 status" echo "📝 查看日志: pm2 logs $PROJECT_NAME" echo "❌ 关闭服务: pm2 delete $PROJECT_NAME" ENDSSH echo "🎉 部署成功!" echo "访问地址: http://${REMOTE_HOST}:${REMOTE_PORT}"