#!/bin/bash # 颜色定义 GREEN='\033[0;32m' RED='\033[0;31m' NC='\033[0m' # No Color INFO="${GREEN}[INFO]${NC}" ERROR="${RED}[ERROR]${NC}" # 错误处理 set -e trap 'echo -e "${ERROR} 部署失败,请检查上方错误日志。"' ERR echo -e "${INFO} 开始自动化部署脚本..." # 0. 拉取最新代码 echo -e "${INFO} 0/6 拉取最新代码..." if git pull; then echo -e "${INFO} 代码拉取成功。" else echo -e "${ERROR} git pull 失败,请手动检查。" exit 1 fi # 1. 检查并安装系统级依赖 echo -e "${INFO} 1/6 检查并安装系统依赖..." if command -v apt-get &> /dev/null; then sudo apt-get update # 基础构建工具 sudo apt-get install -y build-essential python3-dev pkg-config # WeasyPrint 依赖 sudo apt-get install -y libpango-1.0-0 libpangoft2-1.0-0 libgdk-pixbuf-2.0-0 shared-mime-info # Python 虚拟环境支持 sudo apt-get install -y python3-venv python3-pip else echo -e "${ERROR} 仅支持 Debian/Ubuntu 系统,请手动安装相关依赖。" exit 1 fi # 2. 安装 Node.js 依赖 (PM2) echo -e "${INFO} 2/6 检查并安装全局 Node.js 工具..." if ! command -v pm2 &> /dev/null; then echo "安装 PM2..." sudo npm install -g pm2 fi # 3. 创建并激活 Python 虚拟环境 echo -e "${INFO} 3/6 设置 Python 虚拟环境..." if [ ! -d ".venv" ]; then python3 -m venv .venv fi source .venv/bin/activate # 4. 安装 Python 项目依赖 echo -e "${INFO} 4/6 安装 Python 依赖..." pip install --upgrade pip pip install -r requirements.txt # 5. 初始化数据库 echo -e "${INFO} 5/6 初始化数据库..." if [ -f "create_db.py" ]; then python create_db.py else echo -e "${ERROR} 找不到 create_db.py,跳过数据库初始化。" fi # 6. 启动服务 echo -e "${INFO} 6/6 启动服务..." # 如果是生产环境部署前端 if [ "$1" == "prod" ]; then echo "构建前端..." cd frontend npm install npm run build cd .. # 修改 ecosystem.config.js 指向 build (如果是临时修改建议手动操作,这里演示默认 dev 模式) echo -e "${INFO} 请确保 ecosystem.config.js 已配置为生产模式启动 (npm start)" else # 开发模式 cd frontend npm install cd .. fi # 重启 PM2 pm2 delete all 2>/dev/null || true pm2 start ecosystem.config.js echo -e "${INFO} ==================================================" echo -e "${INFO} 部署成功!" echo -e "${INFO} 后端 API: http://localhost:8000" echo -e "${INFO} 前端 页面: http://localhost:3000" echo -e "${INFO} 使用 'pm2 list' 查看服务状态" echo -e "${INFO} 使用 'pm2 logs' 查看日志" echo -e "${INFO} =================================================="