127 lines
4.0 KiB
Bash
Executable File
127 lines
4.0 KiB
Bash
Executable File
#!/bin/bash
|
||
# 甲辰藏品管理系统 v1.0.0 - 部署脚本
|
||
# 使用方式:./deploy.sh [版本号] [环境]
|
||
# 示例:./deploy.sh 1.0.0 production
|
||
|
||
set -e
|
||
|
||
VERSION=${1:-1.0.0}
|
||
ENV=${2:-test}
|
||
|
||
log_info() { echo "[INFO] $1"; }
|
||
log_error() { echo "[ERROR] $1" && exit 1; }
|
||
|
||
log_info "=== 甲辰藏品管理系统 v${VERSION} 部署开始 ==="
|
||
log_info "目标环境:$ENV"
|
||
|
||
# 获取脚本所在目录
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
||
|
||
cd "$PROJECT_ROOT"
|
||
|
||
# 1. 备份当前版本
|
||
log_info "[1/6] 备份当前版本..."
|
||
BACKUP_DIR="$PROJECT_ROOT/backups/v$VERSION-$(date +%Y%m%d_%H%M%S)"
|
||
mkdir -p "$BACKUP_DIR"
|
||
cp -r backend "$BACKUP_DIR/" 2>/dev/null || true
|
||
cp -r frontend "$BACKUP_DIR/" 2>/dev/null || true
|
||
cp -r static "$BACKUP_DIR/" 2>/dev/null || true
|
||
log_info "备份完成:$BACKUP_DIR"
|
||
|
||
# 2. Git 提交(如果有 Git 仓库)
|
||
log_info "[2/6] Git 提交..."
|
||
if [ -d ".git" ]; then
|
||
git add -A
|
||
git commit -m "release(v$VERSION): 部署新版本" 2>/dev/null || log_info "无更改需要提交"
|
||
git tag "v$VERSION" 2>/dev/null || true
|
||
log_info "Git 操作完成"
|
||
else
|
||
log_info "非 Git 仓库,跳过"
|
||
fi
|
||
|
||
# 3. 构建前端
|
||
log_info "[3/6] 构建前端..."
|
||
cd "$PROJECT_ROOT/frontend"
|
||
rm -rf dist
|
||
npm install
|
||
npm run build
|
||
log_info "前端构建完成"
|
||
|
||
# 检查 Logo 文件
|
||
log_info "[3.5/6] 检查 Logo 资源..."
|
||
if [ ! -f "$PROJECT_ROOT/static/images/jiachenlong-logo.png" ]; then
|
||
log_error "Logo 文件不存在:static/images/jiachenlong-logo.png"
|
||
fi
|
||
log_info "Logo 文件确认:jiachenlong-logo.png"
|
||
|
||
# 4. 安装后端依赖
|
||
log_info "[4/6] 安装后端依赖..."
|
||
cd "$PROJECT_ROOT/backend"
|
||
pip3 install -r requirements.txt
|
||
log_info "后端依赖安装完成"
|
||
|
||
# 5. 部署(根据环境选择)
|
||
log_info "[5/6] 部署到服务器..."
|
||
|
||
if [ "$ENV" == "local" ]; then
|
||
# 本地部署
|
||
DEPLOY_DIR="/var/www/jiachenlong"
|
||
mkdir -p "$DEPLOY_DIR/frontend"
|
||
cp -r "$PROJECT_ROOT/frontend/dist/"* "$DEPLOY_DIR/frontend/"
|
||
log_info "本地部署完成:$DEPLOY_DIR"
|
||
|
||
elif [ "$ENV" == "test" ]; then
|
||
# 测试服务器
|
||
SERVER="root@120.26.133.10"
|
||
DEST_DIR="/var/www/mobile"
|
||
|
||
# 部署前端构建文件
|
||
cd "$PROJECT_ROOT/frontend/dist"
|
||
tar -czf - . | ssh -o StrictHostKeyChecking=no "$SERVER" "cd $DEST_DIR && rm -rf dist/* && tar -xzf -"
|
||
|
||
# 部署静态资源(包含 Logo)
|
||
ssh -o StrictHostKeyChecking=no "$SERVER" "mkdir -p $DEST_DIR/static/images"
|
||
scp -o StrictHostKeyChecking=no "$PROJECT_ROOT/static/images/jiachenlong-logo.png" "$SERVER:$DEST_DIR/static/images/"
|
||
|
||
ssh -o StrictHostKeyChecking=no "$SERVER" "nginx -s reload"
|
||
log_info "测试环境部署完成:http://120.26.133.10/"
|
||
|
||
elif [ "$ENV" == "production" ]; then
|
||
# 生产服务器
|
||
SERVER="root@8.149.137.26"
|
||
DEST_DIR="/var/www/html"
|
||
|
||
# 部署前端构建文件
|
||
cd "$PROJECT_ROOT/frontend/dist"
|
||
tar -czf - . | ssh -o StrictHostKeyChecking=no "$SERVER" "cd $DEST_DIR && rm -rf * && tar -xzf -"
|
||
|
||
# 部署静态资源(包含 Logo)
|
||
ssh -o StrictHostKeyChecking=no "$SERVER" "mkdir -p $DEST_DIR/static/images"
|
||
scp -o StrictHostKeyChecking=no "$PROJECT_ROOT/static/images/jiachenlong-logo.png" "$SERVER:$DEST_DIR/static/images/"
|
||
|
||
ssh -o StrictHostKeyChecking=no "$SERVER" "nginx -s reload"
|
||
log_info "生产环境部署完成:http://$SERVER/"
|
||
|
||
else
|
||
log_error "未知环境:$ENV (支持:local, test, production)"
|
||
fi
|
||
|
||
# 6. 重启后端服务
|
||
log_info "[6/6] 重启后端服务..."
|
||
pkill -f "uvicorn app.main:app" || true
|
||
sleep 2
|
||
cd "$PROJECT_ROOT/backend"
|
||
nohup python3 -m uvicorn app.main:app --port 3000 --host 0.0.0.0 > /tmp/uvicorn.log 2>&1 &
|
||
sleep 2
|
||
|
||
if curl -s http://localhost:3000/health | grep -q "healthy"; then
|
||
log_info "后端服务启动成功"
|
||
else
|
||
log_error "后端服务启动失败,请检查日志:/tmp/uvicorn.log"
|
||
fi
|
||
|
||
log_info "=== 部署完成 ==="
|
||
log_info "版本:v$VERSION"
|
||
log_info "环境:$ENV"
|