#!/bin/bash # 部署脚本 - 将构建好的 course-web 前端项目上传到服务器 # 支持版本管理和回滚 # 使用方法: ./deploy.sh [deploy|rollback] SERVER_IP="101.200.208.45" USERNAME="root" REMOTE_ROOT="/data/www" APP_NAME="course-of-life" DEPLOY_ROOT="${REMOTE_ROOT}/${APP_NAME}-releases" SYMLINK_PATH="${REMOTE_ROOT}/${APP_NAME}" TIMESTAMP=$(date +%Y%m%d%H%M%S) RELEASE_PATH="${DEPLOY_ROOT}/${TIMESTAMP}" function deploy() { echo "🚀 开始部署 ${APP_NAME} 到服务器..." # 1. 环境检查 if ! command -v npm &> /dev/null; then echo "❌ 错误: 未找到npm命令" exit 1 fi # 2. 项目构建 echo "🧹 清理旧构建..." rm -rf dist echo "📦 开始构建..." if ! npm run build; then echo "❌ 构建失败" exit 1 fi if [ ! -d "dist" ]; then echo "❌ 错误: dist目录不存在" exit 1 fi # 3. 准备远程目录 echo "📁 准备远程目录: ${RELEASE_PATH}" ssh "${USERNAME}@${SERVER_IP}" "mkdir -p ${RELEASE_PATH}" || { echo "❌ 无法创建远程目录" exit 1 } # 4. 上传文件 echo "📤 上传文件..." if scp -r dist/* "${USERNAME}@${SERVER_IP}:${RELEASE_PATH}/"; then echo "✅ 文件上传成功" else echo "❌ 文件上传失败" # 清理失败的发布目录 ssh "${USERNAME}@${SERVER_IP}" "rm -rf ${RELEASE_PATH}" exit 1 fi # 5. 切换版本 (原子操作) echo "🔄 切换当前版本..." # ln -sfn: force update symlink ssh "${USERNAME}@${SERVER_IP}" "ln -sfn ${RELEASE_PATH} ${SYMLINK_PATH}" || { echo "❌ 版本切换失败" exit 1 } # 6. 权限修正 ssh "${USERNAME}@${SERVER_IP}" "chmod -R 755 ${RELEASE_PATH}" # 7. 清理旧版本 (保留最近5个) echo "🧹 清理旧版本..." ssh "${USERNAME}@${SERVER_IP}" "cd ${DEPLOY_ROOT} && ls -t | tail -n +6 | xargs -I {} rm -rf {}" echo "✅ 部署完成!" echo "🌍 访问地址: http://${SERVER_IP}/${APP_NAME}/" } function rollback() { echo "Reverting to previous version..." # 获取倒数第二个版本目录 PREV_VERSION=$(ssh "${USERNAME}@${SERVER_IP}" "cd ${DEPLOY_ROOT} && ls -t | head -n 2 | tail -n 1") if [ -z "$PREV_VERSION" ]; then echo "❌ 没有可回滚的版本" exit 1 fi echo "🔄 回滚到版本: ${PREV_VERSION}" ssh "${USERNAME}@${SERVER_IP}" "ln -sfn ${DEPLOY_ROOT}/${PREV_VERSION} ${SYMLINK_PATH}" && \ echo "✅ 回滚成功" || echo "❌ 回滚失败" } # 主逻辑 case "$1" in rollback) rollback ;; *) deploy ;; esac