deploy.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. # 检查项目目录是否存在
  13. if [ ! -d "$PROJECT_DIR" ]; then
  14. echo "📥 克隆项目..."
  15. if git clone -b main "$GIT_REPO_WITH_AUTH" "$PROJECT_DIR"; then
  16. echo "✅ 项目克隆成功"
  17. else
  18. echo "❌ 项目克隆失败"
  19. exit 1
  20. fi
  21. fi
  22. # 进入项目目录
  23. cd "$PROJECT_DIR"
  24. # 检查是否是 Git 仓库
  25. if [ ! -d ".git" ]; then
  26. echo "❌ 项目目录不是 Git 仓库"
  27. exit 1
  28. fi
  29. # 检查 package.json 是否存在
  30. if [ ! -f "package.json" ]; then
  31. echo "❌ package.json 文件不存在"
  32. exit 1
  33. fi
  34. # Git 操作函数
  35. handle_git_operations() {
  36. git remote set-url origin "$GIT_REPO_WITH_AUTH"
  37. # 修复 Git 权限问题
  38. git config --global --add safe.directory "$PROJECT_DIR"
  39. if git pull origin main; then
  40. echo "✅ 代码更新成功"
  41. echo "📝 当前提交: $(git log --oneline -1)"
  42. else
  43. echo "❌ Git 拉取失败"
  44. echo "是否继续部署(跳过代码拉取)?(y/N)"
  45. read -r response
  46. if [[ "$response" != "y" && "$response" != "Y" ]]; then
  47. echo "部署已取消"
  48. exit 1
  49. fi
  50. fi
  51. }
  52. handle_git_operations
  53. # 停止现有的 PM2 进程并清理配置
  54. echo "🛑 停止并清理 PM2 应用..."
  55. pm2 delete tweb-api 2>/dev/null || true
  56. pm2 save 2>/dev/null || true
  57. pm2 kill 2>/dev/null || true
  58. # 删除 package-lock.json 以避免包管理器冲突
  59. if [ -f "package-lock.json" ]; then
  60. echo "🗑️ 删除 package-lock.json 以避免包管理器冲突..."
  61. rm package-lock.json
  62. fi
  63. # 安装依赖
  64. echo "📦 安装依赖..."
  65. yarn install
  66. # 清理旧的构建文件
  67. rm -rf dist
  68. # 构建项目
  69. echo "🔨 构建项目..."
  70. yarn build
  71. # 检查构建是否成功
  72. if [ ! -f "dist/server.js" ]; then
  73. echo "❌ 构建失败: dist/server.js 文件不存在"
  74. exit 1
  75. fi
  76. echo "✅ 构建成功,文件存在: dist/server.js"
  77. # 显示关键文件内容用于调试
  78. echo "🔍 检查 database.ts 配置..."
  79. if [ -f "dist/config/database.js" ]; then
  80. echo "📄 dist/config/database.js 存在"
  81. grep -A 10 -B 5 "entities" dist/config/database.js || echo "未找到 entities 配置"
  82. else
  83. echo "❌ dist/config/database.js 不存在"
  84. fi
  85. # 替换配置文件
  86. cp .env.production dist/.env
  87. cp package.json dist/package.json
  88. # 设置环境变量
  89. export NODE_ENV=production
  90. # 检查 PM2 应用是否已存在并启动
  91. if pm2 list | grep -q "tweb-api"; then
  92. echo "🔄 重启现有的 PM2 应用..."
  93. pm2 delete tweb-api
  94. NODE_ENV=production pm2 start dist/server.js --name tweb-api
  95. else
  96. echo "🚀 启动新的 PM2 应用..."
  97. echo "📁 启动文件: $(pwd)/dist/server.js"
  98. NODE_ENV=production pm2 start dist/server.js --name tweb-api
  99. fi
  100. pm2 save
  101. echo "✅ 部署完成!"
  102. pm2 status
  103. echo "📋 显示日志(按 Ctrl+C 退出):"
  104. pm2 logs tweb-api