#!/bin/bash # 一键部署脚本 - Linux/macOS # 使用方法: chmod +x deploy.sh && ./deploy.sh set -e # 遇到错误立即退出 echo "🚀 开始部署 Just-Demo 项目..." # 颜色定义 GREEN='\033[0;32m' BLUE='\033[0;34m' RED='\033[0;31m' NC='\033[0m' # No Color # 1. 检查 Node.js echo -e "${BLUE}📦 检查 Node.js...${NC}" if ! command -v node &> /dev/null; then echo -e "${RED}❌ Node.js 未安装,请先安装 Node.js (v16+)${NC}" exit 1 fi echo -e "${GREEN}✅ Node.js 版本: $(node -v)${NC}" # 2. 检查 pnpm,如果没有则安装 echo -e "${BLUE}📦 检查 pnpm...${NC}" if ! command -v pnpm &> /dev/null; then echo "pnpm 未安装,正在安装..." npm install -g pnpm fi echo -e "${GREEN}✅ pnpm 版本: $(pnpm -v)${NC}" # 3. 检查 PM2,如果没有则安装 echo -e "${BLUE}📦 检查 PM2...${NC}" if ! command -v pm2 &> /dev/null; then echo "PM2 未安装,正在安装..." npm install -g pm2 fi echo -e "${GREEN}✅ PM2 已安装${NC}" # 3.5. 检查并安装编译工具(sqlite3 需要) echo -e "${BLUE}🔧 检查编译工具...${NC}" if [[ "$OSTYPE" == "linux-gnu"* ]]; then # Linux 系统 if command -v apt-get &> /dev/null; then # Debian/Ubuntu if ! command -v python3 &> /dev/null || ! command -v make &> /dev/null || ! command -v g++ &> /dev/null; then echo "正在安装编译工具 (python3, make, g++)..." sudo apt-get update sudo apt-get install -y python3 make g++ build-essential fi elif command -v yum &> /dev/null; then # CentOS/RHEL if ! command -v python3 &> /dev/null || ! command -v make &> /dev/null || ! command -v g++ &> /dev/null; then echo "正在安装编译工具 (python3, make, gcc-c++)..." sudo yum install -y python3 make gcc-c++ fi elif command -v apk &> /dev/null; then # Alpine if ! command -v python3 &> /dev/null || ! command -v make &> /dev/null || ! command -v g++ &> /dev/null; then echo "正在安装编译工具 (python3, make, g++)..." sudo apk add --no-cache python3 make g++ fi fi fi echo -e "${GREEN}✅ 编译工具已就绪${NC}" # 4. 安装依赖 echo -e "${BLUE}📦 安装项目依赖...${NC}" pnpm install:all # 4.5. 强制重建 sqlite3(确保原生模块正确编译) echo -e "${BLUE}🔨 重建 sqlite3 原生模块...${NC}" cd backend # 删除 sqlite3 模块并重新安装,确保在当前平台编译 rm -rf node_modules/.pnpm/sqlite3@* 2>/dev/null || true rm -rf node_modules/sqlite3 2>/dev/null || true # 强制重新安装 sqlite3,确保在当前平台编译 pnpm install sqlite3 --force # 重建以确保原生模块正确编译 pnpm rebuild sqlite3 cd .. echo -e "${GREEN}✅ sqlite3 重建完成${NC}" # 5. 构建项目 echo -e "${BLUE}🔨 构建项目...${NC}" pnpm build # 6. 创建生产环境配置 echo -e "${BLUE}⚙️ 创建生产环境配置...${NC}" if [ ! -f backend/.env ]; then cat > backend/.env << EOF NODE_ENV=production PORT=3000 JWT_SECRET=$(openssl rand -base64 32) FRONTEND_URL=http://localhost:5500 UPLOAD_DIR=uploads EOF echo -e "${GREEN}✅ 已创建 backend/.env${NC}" else echo -e "${GREEN}✅ backend/.env 已存在${NC}" fi # 7. 运行数据库迁移 echo -e "${BLUE}🗄️ 运行数据库迁移...${NC}" cd backend pnpm migrate:prod cd .. # 8. 使用 PM2 启动服务 echo -e "${BLUE}🚀 使用 PM2 启动服务...${NC}" pm2 delete just-demo-backend 2>/dev/null || true pm2 start ecosystem.config.js # 9. 保存 PM2 配置(开机自启动) echo -e "${BLUE}💾 配置 PM2 开机自启动...${NC}" pm2 save pm2 startup # 10. 显示服务状态 echo "" echo -e "${GREEN}✅ 部署完成!${NC}" echo "" echo "📊 服务状态:" pm2 status echo "" echo -e "${GREEN}🎉 部署成功!${NC}" echo "" echo "访问地址:" echo " - 前端: http://localhost:5500" echo " - 后端: http://localhost:3000" echo "" echo "常用命令:" echo " pm2 status # 查看服务状态" echo " pm2 logs # 查看日志" echo " pm2 restart all # 重启所有服务" echo " pm2 stop all # 停止所有服务" echo ""