#!/bin/bash # 设置错误时退出 set -e # 配置变量 PROJECT_NAME="tweb-api" PROJECT_DIR="/var/www/$PROJECT_NAME" username="wuyi" password="hXE8ZjQ^Q46V7n" GIT_REPO="https://git.izouma.com/wuyi/tweb-api.git" GIT_REPO_WITH_AUTH="https://${username}:${password}@git.izouma.com/wuyi/tweb-api.git" echo "🚀 开始部署 $PROJECT_NAME..." # 检查项目目录是否存在 if [ ! -d "$PROJECT_DIR" ]; then echo "📥 克隆项目..." if git clone -b main "$GIT_REPO_WITH_AUTH" "$PROJECT_DIR"; then echo "✅ 项目克隆成功" else echo "❌ 项目克隆失败" exit 1 fi fi # 进入项目目录 cd "$PROJECT_DIR" # 检查是否是 Git 仓库 if [ ! -d ".git" ]; then echo "❌ 项目目录不是 Git 仓库" exit 1 fi # 检查 package.json 是否存在 if [ ! -f "package.json" ]; then echo "❌ package.json 文件不存在" exit 1 fi # Git 操作函数 handle_git_operations() { git remote set-url origin "$GIT_REPO_WITH_AUTH" # 修复 Git 权限问题 git config --global --add safe.directory "$PROJECT_DIR" if git pull origin main; then echo "✅ 代码更新成功" else echo "❌ Git 拉取失败" echo "是否继续部署(跳过代码拉取)?(y/N)" read -r response if [[ "$response" != "y" && "$response" != "Y" ]]; then echo "部署已取消" exit 1 fi fi } handle_git_operations # 停止现有的 PM2 进程并清理配置 echo "🛑 停止并清理 PM2 应用..." pm2 delete tweb-api 2>/dev/null || true pm2 save 2>/dev/null || true pm2 kill 2>/dev/null || true # 删除 package-lock.json 以避免包管理器冲突 if [ -f "package-lock.json" ]; then echo "🗑️ 删除 package-lock.json 以避免包管理器冲突..." rm package-lock.json fi # 安装依赖 echo "📦 安装依赖..." yarn install # 清理旧的构建文件 rm -rf dist # 构建项目 echo "🔨 构建项目..." yarn build # 检查构建是否成功 if [ ! -f "dist/server.js" ]; then echo "❌ 构建失败: dist/server.js 文件不存在" exit 1 fi echo "✅ 构建成功,文件存在: dist/server.js" # 替换配置文件 cp .env.production dist/.env cp package.json dist/package.json # 检查 PM2 应用是否已存在并启动 if pm2 list | grep -q "tweb-api"; then echo "🔄 重启现有的 PM2 应用..." pm2 delete tweb-api pm2 start dist/server.js --name tweb-api else echo "🚀 启动新的 PM2 应用..." echo "📁 启动文件: $(pwd)/dist/server.js" pm2 start dist/server.js --name tweb-api fi pm2 save echo "✅ 部署完成!" pm2 status echo "📋 显示日志(按 Ctrl+C 退出):" pm2 logs tweb-api