anxin-ruoyi/docker/scripts/diagnose-frontend.sh
2026-01-08 20:47:24 +08:00

283 lines
8.5 KiB
Bash

#!/bin/bash
# 前端服务诊断脚本
# 用于诊断前端服务启动问题
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查前端容器状态
check_frontend_container() {
log_info "检查前端容器状态..."
# 检查容器是否存在
if docker ps -a --filter "name=anxin-frontend-prod" --format "{{.Names}}" | grep -q "anxin-frontend-prod"; then
log_success "✓ 前端容器存在"
# 显示容器状态
echo "容器状态:"
docker ps -a --filter "name=anxin-frontend-prod" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# 检查容器是否正在运行
if docker ps --filter "name=anxin-frontend-prod" --format "{{.Names}}" | grep -q "anxin-frontend-prod"; then
log_success "✓ 前端容器正在运行"
else
log_error "✗ 前端容器已停止"
# 显示退出代码
local exit_code=$(docker inspect anxin-frontend-prod --format='{{.State.ExitCode}}' 2>/dev/null || echo "unknown")
log_info "退出代码: $exit_code"
fi
else
log_error "✗ 前端容器不存在"
return 1
fi
}
# 检查前端镜像
check_frontend_image() {
log_info "检查前端镜像..."
if docker images --filter "reference=anxin-frontend:prod" --format "{{.Repository}}:{{.Tag}}" | grep -q "anxin-frontend:prod"; then
log_success "✓ 前端镜像存在"
# 显示镜像信息
echo "镜像信息:"
docker images --filter "reference=anxin-frontend:prod" --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}"
else
log_error "✗ 前端镜像不存在"
log_info "需要构建前端镜像"
fi
}
# 检查前端依赖服务
check_frontend_dependencies() {
log_info "检查前端依赖服务..."
# 检查后端服务
if docker ps --filter "name=anxin-backend-prod" --format "{{.Names}}" | grep -q "anxin-backend-prod"; then
log_success "✓ 后端服务正在运行"
# 检查后端健康状态
local backend_health=$(docker inspect anxin-backend-prod --format='{{.State.Health.Status}}' 2>/dev/null || echo "unknown")
log_info "后端健康状态: $backend_health"
else
log_error "✗ 后端服务未运行"
fi
}
# 检查前端日志
check_frontend_logs() {
log_info "检查前端启动日志..."
if docker ps -a --filter "name=anxin-frontend-prod" --format "{{.Names}}" | grep -q "anxin-frontend-prod"; then
echo "最近的前端日志:"
echo "----------------------------------------"
docker logs anxin-frontend-prod --tail 50 2>&1 || echo "无法获取日志"
echo "----------------------------------------"
else
log_warn "前端容器不存在,无法查看日志"
fi
}
# 检查前端配置
check_frontend_config() {
log_info "检查前端配置..."
# 检查docker-compose配置
if [[ -f "docker-compose.production.yml" ]]; then
log_success "✓ 找到docker-compose配置文件"
# 显示前端服务配置
echo "前端服务配置:"
echo "----------------------------------------"
sed -n '/anxin-frontend:/,/^ [a-zA-Z]/p' docker-compose.production.yml | head -20
echo "----------------------------------------"
else
log_error "✗ 未找到docker-compose配置文件"
fi
# 检查nginx配置
if [[ -f "configs/nginx.conf.prod" ]]; then
log_success "✓ 找到nginx生产环境配置"
else
log_warn "未找到nginx生产环境配置文件"
fi
}
# 检查端口占用
check_port_usage() {
log_info "检查端口占用情况..."
if [[ -f "environments/.env.production" ]]; then
source environments/.env.production
local frontend_port=${FRONTEND_PORT:-80}
local ssl_port=${FRONTEND_SSL_PORT:-443}
# 检查HTTP端口
log_info "检查端口 $frontend_port..."
if netstat -tlnp 2>/dev/null | grep ":$frontend_port " || ss -tlnp 2>/dev/null | grep ":$frontend_port "; then
log_success "✓ 端口 $frontend_port 正在使用"
else
log_warn "端口 $frontend_port 未被使用"
fi
# 检查HTTPS端口
if [[ "$ssl_port" != "443" ]] || [[ "$frontend_port" != "80" ]]; then
log_info "检查端口 $ssl_port..."
if netstat -tlnp 2>/dev/null | grep ":$ssl_port " || ss -tlnp 2>/dev/null | grep ":$ssl_port "; then
log_success "✓ 端口 $ssl_port 正在使用"
else
log_warn "端口 $ssl_port 未被使用"
fi
fi
fi
}
# 检查前端文件
check_frontend_files() {
log_info "检查前端相关文件..."
# 检查Dockerfile
if [[ -f "frontend/Dockerfile" ]]; then
log_success "✓ 找到前端Dockerfile"
else
log_error "✗ 未找到前端Dockerfile"
fi
# 检查前端源码目录
if [[ -d "../RuoYi-Vue3" ]]; then
log_success "✓ 找到前端源码目录"
else
log_error "✗ 未找到前端源码目录"
fi
}
# 尝试手动启动前端服务
manual_start_frontend() {
log_info "尝试手动启动前端服务..."
# 停止现有容器
docker stop anxin-frontend-prod 2>/dev/null || true
docker rm anxin-frontend-prod 2>/dev/null || true
# 尝试启动前端服务
log_info "启动前端服务..."
if ./deploy.sh start frontend -e production; then
log_success "✓ 前端服务启动命令执行成功"
# 等待启动
sleep 10
# 检查启动结果
if docker ps --filter "name=anxin-frontend-prod" --format "{{.Names}}" | grep -q "anxin-frontend-prod"; then
log_success "✓ 前端服务启动成功"
else
log_error "✗ 前端服务启动失败"
fi
else
log_error "✗ 前端服务启动命令失败"
fi
}
# 显示修复建议
show_fix_suggestions() {
log_info "修复建议:"
echo "========================================"
echo "根据诊断结果,可能的解决方案:"
echo ""
echo "1. 如果前端镜像不存在:"
echo " ./build.sh build -c frontend -e production"
echo ""
echo "2. 如果容器启动失败:"
echo " ./deploy.sh logs frontend -e production"
echo " 检查具体错误信息"
echo ""
echo "3. 如果依赖服务未就绪:"
echo " ./deploy.sh restart backend -e production"
echo " 等待后端服务完全启动后再启动前端"
echo ""
echo "4. 如果端口冲突:"
echo " 检查environments/.env.production中的端口配置"
echo " 确保端口未被其他服务占用"
echo ""
echo "5. 如果配置文件缺失:"
echo " 检查configs/nginx.conf.prod是否存在"
echo " 检查frontend/Dockerfile是否存在"
echo ""
echo "6. 完全重新部署:"
echo " ./deploy.sh down -e production"
echo " ./deploy.sh up -e production"
echo "========================================"
}
# 主函数
main() {
local action=${1:-"diagnose"}
log_info "前端服务诊断工具"
echo "========================================"
case $action in
"diagnose")
check_frontend_container
echo ""
check_frontend_image
echo ""
check_frontend_dependencies
echo ""
check_frontend_config
echo ""
check_port_usage
echo ""
check_frontend_files
echo ""
check_frontend_logs
echo ""
show_fix_suggestions
;;
"start")
manual_start_frontend
;;
"logs")
check_frontend_logs
;;
*)
echo "用法: $0 [diagnose|start|logs]"
echo " diagnose - 诊断前端服务问题(默认)"
echo " start - 尝试手动启动前端服务"
echo " logs - 查看前端服务日志"
exit 1
;;
esac
echo "========================================"
log_success "操作完成!"
}
# 如果脚本被直接执行
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi