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>
This commit is contained in:
2026-02-28 15:51:19 +08:00
parent acf549c43c
commit 3c206e9e06
90 changed files with 12731 additions and 1255 deletions

215
docker/test-network.sh Executable file
View File

@@ -0,0 +1,215 @@
#!/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