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.
132 lines
4.4 KiB
132 lines
4.4 KiB
#!/bin/bash
|
|
|
|
# 一键部署脚本 - Linux/macOS
|
|
# 使用方法: cp deploy.sh deploy-new.sh && chmod +x deploy-new.sh && ./deploy-new.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. 检查并安装编译工具
|
|
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}"
|
|
|
|
cp .env.backend.example backend/.env
|
|
|
|
# 随机生成一个强壮的 JWT_SECRET,并写入 backend/.env(如果尚未存在)
|
|
if [ ! -f backend/.env ]; then
|
|
echo -e "${BLUE}🔑 生成随机 JWT_SECRET...${NC}"
|
|
JWT_SECRET=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 48)
|
|
printf "\nJWT_SECRET=$JWT_SECRET\n" > backend/.env
|
|
echo -e "${GREEN}✅ 已生成 backend/.env 并写入 JWT_SECRET${NC}"
|
|
else
|
|
# 若已存在 .env,检查是否包含 JWT_SECRET,没有则添加
|
|
if ! grep -q "^JWT_SECRET=" backend/.env; then
|
|
echo -e "${BLUE}🔑 写入随机 JWT_SECRET 到已有 backend/.env...${NC}"
|
|
JWT_SECRET=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 48)
|
|
printf "\nJWT_SECRET=$JWT_SECRET\n" >> backend/.env
|
|
echo -e "${GREEN}✅ 已写入随机 JWT_SECRET 到 backend/.env${NC}"
|
|
else
|
|
echo -e "${YELLOW}ℹ️ backend/.env 已存在 JWT_SECRET,跳过自动生成${NC}"
|
|
fi
|
|
fi
|
|
|
|
echo -e "${BLUE}📦 安装依赖...${NC}"
|
|
pnpm install:all
|
|
echo -e "${BLUE}📦 依赖安装完成${NC}"
|
|
|
|
# 4. 安装依赖
|
|
echo -e "${BLUE}📦 后端构建中...${NC}"
|
|
cd backend
|
|
npm rebuild sqlite3
|
|
echo -e "${BLUE}📦 sqlite3 重建完成${NC}"
|
|
npm rebuild bcrypt
|
|
echo -e "${BLUE}📦 bcrypt 安装完成${NC}"
|
|
pnpm build
|
|
echo -e "${BLUE}📦 后端构建完成${NC}"
|
|
pnpm migrate:prod
|
|
echo -e "${BLUE}📦 数据库迁移完成${NC}"
|
|
|
|
# 检查服务是否存在,如果存在则停止并删除
|
|
if pm2 describe just-demo-backend &> /dev/null; then
|
|
echo -e "${BLUE}🛑 停止现有服务...${NC}"
|
|
pm2 stop just-demo-backend
|
|
echo -e "${BLUE}🗑️ 删除现有服务...${NC}"
|
|
pm2 delete just-demo-backend
|
|
else
|
|
echo -e "${BLUE}ℹ️ 服务不存在,跳过停止和删除${NC}"
|
|
fi
|
|
|
|
pm2 start npm --name "just-demo-backend" -- run start:p
|
|
echo -e "${BLUE}📦 后端启动完成${NC}"
|
|
|
|
cd ..
|
|
|
|
# 5. 构建项目
|
|
echo -e "${BLUE}📦 前端构建中...${NC}"
|
|
cd frontend
|
|
pnpm build
|
|
echo -e "${BLUE}📦 前端构建完成${NC}"
|
|
|
|
echo -e "${GREEN}🎉 部署成功!${NC}"
|
|
|
|
echo "常用命令:"
|
|
echo " pm2 status # 查看服务状态"
|
|
echo " pm2 logs # 查看日志"
|
|
echo " pm2 restart all # 重启所有服务"
|
|
echo " pm2 stop all # 停止所有服务"
|
|
echo ""
|
|
|
|
|