feat: 初始提交 v1.2.0 - 钢琴练习方案生成系统
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
#!/bin/bash
|
||||
# 钢琴练习方案系统 - 自动化部署脚本
|
||||
# 使用方法: ./deploy.sh <image-tar-path>
|
||||
|
||||
set -e # 任何命令失败就停止
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "用法: $0 <image-tar-path>"
|
||||
echo "示例: $0 /path/to/piano-plan.tar"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
IMAGE_TAR="$1"
|
||||
CONTAINER_NAME="piano-plan"
|
||||
BACKUP_DIR="/opt/piano-plan/backups"
|
||||
VOLUME_DATA="piano-plan-data"
|
||||
VOLUME_OUTPUT="piano-plan-output"
|
||||
|
||||
echo "=========================================="
|
||||
echo "钢琴练习方案系统 - 部署脚本"
|
||||
echo "=========================================="
|
||||
|
||||
# 1. 检查镜像文件是否存在
|
||||
if [ ! -f "$IMAGE_TAR" ]; then
|
||||
echo "错误: 镜像文件不存在: $IMAGE_TAR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2. 检查容器是否存在
|
||||
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||
echo "[2/7] 停止并删除旧容器..."
|
||||
docker stop $CONTAINER_NAME > /dev/null 2>&1 || true
|
||||
docker rm $CONTAINER_NAME > /dev/null 2>&1 || true
|
||||
else
|
||||
echo "[2/7] 容器不存在,跳过停止/删除"
|
||||
fi
|
||||
|
||||
# 3. 加载新镜像
|
||||
echo "[3/7] 加载镜像..."
|
||||
docker load -i "$IMAGE_TAR" > /dev/null
|
||||
echo "镜像加载完成"
|
||||
|
||||
# 4. 创建备份
|
||||
echo "[4/7] 备份数据库..."
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
docker cp ${CONTAINER_NAME}:/app/data/piano_plans.db ${BACKUP_DIR}/piano_plans.db.bak.${TIMESTAMP} 2>/dev/null || true
|
||||
echo "备份完成: ${BACKUP_DIR}/piano_plans.db.bak.${TIMESTAMP}"
|
||||
|
||||
# 5. 启动新容器(使用正确的挂载配置!)
|
||||
echo "[5/7] 启动新容器..."
|
||||
docker run -d \
|
||||
--name $CONTAINER_NAME \
|
||||
-p 5001:5001 \
|
||||
--restart unless-stopped \
|
||||
-e FLASK_ENV=production \
|
||||
-v /opt/piano-plan/个性化方案:/app/个性化方案 \
|
||||
-v ${VOLUME_DATA}:/app/data \
|
||||
-v ${VOLUME_OUTPUT}:/app/output \
|
||||
-v /opt/piano-plan/config:/app/config \
|
||||
piano-plan:latest
|
||||
|
||||
# 6. 等待容器启动
|
||||
echo "[6/7] 等待容器启动..."
|
||||
sleep 3
|
||||
|
||||
# 7. 验证
|
||||
echo "[7/7] 验证部署..."
|
||||
STATUS=$(docker ps --filter name=${CONTAINER_NAME} --format '{{.Status}}')
|
||||
if [[ "$STATUS" == *"Up"* ]]; then
|
||||
echo "✓ 容器状态: $STATUS"
|
||||
else
|
||||
echo "✗ 容器启动失败!"
|
||||
docker logs ${CONTAINER_NAME} --tail 10
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 验证问题文件
|
||||
PROBLEM_COUNT=$(docker exec $CONTAINER_NAME ls /app/个性化方案/*.md 2>/dev/null | wc -l)
|
||||
echo "✓ 问题文件数量: $PROBLEM_COUNT"
|
||||
|
||||
# 验证数据库
|
||||
DB_TABLES=$(docker exec $CONTAINER_NAME python -c "import sqlite3; conn=sqlite3.connect('/app/data/piano_plans.db'); print(len(conn.execute('SELECT name FROM sqlite_master WHERE type=\"table\"').fetchall()))" 2>/dev/null || echo "0")
|
||||
echo "✓ 数据库表数量: $DB_TABLES"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "部署完成!"
|
||||
echo "访问地址: https://piano.yoin.fun"
|
||||
echo "=========================================="
|
||||
Reference in New Issue
Block a user