136 lines
3.6 KiB
Bash
136 lines
3.6 KiB
Bash
#!/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 "🚀 部署成功!🎉" |