Files
KnowledgeBase/docker/test-network.sh
lizhuoran 3c206e9e06 feat: 新增 Docker 部署支持、Swoole/Octane 集成及相关优化
- 添加 Dockerfile 与多套 docker-compose 配置(开发/生产环境)
- 集成 Laravel Octane (Swoole) 提升性能
- 新增健康检查、监控脚本及部署文档
- 新增 Docker 镜像离线导入包(MySQL/Redis/Meilisearch)
- 优化文档转换、预览服务及队列任务
- 添加 CreateAdminUser 命令与路由健康检查接口
- 新增 Swoole 队列兼容性测试套件

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 15:51:19 +08:00

215 lines
5.7 KiB
Bash
Executable File
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
# 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