102 lines
2.6 KiB
Bash
102 lines
2.6 KiB
Bash
#!/bin/bash
|
||
set -e
|
||
|
||
cd PROJECT_PATH_PLACEHOLDER
|
||
|
||
echo "========================================"
|
||
echo "开始部署..."
|
||
echo "========================================"
|
||
|
||
# 备份重要数据
|
||
echo "[1/6] 备份数据..."
|
||
if [ -d "uploads" ]; then
|
||
mkdir -p backups
|
||
backup_dir="backups/uploads-$(date +%Y%m%d-%H%M%S)"
|
||
cp -r uploads "$backup_dir" 2>/dev/null || true
|
||
echo " ✓ 上传目录已备份到 $backup_dir"
|
||
fi
|
||
|
||
# 检查 Docker 和 Docker Compose
|
||
echo "[2/6] 检查环境..."
|
||
if ! command -v docker > /dev/null 2>&1; then
|
||
echo "错误: Docker 未安装" >&2
|
||
exit 1
|
||
fi
|
||
|
||
# 使用 docker compose 或 docker-compose
|
||
if docker compose version > /dev/null 2>&1; then
|
||
DOCKER_COMPOSE="docker compose"
|
||
elif docker-compose version > /dev/null 2>&1; then
|
||
DOCKER_COMPOSE="docker-compose"
|
||
else
|
||
echo "错误: Docker Compose 未安装" >&2
|
||
exit 1
|
||
fi
|
||
|
||
echo " ✓ 使用: $DOCKER_COMPOSE"
|
||
|
||
# 停止旧容器(优雅停止)
|
||
echo "[3/6] 停止旧容器..."
|
||
$DOCKER_COMPOSE down --timeout 30 2>/dev/null || true
|
||
echo " ✓ 旧容器已停止"
|
||
|
||
# 构建新镜像(使用缓存,除非指定 --no-cache)
|
||
echo "[4/6] 构建 Docker 镜像..."
|
||
BUILD_FLAG_PLACEHOLDER
|
||
if [ -n "$BUILD_FLAG" ]; then
|
||
echo " ⚠ 使用 --no-cache 模式(构建时间较长)"
|
||
$DOCKER_COMPOSE build $BUILD_FLAG app && $DOCKER_COMPOSE up -d app
|
||
else
|
||
echo " ✓ 使用智能构建缓存(推荐)"
|
||
$DOCKER_COMPOSE up -d --build app
|
||
fi
|
||
|
||
if [ $? -ne 0 ]; then
|
||
echo "错误: 容器构建或启动失败" >&2
|
||
exit 1
|
||
fi
|
||
echo " ✓ 容器构建并启动完成"
|
||
|
||
# 等待容器就绪
|
||
echo " ⏳ 等待容器就绪..."
|
||
sleep 10
|
||
|
||
# 检查容器状态
|
||
max_attempts=30
|
||
attempt=0
|
||
while [ $attempt -lt $max_attempts ]; do
|
||
if $DOCKER_COMPOSE ps app | grep -q "Up"; then
|
||
echo " ✓ 容器运行中"
|
||
break
|
||
fi
|
||
attempt=$((attempt + 1))
|
||
sleep 2
|
||
done
|
||
|
||
if [ $attempt -eq $max_attempts ]; then
|
||
echo " ⚠ 警告: 容器可能未正常启动,请检查日志"
|
||
fi
|
||
|
||
# 执行数据库迁移(如果需要)
|
||
echo "[6/6] 检查数据库迁移..."
|
||
if [ -f prisma/schema.prisma ]; then
|
||
$DOCKER_COMPOSE exec -T app npx prisma db push --accept-data-loss --schema=/app/prisma/schema.prisma 2>/dev/null || echo " ⚠ 数据库迁移跳过或已完成"
|
||
fi
|
||
|
||
# 显示部署结果
|
||
echo ""
|
||
echo "========================================"
|
||
echo "部署完成!"
|
||
echo "========================================"
|
||
echo ""
|
||
echo "容器状态:"
|
||
$DOCKER_COMPOSE ps
|
||
echo ""
|
||
echo "应用日志(最后 30 行):"
|
||
$DOCKER_COMPOSE logs app --tail=30
|
||
echo ""
|
||
echo "如需查看完整日志,请运行:"
|
||
echo " $DOCKER_COMPOSE logs -f app"
|
||
echo ""
|
||
|