100 lines
2.3 KiB
Bash
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 ""
|