- 添加 Dockerfile 与多套 docker-compose 配置(开发/生产环境) - 集成 Laravel Octane (Swoole) 提升性能 - 新增健康检查、监控脚本及部署文档 - 新增 Docker 镜像离线导入包(MySQL/Redis/Meilisearch) - 优化文档转换、预览服务及队列任务 - 添加 CreateAdminUser 命令与路由健康检查接口 - 新增 Swoole 队列兼容性测试套件 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
215 lines
5.7 KiB
Bash
Executable File
215 lines
5.7 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Docker网络连接测试脚本
|
||
# 用于测试容器间的网络连接和服务可用性
|
||
|
||
set -e
|
||
|
||
echo "==================================="
|
||
echo "Docker网络连接测试"
|
||
echo "==================================="
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 测试计数
|
||
TEST_COUNT=0
|
||
PASS_COUNT=0
|
||
FAIL_COUNT=0
|
||
|
||
# 测试函数
|
||
test_connection() {
|
||
local test_name=$1
|
||
local container=$2
|
||
local target=$3
|
||
local port=$4
|
||
local timeout=${5:-5}
|
||
|
||
((TEST_COUNT++))
|
||
echo -n "测试 $test_name: "
|
||
|
||
if docker exec "$container" timeout "$timeout" bash -c "echo > /dev/tcp/$target/$port" 2>/dev/null; then
|
||
echo -e "${GREEN}✓ 通过${NC}"
|
||
((PASS_COUNT++))
|
||
else
|
||
echo -e "${RED}✗ 失败${NC}"
|
||
((FAIL_COUNT++))
|
||
fi
|
||
}
|
||
|
||
# 测试HTTP连接
|
||
test_http() {
|
||
local test_name=$1
|
||
local container=$2
|
||
local url=$3
|
||
local expected_code=${4:-200}
|
||
|
||
((TEST_COUNT++))
|
||
echo -n "测试 $test_name: "
|
||
|
||
if docker exec "$container" curl -s -o /dev/null -w "%{http_code}" "$url" | grep -q "$expected_code"; then
|
||
echo -e "${GREEN}✓ 通过${NC}"
|
||
((PASS_COUNT++))
|
||
else
|
||
echo -e "${RED}✗ 失败${NC}"
|
||
((FAIL_COUNT++))
|
||
fi
|
||
}
|
||
|
||
# 检查容器是否运行
|
||
check_container() {
|
||
local container=$1
|
||
if ! docker ps --format "table {{.Names}}" | grep -q "^$container$"; then
|
||
echo -e "${RED}错误: 容器 $container 未运行${NC}"
|
||
return 1
|
||
fi
|
||
return 0
|
||
}
|
||
|
||
echo "检查容器状态..."
|
||
echo "-----------------------------------"
|
||
|
||
# 定义容器名称
|
||
APP_CONTAINER="knowledge_base_app"
|
||
MYSQL_CONTAINER="knowledge_base_mysql"
|
||
REDIS_CONTAINER="knowledge_base_redis"
|
||
MEILISEARCH_CONTAINER="knowledge_base_meilisearch"
|
||
QUEUE_CONTAINER="knowledge_base_queue"
|
||
|
||
# 检查所有容器是否运行
|
||
containers=("$APP_CONTAINER" "$MYSQL_CONTAINER" "$REDIS_CONTAINER" "$MEILISEARCH_CONTAINER" "$QUEUE_CONTAINER")
|
||
all_running=true
|
||
|
||
for container in "${containers[@]}"; do
|
||
if check_container "$container"; then
|
||
echo -e "${GREEN}✓ $container 正在运行${NC}"
|
||
else
|
||
echo -e "${RED}✗ $container 未运行${NC}"
|
||
all_running=false
|
||
fi
|
||
done
|
||
|
||
if [ "$all_running" = false ]; then
|
||
echo -e "${RED}部分容器未运行,请先启动所有服务${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
echo ""
|
||
echo "测试网络连接..."
|
||
echo "-----------------------------------"
|
||
|
||
# 测试应用容器到数据库的连接
|
||
test_connection "应用->MySQL" "$APP_CONTAINER" "mysql" "3306"
|
||
|
||
# 测试应用容器到Redis的连接
|
||
test_connection "应用->Redis" "$APP_CONTAINER" "redis" "6379"
|
||
|
||
# 测试应用容器到Meilisearch的连接
|
||
test_connection "应用->Meilisearch" "$APP_CONTAINER" "meilisearch" "7700"
|
||
|
||
# 测试队列容器到数据库的连接
|
||
test_connection "队列->MySQL" "$QUEUE_CONTAINER" "mysql" "3306"
|
||
|
||
# 测试队列容器到Redis的连接
|
||
test_connection "队列->Redis" "$QUEUE_CONTAINER" "redis" "6379"
|
||
|
||
echo ""
|
||
echo "测试HTTP服务..."
|
||
echo "-----------------------------------"
|
||
|
||
# 测试Meilisearch HTTP API
|
||
test_http "Meilisearch健康检查" "$APP_CONTAINER" "http://meilisearch:7700/health"
|
||
|
||
# 测试应用HTTP服务(如果有健康检查端点)
|
||
if docker exec "$APP_CONTAINER" curl -s -f "http://localhost/health" >/dev/null 2>&1; then
|
||
test_http "应用健康检查" "$APP_CONTAINER" "http://localhost/health"
|
||
else
|
||
echo "应用健康检查端点不可用,跳过测试"
|
||
fi
|
||
|
||
echo ""
|
||
echo "测试服务功能..."
|
||
echo "-----------------------------------"
|
||
|
||
# 测试MySQL连接
|
||
((TEST_COUNT++))
|
||
echo -n "测试MySQL数据库连接: "
|
||
if docker exec "$MYSQL_CONTAINER" mysql -u root -p"${DB_PASSWORD:-secure_root_password}" -e "SELECT 1;" >/dev/null 2>&1; then
|
||
echo -e "${GREEN}✓ 通过${NC}"
|
||
((PASS_COUNT++))
|
||
else
|
||
echo -e "${RED}✗ 失败${NC}"
|
||
((FAIL_COUNT++))
|
||
fi
|
||
|
||
# 测试Redis连接
|
||
((TEST_COUNT++))
|
||
echo -n "测试Redis连接: "
|
||
if docker exec "$REDIS_CONTAINER" redis-cli ping | grep -q "PONG"; then
|
||
echo -e "${GREEN}✓ 通过${NC}"
|
||
((PASS_COUNT++))
|
||
else
|
||
echo -e "${RED}✗ 失败${NC}"
|
||
((FAIL_COUNT++))
|
||
fi
|
||
|
||
# 测试Laravel数据库连接
|
||
((TEST_COUNT++))
|
||
echo -n "测试Laravel数据库连接: "
|
||
if docker exec "$APP_CONTAINER" php artisan tinker --execute="echo DB::connection()->getPdo() ? 'OK' : 'FAIL';" 2>/dev/null | grep -q "OK"; then
|
||
echo -e "${GREEN}✓ 通过${NC}"
|
||
((PASS_COUNT++))
|
||
else
|
||
echo -e "${RED}✗ 失败${NC}"
|
||
((FAIL_COUNT++))
|
||
fi
|
||
|
||
# 测试Laravel Redis连接
|
||
((TEST_COUNT++))
|
||
echo -n "测试Laravel Redis连接: "
|
||
if docker exec "$APP_CONTAINER" php artisan tinker --execute="echo Redis::ping() ? 'OK' : 'FAIL';" 2>/dev/null | grep -q "OK"; then
|
||
echo -e "${GREEN}✓ 通过${NC}"
|
||
((PASS_COUNT++))
|
||
else
|
||
echo -e "${RED}✗ 失败${NC}"
|
||
((FAIL_COUNT++))
|
||
fi
|
||
|
||
echo ""
|
||
echo "测试网络信息..."
|
||
echo "-----------------------------------"
|
||
|
||
# 显示网络信息
|
||
echo "Docker网络信息:"
|
||
docker network ls | grep knowledge_base
|
||
|
||
echo ""
|
||
echo "容器IP地址:"
|
||
for container in "${containers[@]}"; do
|
||
if check_container "$container" >/dev/null 2>&1; then
|
||
ip=$(docker inspect "$container" --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}')
|
||
echo "$container: $ip"
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
echo "==================================="
|
||
echo "测试结果汇总"
|
||
echo "==================================="
|
||
|
||
echo "总测试数: $TEST_COUNT"
|
||
echo -e "通过: ${GREEN}$PASS_COUNT${NC}"
|
||
echo -e "失败: ${RED}$FAIL_COUNT${NC}"
|
||
|
||
if [ $FAIL_COUNT -eq 0 ]; then
|
||
echo -e "${GREEN}✓ 所有网络测试通过!${NC}"
|
||
echo "Docker网络配置正常,服务间通信正常。"
|
||
exit 0
|
||
else
|
||
echo -e "${RED}✗ 有 $FAIL_COUNT 个测试失败${NC}"
|
||
echo "请检查网络配置和服务状态。"
|
||
exit 1
|
||
fi |