#!/bin/bash # 🚀 前端 Docker 镜像部署脚本(后端运维使用) # ======================================== # 设置变量 VERSION=${1:-"1.0.0"} REMOTE_USER=${2:-"deploy"} REMOTE_HOST=${3:-"192.168.1.100"} REMOTE_PORT=${4:-"22"} LOCAL_IMAGE_FILE="deotaland-frontend-v${VERSION}.tar.gz" LOCAL_COMPOSE_FILE="docker-compose.prod.yml" LOCAL_CHECKLIST="deploy-checklist.md" REMOTE_DIR="/app/frontend" IMAGE_NAME="deotaland-frontend:v${VERSION}" echo "🚀 前端 Docker 镜像部署脚本" echo "=======================================" echo "📋 部署信息:" echo " 版本: v${VERSION}" echo " 远程主机: ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PORT}" echo " 远程目录: ${REMOTE_DIR}" echo " 镜像文件: ${LOCAL_IMAGE_FILE}" echo "" # 检查本地文件 if [ ! -f "${LOCAL_IMAGE_FILE}" ]; then echo "❌ 镜像文件 ${LOCAL_IMAGE_FILE} 不存在!" echo "请先运行 build-and-export.bat 构建镜像" exit 1 fi if [ ! -f "${LOCAL_COMPOSE_FILE}" ]; then echo "❌ docker-compose 文件 ${LOCAL_COMPOSE_FILE} 不存在!" exit 1 fi echo "✅ 本地文件检查通过" echo "" # 步骤1:创建远程目录 echo "📁 步骤1:创建远程目录..." ssh -p ${REMOTE_PORT} ${REMOTE_USER}@${REMOTE_HOST} "mkdir -p ${REMOTE_DIR}" if [ $? -ne 0 ]; then echo "❌ 创建远程目录失败!" exit 1 fi echo "✅ 远程目录创建成功" echo "" # 步骤2:上传文件 echo "📤 步骤2:上传文件到服务器..." echo "正在上传镜像文件(这可能需要几分钟)..." scp -P ${REMOTE_PORT} ${LOCAL_IMAGE_FILE} ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/ if [ $? -ne 0 ]; then echo "❌ 镜像文件上传失败!" exit 1 fi scp -P ${REMOTE_PORT} ${LOCAL_COMPOSE_FILE} ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/docker-compose.yml if [ $? -ne 0 ]; then echo "❌ docker-compose 文件上传失败!" exit 1 fi if [ -f "${LOCAL_CHECKLIST}" ]; then scp -P ${REMOTE_PORT} ${LOCAL_CHECKLIST} ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/ fi echo "✅ 文件上传成功" echo "" # 步骤3:在服务器上执行部署命令 echo "🔧 步骤3:在服务器上执行部署..." ssh -p ${REMOTE_PORT} ${REMOTE_USER}@${REMOTE_HOST} << EOF cd ${REMOTE_DIR} echo "📦 正在解压镜像文件..." gunzip -f ${LOCAL_IMAGE_FILE} echo "🐳 正在导入 Docker 镜像..." docker load -i deotaland-frontend-v${VERSION}.tar echo "📊 镜像导入成功,当前镜像列表:" docker images | grep deotaland-frontend echo "🛑 停止旧容器(如果存在)..." docker-compose down || true echo "🚀 启动新容器..." docker-compose up -d echo "⏳ 等待容器启动..." sleep 10 echo "🔍 检查容器状态:" docker-compose ps echo "🧪 健康检查:" curl -f http://localhost:3000 > /dev/null 2>&1 if [ \$? -eq 0 ]; then echo "✅ 应用健康检查通过!" else echo "⚠️ 应用健康检查失败,请检查日志:" docker-compose logs --tail=50 fi echo "📊 容器资源使用情况:" docker stats --no-stream \$(docker-compose ps -q) EOF if [ $? -ne 0 ]; then echo "❌ 服务器部署失败!" exit 1 fi echo "" echo "🎉 部署完成!" echo "=======================================" echo "📊 部署信息:" echo " 版本: v${VERSION}" echo " 远程主机: ${REMOTE_USER}@${REMOTE_HOST}" echo " 访问地址: http://${REMOTE_HOST}:3000" echo "" echo "🔍 验证步骤:" echo "1. 在浏览器访问: http://${REMOTE_HOST}:3000" echo "2. 检查容器状态: docker-compose ps" echo "3. 查看日志: docker-compose logs -f" echo "" echo "🚀 部署成功!🎉"