EternalAI/deploy/deploy.sh

100 lines
2.3 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
# ===== EternalAI 部署脚本 =====
# 每次部署时运行,拉取最新代码、安装依赖、迁移数据库、重启服务
# 用法: bash deploy/deploy.sh
# ---- 颜色输出 ----
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
info() { echo -e "${GREEN}[INFO]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
# ---- 配置 ----
APP_DIR="$(cd "$(dirname "$0")/.." && pwd)"
HEALTH_URL="http://localhost:3001"
HEALTH_TIMEOUT=30
cd "$APP_DIR"
info "应用目录: $APP_DIR"
# ---- 前置检查 ----
if [[ ! -f .env ]]; then
error ".env 文件不存在,请先运行 deploy/setup-server.sh"
exit 1
fi
if ! command -v pm2 &>/dev/null; then
error "PM2 未安装,请先运行 deploy/setup-server.sh"
exit 1
fi
# ---- 拉取最新代码 ----
info "拉取最新代码..."
git fetch --all
git reset --hard origin/master
info "当前版本: $(git rev-parse --short HEAD)"
# ---- 安装依赖 ----
info "安装 npm 依赖..."
npm install --production=false
# ---- 生成 Prisma Client ----
info "生成 Prisma Client..."
npx prisma generate
# ---- 数据库迁移 ----
info "推送数据库 Schema..."
npx prisma db push
# ---- 创建日志目录 ----
mkdir -p logs
# ---- 重启 PM2 进程 ----
info "重启 PM2 进程..."
if pm2 describe eternalai &>/dev/null; then
pm2 reload ecosystem.config.js --update-env
info "PM2 进程已 reload"
else
pm2 start ecosystem.config.js
info "PM2 进程已启动"
fi
pm2 save
# ---- 健康检查 ----
info "健康检查 (${HEALTH_TIMEOUT}s 超时)..."
ELAPSED=0
while [[ $ELAPSED -lt $HEALTH_TIMEOUT ]]; do
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$HEALTH_URL" 2>/dev/null || echo "000")
if [[ "$HTTP_CODE" == "200" ]]; then
info "健康检查通过 (HTTP $HTTP_CODE)"
break
fi
sleep 2
ELAPSED=$((ELAPSED + 2))
echo -n "."
done
echo ""
if [[ "$HTTP_CODE" != "200" ]]; then
error "健康检查失败 (HTTP $HTTP_CODE),请检查日志: pm2 logs eternalai"
exit 1
fi
# ---- 完成 ----
echo ""
info "============================================"
info " 部署完成!"
info "============================================"
echo ""
echo "版本: $(git rev-parse --short HEAD)"
echo "分支: $(git branch --show-current)"
echo "状态: pm2 status"
echo "日志: pm2 logs eternalai"
echo ""