#!/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..." # 检查并安装 yarn check_and_install_yarn() { echo "🔍 检查 yarn 是否已安装..." if ! command -v yarn &> /dev/null; then echo "📦 yarn 未安装,开始安装..." if command -v npm &> /dev/null; then echo "使用 npm 安装 yarn..." npm install -g yarn else echo "❌ npm 也未安装,请先安装 Node.js 和 npm" exit 1 fi else echo "✅ yarn 已安装" fi } # 检查并安装 yarn check_and_install_yarn # 检查项目目录是否存在 if [ ! -d "$PROJECT_DIR" ]; then echo "📁 项目目录不存在,开始克隆..." # 克隆项目 echo "📥 克隆项目到 $PROJECT_DIR..." if git clone -b main "$GIT_REPO_WITH_AUTH" "$PROJECT_DIR"; then echo "✅ 项目克隆成功" else echo "❌ 项目克隆失败" echo "💡 请检查:" echo " 1. Git 仓库地址是否正确" echo " 2. 是否有访问权限" echo " 3. 网络连接是否正常" exit 1 fi else echo "✅ 项目目录已存在: $PROJECT_DIR" 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() { echo "📥 处理 Git 操作..." # 固定使用 main 分支 echo "当前分支: main" # 临时设置远程 URL 包含认证信息 echo "🔐 设置 Git 认证..." git remote set-url origin "$GIT_REPO_WITH_AUTH" # 尝试拉取最新代码 echo "🔄 拉取最新代码..." if git pull origin main; then echo "✅ Git 拉取成功" else echo "❌ Git 拉取失败,请检查网络连接和认证信息" echo "💡 提示:确保已配置 Git 认证(用户名密码或 SSH 密钥)" echo "是否继续部署(跳过代码拉取)?(y/N)" read -r response if [[ ! "$response" =~ ^[Yy]$ ]]; then echo "部署已取消" exit 1 fi echo "⚠️ 继续部署,使用当前代码..." fi } # 执行 Git 操作 handle_git_operations # 停止现有的 PM2 进程(如果存在) echo "📦 停止现有的 PM2 进程..." pm2 delete tweb-api 2>/dev/null || echo "没有找到现有的 tweb-api 进程" # 安装依赖(如果需要) echo "📦 检查并安装依赖..." yarn install # 清理旧的构建文件 echo "🧹 清理旧的构建文件..." rm -rf dist # 构建项目 echo "🔨 构建项目..." yarn build # 检查构建是否成功 if [ ! -f "dist/app.js" ]; then echo "❌ 构建失败:dist/app.js 文件不存在" exit 1 fi # 启动 PM2 echo "🚀 启动 PM2..." pm2 start dist/app.js --name tweb-api # 保存 PM2 配置 echo "💾 保存 PM2 配置..." pm2 save # 显示状态 echo "📊 PM2 状态:" pm2 status echo "✅ 完整部署完成!" echo "📁 项目路径: $PROJECT_DIR" echo "📝 查看日志:pm2 logs tweb-api" echo "🔄 重启服务:pm2 restart tweb-api" echo "⏹️ 停止服务:pm2 stop tweb-api" # 自动展示日志 echo "" echo "📋 持续显示日志(按 Ctrl+C 退出):" pm2 logs tweb-api