QDAirPortBackend0122/deploy/deploy-all.sh
2026-01-22 13:19:47 +08:00

262 lines
8.7 KiB
Bash
Raw Permalink 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
# QAUP 一键部署脚本
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m'
print_message() {
echo -e "${1}${2}${NC}"
}
print_message $BLUE "=== QAUP 一键部署 ==="
# 环境检查
print_message $BLUE "1. 检查部署环境..."
# 检查操作系统
if [[ "$OSTYPE" != "linux-gnu"* ]]; then
print_message $YELLOW "⚠️ 建议在Linux环境中运行"
fi
# 检查必要文件
REQUIRED_FILES=("app.jar" "docker-compose.yml" "config.yml" "images.tar.gz")
for file in "${REQUIRED_FILES[@]}"; do
if [ ! -f "$file" ]; then
print_message $RED "❌ 缺失必要文件: $file"
print_message $BLUE "请确保所有文件都存在,或重新解压部署包"
exit 1
fi
done
print_message $GREEN "✓ 所有必要文件检查通过"
# 检查Docker
if ! command -v docker &> /dev/null; then
print_message $RED "❌ Docker 未安装"
print_message $BLUE "请安装 Docker: sudo apt install docker.io"
exit 1
fi
# 检查Docker服务
if ! sudo systemctl is-active --quiet docker; then
print_message $YELLOW "⚠️ Docker 服务未启动,正在启动..."
sudo systemctl start docker
sleep 5
fi
DOCKER_VERSION=$(docker --version)
print_message $GREEN "✓ Docker 版本: $DOCKER_VERSION"
# 检查Docker Compose
if ! docker compose version &> /dev/null && ! docker-compose version &> /dev/null; then
print_message $RED "❌ Docker Compose 未安装"
print_message $BLUE "请安装 Docker Compose: sudo apt install docker-compose"
exit 1
fi
print_message $GREEN "✓ Docker Compose 检查通过"
# 检查磁盘空间至少需要3GB
AVAILABLE_SPACE=$(df . | tail -1 | awk '{print $4}')
REQUIRED_SPACE=$((3 * 1024 * 1024)) # 3GB in KB
if [ "$AVAILABLE_SPACE" -lt "$REQUIRED_SPACE" ]; then
print_message $RED "❌ 磁盘空间不足"
print_message $BLUE "可用空间: $(($AVAILABLE_SPACE / 1024 / 1024))GB, 需要: 3GB"
exit 1
fi
print_message $GREEN "✓ 磁盘空间充足: $(($AVAILABLE_SPACE / 1024 / 1024))GB"
# 检查端口占用
PORTS=(8080 5432 6379)
print_message $BLUE "2. 检查端口占用..."
for port in "${PORTS[@]}"; do
if netstat -tuln 2>/dev/null | grep -q ":$port " || ss -tuln 2>/dev/null | grep -q ":$port "; then
print_message $YELLOW "⚠️ 端口 $port 已被占用"
print_message $BLUE "请停止占用该端口的服务或修改端口配置"
fi
done
print_message $GREEN "✓ 端口检查完成"
# 检查Docker镜像
print_message $BLUE "3. 检查Docker镜像..."
if [ -f "images.tar.gz" ]; then
print_message $BLUE "载入预构建镜像..."
if ! docker load -i images.tar.gz; then
print_message $RED "❌ 镜像载入失败"
exit 1
fi
print_message $GREEN "✓ 镜像载入成功"
else
print_message $YELLOW "⚠️ 未找到镜像包,将尝试在线拉取"
# 尝试拉取镜像
IMAGES=("m.daocloud.io/docker.io/postgis/postgis:17-3.5-alpine" \
"m.daocloud.io/docker.io/library/redis:8.0-alpine" \
"m.daocloud.io/docker.io/library/eclipse-temurin:21-jre")
for image in "${IMAGES[@]}"; do
if ! docker pull --platform linux/amd64 "$image"; then
print_message $RED "❌ 镜像拉取失败: $image"
exit 1
fi
done
print_message $GREEN "✓ 所有镜像拉取成功"
fi
# 停止可能存在的冲突容器
print_message $BLUE "4. 清理冲突容器..."
docker compose down 2>/dev/null || true
docker rm -f $(docker ps -aq --filter name=qaup) 2>/dev/null || true
print_message $GREEN "✓ 冲突容器清理完成"
# 创建数据目录
print_message $BLUE "5. 创建数据目录..."
mkdir -p data/postgres data/redis logs backup
# 设置目录权限
chmod 755 data logs backup
chmod 700 data/postgres data/redis
print_message $GREEN "✓ 数据目录创建完成"
# 验证配置文件
print_message $BLUE "6. 验证配置文件..."
# 检查docker-compose.yml语法
if ! docker compose config -q; then
print_message $RED "❌ docker-compose.yml 配置语法错误"
exit 1
fi
print_message $GREEN "✓ docker-compose.yml 语法正确"
# 检查应用配置文件
if ! grep -q "qaup:" config.yml; then
print_message $RED "❌ config.yml 配置不完整"
exit 1
fi
print_message $GREEN "✓ 应用配置文件正常"
# 启动基础设施服务
print_message $BLUE "7. 启动基础设施服务..."
docker compose up -d qaup-postgres qaup-redis
# 等待数据库启动
print_message $BLUE "等待数据库启动30秒..."
sleep 30
# 检查数据库状态
if docker exec qaup-postgres pg_isready -U qaup > /dev/null 2>&1; then
print_message $GREEN "✓ PostgreSQL 数据库启动成功"
else
print_message $RED "❌ PostgreSQL 启动失败"
print_message $BLUE "数据库日志:"
docker compose logs qaup-postgres
exit 1
fi
# 检查Redis状态
if docker exec qaup-redis redis-cli ping > /dev/null 2>&1; then
print_message $GREEN "✓ Redis 缓存服务启动成功"
else
print_message $RED "❌ Redis 启动失败"
print_message $BLUE "Redis日志:"
docker compose logs qaup-redis
exit 1
fi
# 启动应用服务
print_message $BLUE "8. 启动应用服务..."
docker compose up -d qaup-app
# 等待应用启动和数据库迁移
print_message $BLUE "9. 等待应用启动和数据库迁移..."
print_message $BLUE " 这可能需要2-3分钟请耐心等待..."
WAIT_TIME=0
HEALTH_URL="http://localhost:8080/actuator/health"
while [ $WAIT_TIME -lt 180 ]; do
sleep 10
WAIT_TIME=$((WAIT_TIME + 10))
# 检查应用健康状态
if curl -f -s "$HEALTH_URL" > /dev/null 2>&1; then
print_message $GREEN "✓ 应用启动成功!"
break
fi
# 显示等待进度
if [ $((WAIT_TIME % 30)) -eq 0 ]; then
print_message $BLUE " 已等待 ${WAIT_TIME} 秒..."
# 检查是否有迁移相关的日志
MIGRATION_LOGS=$(docker compose logs qaup-app 2>/dev/null | grep -i "flyway\|migration" | tail -3)
if [ -n "$MIGRATION_LOGS" ]; then
print_message $BLUE " 迁移进度:"
echo "$MIGRATION_LOGS" | while read line; do
print_message $BLUE " $line"
done
fi
fi
done
# 最终验证
print_message $BLUE "10. 最终验证..."
if curl -f -s "$HEALTH_URL" > /dev/null 2>&1; then
# 获取服务状态
APP_STATUS=$(docker compose ps qaup-app --format json | jq -r '.[0].State' 2>/dev/null || echo "unknown")
DB_STATUS=$(docker compose ps qaup-postgres --format json | jq -r '.[0].State' 2>/dev/null || echo "unknown")
REDIS_STATUS=$(docker compose ps qaup-redis --format json | jq -r '.[0].State' 2>/dev/null || echo "unknown")
print_message $GREEN "🎉 部署成功完成!"
echo ""
print_message $GREEN "📊 服务状态:"
print_message $BLUE " 应用服务: $APP_STATUS"
print_message $BLUE " 数据库: $DB_STATUS"
print_message $BLUE " 缓存服务: $REDIS_STATUS"
echo ""
print_message $BLUE "🌐 访问信息:"
print_message $BLUE " Web管理: http://localhost:8080"
print_message $BLUE " 健康检查: $HEALTH_URL"
print_message $BLUE " 数据库: localhost:5432 (qaup/qaup123)"
print_message $BLUE " Redis: localhost:6379"
echo ""
print_message $BLUE "👤 初始登录:"
print_message $BLUE " 用户名: admin"
print_message $BLUE " 密码: admin123"
echo ""
print_message $BLUE "📋 管理命令:"
print_message $BLUE " 查看状态: docker compose ps"
print_message $BLUE " 查看日志: docker compose logs -f qaup-app"
print_message $BLUE " 查看迁移: docker exec qaup-postgres psql -U qaup -d qaup -c \"SELECT version,description FROM flyway_schema_history ORDER BY installed_rank DESC LIMIT 5;\""
print_message $BLUE " 停止服务: docker compose down"
print_message $BLUE " 重启应用: docker compose restart qaup-app"
print_message $BLUE " 升级应用: ./deploy-update.sh"
echo ""
print_message $GREEN "🚀 QAUP 系统已就绪!"
else
print_message $RED "❌ 应用启动失败"
print_message $BLUE "请检查以下信息:"
echo ""
print_message $BLUE "📋 应用日志:"
docker compose logs --tail=50 qaup-app
echo ""
print_message $BLUE "📋 数据库日志:"
docker compose logs --tail=20 qaup-postgres
echo ""
print_message $BLUE "📋 容器状态:"
docker compose ps
echo ""
print_message $YELLOW "💡 可能的解决方案:"
print_message $BLUE "1. 检查端口是否被占用: netstat -tuln | grep ':8080'"
print_message $BLUE "2. 检查磁盘空间: df -h"
print_message $BLUE "3. 重启Docker服务: sudo systemctl restart docker"
print_message $BLUE "4. 清理Docker资源: docker system prune -a"
exit 1
fi