You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

139 lines
4.1 KiB

#!/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 ""