deotalandAi/apps/frontend/deploy-scripts/deploy-to-server.sh

136 lines
3.6 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "🚀 部署成功!🎉"