#!/bin/bash # ===================================================== # Fzx平台 - 阿里云开发环境部署验证脚本 # 说明:验证所有服务是否正常启动并可访问 # 用途:部署后健康检查 # 创建时间: 2026-06-25 # ===================================================== set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 配置 COMPOSE_FILE="/opt/Fzxpodman/infrastructure/compose/podman-compose.aliyun-dev.yml" BASE_URL="http://api.fengzhongxing.com" JENKINS_URL="http://jenkins.fengzhongxing.com" # 服务健康检查配置 declare -A SERVICES=( ["registry"]="http://localhost:5000/v2/_catalog" ["mariadb"]="mysqladmin ping -h localhost -u fzx_app_dev -p'fzx@2026!db_dev'" ["redis"]="redis-cli -a \"\${REDIS_PASSWORD:-}\" ping" ["nacos"]="http://localhost:8848/nacos/v1/console/health/readiness" ["api-gateway"]="${BASE_URL}/actuator/health" ["auth-service"]="http://localhost:8082/actuator/health" ["user-service"]="http://localhost:8095/actuator/health" ["order-service"]="http://localhost:8086/actuator/health" ["merchant-service"]="http://localhost:8093/actuator/health" ["platform-service"]="http://localhost:8091/actuator/health" ["product-service"]="http://localhost:8087/actuator/health" ["rider-service"]="http://localhost:8088/actuator/health" ["map-service"]="http://localhost:8089/actuator/health" ["upload-service"]="http://localhost:8092/actuator/health" ["marketing-service"]="http://localhost:8090/actuator/health" ["nginx"]="http://nginx.test/health" ["jenkins"]="${JENKINS_URL}/login" ) # 统计变量 TOTAL_SERVICES=0 HEALTHY_SERVICES=0 UNHEALTHY_SERVICES=0 echo -e "${BLUE}========================================${NC}" echo -e "${BLUE}Fzx平台 - 阿里云开发环境健康检查${NC}" echo -e "${BLUE}========================================${NC}" echo "" # 检查 Podman Compose 文件是否存在 if [ ! -f "$COMPOSE_FILE" ]; then echo -e "${RED}错误: 找不到 compose 文件: $COMPOSE_FILE${NC}" exit 1 fi # 检查容器状态 echo -e "${YELLOW}1. 检查容器状态...${NC}" cd /opt/Fzxpodman/infrastructure/compose podman-compose -f "$COMPOSE_FILE" ps echo "" echo -e "${YELLOW}2. 检查服务健康状态...${NC}" for service in "${!SERVICES[@]}"; do TOTAL_SERVICES=$((TOTAL_SERVICES + 1)) url="${SERVICES[$service]}" echo -n " - 检查 ${service}..." # 获取容器名称(如果有) container_name=$(podman ps --filter "name=fzx-aliyun-${service}" --format "{{.Names}}" | head -1) if [ -z "$container_name" ]; then echo -e " ${RED}[容器不存在]${NC}" UNHEALTHY_SERVICES=$((UNHEALTHY_SERVICES + 1)) continue fi # 检查容器状态 container_status=$(podman inspect "$container_name" --format '{{.State.Status}}') health_status=$(podman inspect "$container_name" --format '{{.State.Health.Status}}' 2>/dev/null || echo "none") if [ "$container_status" != "running" ]; then echo -e " ${RED}[容器状态: $container_status]${NC}" UNHEALTHY_SERVICES=$((UNHEALTHY_SERVICES + 1)) continue fi # 如果有健康检查,检查健康状态 if [ "$health_status" != "none" ] && [ "$health_status" != "healthy" ]; then echo -e " ${YELLOW}[健康状态: $health_status]${NC}" # 不立即判定为不健康,可能是启动中 fi # 执行健康检查 if [[ "$url" =~ ^http ]]; then # HTTP 检查 http_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "$url" || echo "000") if [ "$http_code" = "200" ] || [ "$http_code" = "302" ] || [ "$http_code" = "401" ]; then echo -e " ${GREEN}[健康] (HTTP $http_code)${NC}" HEALTHY_SERVICES=$((HEALTHY_SERVICES + 1)) else echo -e " ${RED}[不健康] (HTTP $http_code)${NC}" UNHEALTHY_SERVICES=$((UNHEALTHY_SERVICES + 1)) fi elif [[ "$url" =~ ^mysqladmin ]]; then # MySQL 检查 if podman exec fzx-aliyun-mariadb $url > /dev/null 2>&1; then echo -e " ${GREEN}[健康]${NC}" HEALTHY_SERVICES=$((HEALTHY_SERVICES + 1)) else echo -e " ${RED}[不健康]${NC}" UNHEALTHY_SERVICES=$((UNHEALTHY_SERVICES + 1)) fi elif [[ "$url" =~ ^redis-cli ]]; then # Redis 检查 response=$(podman exec fzx-aliyun-redis $url 2>/dev/null || echo "error") if [ "$response" = "PONG" ]; then echo -e " ${GREEN}[健康]${NC}" HEALTHY_SERVICES=$((HEALTHY_SERVICES + 1)) else echo -e " ${RED}[不健康]${NC}" UNHEALTHY_SERVICES=$((UNHEALTHY_SERVICES + 1)) fi fi done echo "" echo -e "${YELLOW}3. 检查网络连通性...${NC}" # 检查数据库连接 echo -n " - 检查 MariaDB 连接..." if podman exec fzx-aliyun-mariadb mysqladmin ping -h localhost -u fzx_app_dev -p'fzx@2026!db_dev' > /dev/null 2>&1; then echo -e " ${GREEN}[正常]${NC}" else echo -e " ${RED}[失败]${NC}" fi # 检查 Redis 连接 echo -n " - 检查 Redis 连接..." if podman exec fzx-aliyun-redis redis-cli -a "${REDIS_PASSWORD:-}" ping | grep -q PONG; then echo -e " ${GREEN}[正常]${NC}" else echo -e " ${RED}[失败]${NC}" fi # 检查 Nacos 连接 echo -n " - 检查 Nacos 连接..." if curl -s -f "http://localhost:8848/nacos/v1/console/health/readiness" > /dev/null 2>&1; then echo -e " ${GREEN}[正常]${NC}" else echo -e " ${RED}[失败]${NC}" fi echo "" echo -e "${BLUE}========================================${NC}" echo -e "${BLUE}健康检查统计${NC}" echo -e "${BLUE}========================================${NC}" echo -e "总服务数: ${TOTAL_SERVICES}" echo -e "${GREEN}健康服务: ${HEALTHY_SERVICES}${NC}" echo -e "${RED}不健康服务: ${UNHEALTHY_SERVICES}${NC}" echo "" # 检查资源使用 echo -e "${YELLOW}4. 资源使用情况...${NC}" podman stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" | head -15 echo "" echo -e "${BLUE}========================================${NC}" echo -e "${BLUE}检查完成${NC}" echo -e "${BLUE}========================================${NC}" # 根据健康服务数量设置退出码 if [ $HEALTHY_SERVICES -eq $TOTAL_SERVICES ]; then echo -e "${GREEN}所有服务运行正常!${NC}" exit 0 elif [ $HEALTHY_SERVICES -gt $((TOTAL_SERVICES / 2)) ]; then echo -e "${YELLOW}部分服务异常,请检查日志${NC}" exit 1 else echo -e "${RED}大量服务异常,请立即处理!${NC}" exit 2 fi