deploy.sh 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #!/bin/bash
  2. # 设置错误时退出
  3. set -e
  4. # 配置变量
  5. PROJECT_NAME="tweb-api"
  6. PROJECT_DIR="/var/www/$PROJECT_NAME"
  7. username="wuyi"
  8. password="hXE8ZjQ^Q46V7n"
  9. GIT_REPO="https://git.izouma.com/wuyi/tweb-api.git"
  10. GIT_REPO_WITH_AUTH="https://${username}:${password}@git.izouma.com/wuyi/tweb-api.git"
  11. echo "🚀 开始完整部署 $PROJECT_NAME..."
  12. # 检查并安装 yarn
  13. check_and_install_yarn() {
  14. echo "🔍 检查 yarn 是否已安装..."
  15. if ! command -v yarn &> /dev/null; then
  16. echo "📦 yarn 未安装,开始安装..."
  17. if command -v npm &> /dev/null; then
  18. echo "使用 npm 安装 yarn..."
  19. npm install -g yarn
  20. else
  21. echo "❌ npm 也未安装,请先安装 Node.js 和 npm"
  22. exit 1
  23. fi
  24. else
  25. echo "✅ yarn 已安装"
  26. fi
  27. }
  28. # 检查并安装 yarn
  29. check_and_install_yarn
  30. # 检查项目目录是否存在
  31. if [ ! -d "$PROJECT_DIR" ]; then
  32. echo "📁 项目目录不存在,开始克隆..."
  33. # 克隆项目
  34. echo "📥 克隆项目到 $PROJECT_DIR..."
  35. if git clone -b main "$GIT_REPO_WITH_AUTH" "$PROJECT_DIR"; then
  36. echo "✅ 项目克隆成功"
  37. else
  38. echo "❌ 项目克隆失败"
  39. echo "💡 请检查:"
  40. echo " 1. Git 仓库地址是否正确"
  41. echo " 2. 是否有访问权限"
  42. echo " 3. 网络连接是否正常"
  43. exit 1
  44. fi
  45. else
  46. echo "✅ 项目目录已存在: $PROJECT_DIR"
  47. fi
  48. # 进入项目目录
  49. cd "$PROJECT_DIR"
  50. # 检查是否是 Git 仓库
  51. if [ ! -d ".git" ]; then
  52. echo "❌ 错误:项目目录不是 Git 仓库"
  53. exit 1
  54. fi
  55. # 检查 package.json 是否存在
  56. if [ ! -f "package.json" ]; then
  57. echo "❌ 错误:package.json 文件不存在"
  58. exit 1
  59. fi
  60. # Git 操作函数
  61. handle_git_operations() {
  62. echo "📥 处理 Git 操作..."
  63. # 固定使用 main 分支
  64. echo "当前分支: main"
  65. # 临时设置远程 URL 包含认证信息
  66. echo "🔐 设置 Git 认证..."
  67. git remote set-url origin "$GIT_REPO_WITH_AUTH"
  68. # 尝试拉取最新代码
  69. echo "🔄 拉取最新代码..."
  70. if git pull origin main; then
  71. echo "✅ Git 拉取成功"
  72. else
  73. echo "❌ Git 拉取失败,请检查网络连接和认证信息"
  74. echo "💡 提示:确保已配置 Git 认证(用户名密码或 SSH 密钥)"
  75. echo "是否继续部署(跳过代码拉取)?(y/N)"
  76. read -r response
  77. if [[ ! "$response" =~ ^[Yy]$ ]]; then
  78. echo "部署已取消"
  79. exit 1
  80. fi
  81. echo "⚠️ 继续部署,使用当前代码..."
  82. fi
  83. }
  84. # 执行 Git 操作
  85. handle_git_operations
  86. # 停止现有的 PM2 进程(如果存在)
  87. echo "📦 停止现有的 PM2 进程..."
  88. pm2 delete tweb-api 2>/dev/null || echo "没有找到现有的 tweb-api 进程"
  89. # 安装依赖(如果需要)
  90. echo "📦 检查并安装依赖..."
  91. yarn install
  92. # 清理旧的构建文件
  93. echo "🧹 清理旧的构建文件..."
  94. rm -rf dist
  95. # 构建项目
  96. echo "🔨 构建项目..."
  97. yarn build
  98. # 检查构建是否成功
  99. if [ ! -f "dist/app.js" ]; then
  100. echo "❌ 构建失败:dist/app.js 文件不存在"
  101. exit 1
  102. fi
  103. # 启动 PM2
  104. echo "🚀 启动 PM2..."
  105. pm2 start dist/app.js --name tweb-api
  106. # 保存 PM2 配置
  107. echo "💾 保存 PM2 配置..."
  108. pm2 save
  109. # 显示状态
  110. echo "📊 PM2 状态:"
  111. pm2 status
  112. echo "✅ 完整部署完成!"
  113. echo "📁 项目路径: $PROJECT_DIR"
  114. echo "📝 查看日志:pm2 logs tweb-api"
  115. echo "🔄 重启服务:pm2 restart tweb-api"
  116. echo "⏹️ 停止服务:pm2 stop tweb-api"
  117. # 自动展示日志
  118. echo ""
  119. echo "📋 持续显示日志(按 Ctrl+C 退出):"
  120. pm2 logs tweb-api