- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
224 lines
6.3 KiB
Bash
Executable File
224 lines
6.3 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# 配置一致性检查脚本
|
||
# 用于快速验证系统各组件配置是否一致
|
||
|
||
echo "🔧 配置一致性检查脚本"
|
||
echo "========================"
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 检查结果统计
|
||
PASS_COUNT=0
|
||
FAIL_COUNT=0
|
||
|
||
# 检查函数
|
||
check_service() {
|
||
local service_name=$1
|
||
local url=$2
|
||
local expected_response=$3
|
||
|
||
echo -n "检查 $service_name ... "
|
||
|
||
if command -v curl >/dev/null 2>&1; then
|
||
response=$(curl -s --connect-timeout 5 "$url" 2>/dev/null)
|
||
if [[ $? -eq 0 && "$response" == *"$expected_response"* ]]; then
|
||
echo -e "${GREEN}✅ 通过${NC}"
|
||
((PASS_COUNT++))
|
||
else
|
||
echo -e "${RED}❌ 失败${NC}"
|
||
echo " 期望包含: $expected_response"
|
||
echo " 实际响应: $response"
|
||
((FAIL_COUNT++))
|
||
fi
|
||
else
|
||
echo -e "${YELLOW}⚠️ 跳过 (curl 未安装)${NC}"
|
||
fi
|
||
}
|
||
|
||
# 检查Docker服务
|
||
check_docker_service() {
|
||
local service_name=$1
|
||
echo -n "检查 Docker 服务 $service_name ... "
|
||
|
||
if command -v docker-compose >/dev/null 2>&1; then
|
||
if docker-compose ps | grep -q "$service_name.*Up"; then
|
||
echo -e "${GREEN}✅ 运行中${NC}"
|
||
((PASS_COUNT++))
|
||
else
|
||
echo -e "${RED}❌ 未运行${NC}"
|
||
((FAIL_COUNT++))
|
||
fi
|
||
else
|
||
echo -e "${YELLOW}⚠️ 跳过 (docker-compose 未安装)${NC}"
|
||
fi
|
||
}
|
||
|
||
# 检查配置文件
|
||
check_config_file() {
|
||
local file_path=$1
|
||
local description=$2
|
||
|
||
echo -n "检查 $description ... "
|
||
|
||
if [[ -f "$file_path" ]]; then
|
||
echo -e "${GREEN}✅ 存在${NC}"
|
||
((PASS_COUNT++))
|
||
else
|
||
echo -e "${RED}❌ 缺失${NC}"
|
||
echo " 文件路径: $file_path"
|
||
((FAIL_COUNT++))
|
||
fi
|
||
}
|
||
|
||
# 检查端口占用
|
||
check_port() {
|
||
local port=$1
|
||
local service_name=$2
|
||
|
||
echo -n "检查端口 $port ($service_name) ... "
|
||
|
||
if command -v lsof >/dev/null 2>&1; then
|
||
if lsof -i :$port >/dev/null 2>&1; then
|
||
echo -e "${GREEN}✅ 已占用${NC}"
|
||
((PASS_COUNT++))
|
||
else
|
||
echo -e "${RED}❌ 未占用${NC}"
|
||
((FAIL_COUNT++))
|
||
fi
|
||
elif command -v netstat >/dev/null 2>&1; then
|
||
if netstat -an | grep -q ":$port "; then
|
||
echo -e "${GREEN}✅ 已占用${NC}"
|
||
((PASS_COUNT++))
|
||
else
|
||
echo -e "${RED}❌ 未占用${NC}"
|
||
((FAIL_COUNT++))
|
||
fi
|
||
else
|
||
echo -e "${YELLOW}⚠️ 跳过 (lsof/netstat 未安装)${NC}"
|
||
fi
|
||
}
|
||
|
||
echo "1. 检查基础服务状态"
|
||
echo "-------------------"
|
||
|
||
# 检查Docker服务
|
||
check_docker_service "mysql"
|
||
check_docker_service "redis"
|
||
|
||
# 检查端口占用
|
||
check_port 3306 "MySQL"
|
||
check_port 6379 "Redis"
|
||
check_port 8000 "后端API"
|
||
check_port 3001 "前端开发服务器"
|
||
|
||
echo ""
|
||
echo "2. 检查服务健康状态"
|
||
echo "-------------------"
|
||
|
||
# 检查后端健康状态
|
||
check_service "后端API健康检查" "http://localhost:8000/health" "healthy"
|
||
|
||
# 检查前端服务
|
||
check_service "前端服务" "http://localhost:3001" "考培练系统"
|
||
|
||
echo ""
|
||
echo "3. 检查配置文件"
|
||
echo "---------------"
|
||
|
||
# 检查关键配置文件
|
||
check_config_file "kaopeilian-backend/app/config/settings.py" "后端配置文件"
|
||
check_config_file "kaopeilian-frontend/src/api/config.ts" "前端API配置"
|
||
check_config_file "docker-compose.yml" "Docker配置文件"
|
||
check_config_file "配置一致性检查清单.md" "配置检查清单"
|
||
|
||
echo ""
|
||
echo "4. 检查认证功能"
|
||
echo "---------------"
|
||
|
||
# 检查登录API
|
||
echo -n "检查登录API ... "
|
||
if command -v curl >/dev/null 2>&1; then
|
||
login_response=$(curl -s -X POST http://localhost:8000/api/v1/auth/login \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"username": "testuser", "password": "TestPass123!"}' 2>/dev/null)
|
||
|
||
if [[ "$login_response" == *"access_token"* ]]; then
|
||
echo -e "${GREEN}✅ 正常工作${NC}"
|
||
((PASS_COUNT++))
|
||
|
||
# 提取token测试认证
|
||
if command -v jq >/dev/null 2>&1; then
|
||
token=$(echo "$login_response" | jq -r '.data.access_token' 2>/dev/null)
|
||
if [[ "$token" != "null" && "$token" != "" ]]; then
|
||
echo -n "检查token认证 ... "
|
||
auth_response=$(curl -s -H "Authorization: Bearer $token" \
|
||
http://localhost:8000/api/v1/auth/me 2>/dev/null)
|
||
|
||
if [[ "$auth_response" == *"testuser"* ]]; then
|
||
echo -e "${GREEN}✅ 正常工作${NC}"
|
||
((PASS_COUNT++))
|
||
else
|
||
echo -e "${RED}❌ 失败${NC}"
|
||
((FAIL_COUNT++))
|
||
fi
|
||
fi
|
||
else
|
||
echo " (跳过token测试 - jq未安装)"
|
||
fi
|
||
else
|
||
echo -e "${RED}❌ 失败${NC}"
|
||
echo " 响应: $login_response"
|
||
((FAIL_COUNT++))
|
||
fi
|
||
else
|
||
echo -e "${YELLOW}⚠️ 跳过 (curl 未安装)${NC}"
|
||
fi
|
||
|
||
echo ""
|
||
echo "5. 检查CORS配置"
|
||
echo "---------------"
|
||
|
||
echo -n "检查CORS预检请求 ... "
|
||
if command -v curl >/dev/null 2>&1; then
|
||
cors_response=$(curl -s -X OPTIONS http://localhost:8000/api/v1/auth/login \
|
||
-H "Origin: http://localhost:3001" \
|
||
-H "Access-Control-Request-Method: POST" \
|
||
-H "Access-Control-Request-Headers: Content-Type" 2>/dev/null)
|
||
|
||
if [[ $? -eq 0 ]]; then
|
||
echo -e "${GREEN}✅ 正常响应${NC}"
|
||
((PASS_COUNT++))
|
||
else
|
||
echo -e "${RED}❌ 失败${NC}"
|
||
((FAIL_COUNT++))
|
||
fi
|
||
else
|
||
echo -e "${YELLOW}⚠️ 跳过 (curl 未安装)${NC}"
|
||
fi
|
||
|
||
echo ""
|
||
echo "========================"
|
||
echo "📊 检查结果统计"
|
||
echo "------------------------"
|
||
echo -e "通过: ${GREEN}$PASS_COUNT${NC}"
|
||
echo -e "失败: ${RED}$FAIL_COUNT${NC}"
|
||
|
||
if [[ $FAIL_COUNT -eq 0 ]]; then
|
||
echo -e "\n🎉 ${GREEN}所有检查都通过了!系统配置正常。${NC}"
|
||
exit 0
|
||
else
|
||
echo -e "\n⚠️ ${YELLOW}发现 $FAIL_COUNT 个问题,请检查配置。${NC}"
|
||
echo ""
|
||
echo "💡 解决建议:"
|
||
echo "1. 确保Docker服务已启动: docker-compose up -d"
|
||
echo "2. 检查端口是否被占用或服务未启动"
|
||
echo "3. 参考 '配置一致性检查清单.md' 核对配置"
|
||
echo "4. 确保数据库密码、CORS域名等配置一致"
|
||
exit 1
|
||
fi
|