#!/bin/bash # 钢琴练习方案系统 - 自动化部署脚本 # 使用方法: ./deploy.sh set -e # 任何命令失败就停止 if [ -z "$1" ]; then echo "用法: $0 " 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 "=========================================="