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

400
docker/setup-env.sh Executable file
View File

@@ -0,0 +1,400 @@
#!/bin/bash
# 环境配置设置脚本
# 用于初始化和配置Docker部署环境
set -e
echo "==================================="
echo "Docker环境配置设置"
echo "==================================="
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 默认值
DEFAULT_ENV="production"
DEFAULT_DB_PASSWORD="secure_password_$(date +%s)"
DEFAULT_MEILISEARCH_KEY="master_key_$(openssl rand -hex 16)"
# 显示帮助信息
show_help() {
echo "用法: $0 [选项]"
echo ""
echo "选项:"
echo " -e, --env ENV 设置环境类型 (production|development) [默认: production]"
echo " -i, --interactive 交互式配置"
echo " -f, --force 强制覆盖现有配置文件"
echo " -h, --help 显示此帮助信息"
echo ""
echo "示例:"
echo " $0 -e production 设置生产环境"
echo " $0 -e development 设置开发环境"
echo " $0 -i 交互式配置"
}
# 解析命令行参数
ENV_TYPE="$DEFAULT_ENV"
INTERACTIVE=false
FORCE=false
while [[ $# -gt 0 ]]; do
case $1 in
-e|--env)
ENV_TYPE="$2"
shift 2
;;
-i|--interactive)
INTERACTIVE=true
shift
;;
-f|--force)
FORCE=true
shift
;;
-h|--help)
show_help
exit 0
;;
*)
echo "未知选项: $1"
show_help
exit 1
;;
esac
done
# 验证环境类型
if [[ "$ENV_TYPE" != "production" && "$ENV_TYPE" != "development" ]]; then
echo -e "${RED}错误: 环境类型必须是 'production' 或 'development'${NC}"
exit 1
fi
echo -e "${BLUE}配置环境类型: $ENV_TYPE${NC}"
# 交互式配置
if [ "$INTERACTIVE" = true ]; then
echo ""
echo "交互式配置模式"
echo "-----------------------------------"
read -p "应用名称 [知识库系统]: " app_name
app_name=${app_name:-"知识库系统"}
read -p "应用URL [http://localhost]: " app_url
app_url=${app_url:-"http://localhost"}
read -p "数据库名称 [knowledge_base]: " db_name
db_name=${db_name:-"knowledge_base"}
read -p "数据库用户名 [knowledge_user]: " db_user
db_user=${db_user:-"knowledge_user"}
read -s -p "数据库密码: " db_password
echo ""
read -s -p "Meilisearch主密钥: " meilisearch_key
echo ""
if [ "$ENV_TYPE" = "production" ]; then
read -p "SMTP主机: " mail_host
read -p "SMTP端口 [587]: " mail_port
mail_port=${mail_port:-587}
read -p "SMTP用户名: " mail_username
read -s -p "SMTP密码: " mail_password
echo ""
fi
else
# 非交互式配置,使用默认值
app_name="知识库系统"
app_url="http://localhost"
db_name="knowledge_base"
db_user="knowledge_user"
db_password="$DEFAULT_DB_PASSWORD"
meilisearch_key="$DEFAULT_MEILISEARCH_KEY"
fi
# 生成APP_KEY
echo ""
echo "生成应用密钥..."
echo "-----------------------------------"
if command -v php >/dev/null 2>&1; then
# 如果有PHP使用Laravel生成密钥
if [ -f "artisan" ]; then
app_key=$(php artisan key:generate --show)
echo -e "${GREEN}✓ 使用Laravel生成APP_KEY${NC}"
else
# 生成base64编码的随机密钥
app_key="base64:$(openssl rand -base64 32)"
echo -e "${GREEN}✓ 使用OpenSSL生成APP_KEY${NC}"
fi
else
# 生成base64编码的随机密钥
app_key="base64:$(openssl rand -base64 32)"
echo -e "${GREEN}✓ 使用OpenSSL生成APP_KEY${NC}"
fi
# 确定环境文件名
if [ "$ENV_TYPE" = "production" ]; then
env_file=".env.production"
compose_file="docker-compose.yml"
else
env_file=".env.development"
compose_file="docker-compose.dev.yml"
app_name="${app_name}-开发"
db_name="${db_name}_dev"
db_user="dev_user"
app_url="http://localhost:8000"
fi
# 检查文件是否存在
if [ -f "$env_file" ] && [ "$FORCE" = false ]; then
echo -e "${YELLOW}警告: $env_file 已存在${NC}"
read -p "是否覆盖? (y/N): " overwrite
if [[ ! "$overwrite" =~ ^[Yy]$ ]]; then
echo "取消操作"
exit 0
fi
fi
# 创建环境文件
echo ""
echo "创建环境配置文件..."
echo "-----------------------------------"
cat > "$env_file" << EOF
# $ENV_TYPE 环境配置
# 由 setup-env.sh 自动生成于 $(date)
APP_NAME="$app_name"
APP_ENV=$ENV_TYPE
APP_KEY=$app_key
APP_DEBUG=$([ "$ENV_TYPE" = "development" ] && echo "true" || echo "false")
APP_URL=$app_url
APP_LOCALE=zh_CN
APP_FALLBACK_LOCALE=zh_CN
APP_FAKER_LOCALE=zh_CN
BCRYPT_ROUNDS=$([ "$ENV_TYPE" = "development" ] && echo "10" || echo "12")
LOG_CHANNEL=stack
LOG_STACK=single
LOG_LEVEL=$([ "$ENV_TYPE" = "development" ] && echo "debug" || echo "info")
# 数据库配置 - 使用Docker容器名称进行服务间通信
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=$db_name
DB_USERNAME=$db_user
DB_PASSWORD=$db_password
# 会话和缓存配置
SESSION_DRIVER=redis
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
CACHE_STORE=redis
CACHE_PREFIX=$([ "$ENV_TYPE" = "development" ] && echo "kb_dev_cache" || echo "kb_cache")
# Redis配置 - 使用Docker容器名称进行服务间通信
REDIS_CLIENT=phpredis
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=
# 队列配置 - 使用Redis作为队列驱动
QUEUE_CONNECTION=redis
# 文件系统配置
FILESYSTEM_DISK=local
EOF
# 添加邮件配置
if [ "$ENV_TYPE" = "production" ] && [ -n "$mail_host" ]; then
cat >> "$env_file" << EOF
# 邮件配置 - 生产环境SMTP设置
MAIL_MAILER=smtp
MAIL_HOST=$mail_host
MAIL_PORT=${mail_port:-587}
MAIL_USERNAME=$mail_username
MAIL_PASSWORD=$mail_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@your-domain.com"
MAIL_FROM_NAME="\${APP_NAME}"
EOF
else
cat >> "$env_file" << EOF
# 邮件配置 - $([ "$ENV_TYPE" = "development" ] && echo "开发环境使用日志" || echo "生产环境SMTP设置")
MAIL_MAILER=$([ "$ENV_TYPE" = "development" ] && echo "log" || echo "smtp")
$([ "$ENV_TYPE" = "production" ] && cat << PROD_MAIL
MAIL_HOST=your-smtp-host.com
MAIL_PORT=587
MAIL_USERNAME=your-email@domain.com
MAIL_PASSWORD=your-email-password-change-this
MAIL_ENCRYPTION=tls
PROD_MAIL
)
MAIL_FROM_ADDRESS="$([ "$ENV_TYPE" = "development" ] && echo "dev@knowledge-base.local" || echo "noreply@your-domain.com")"
MAIL_FROM_NAME="\${APP_NAME}"
EOF
fi
# 添加Meilisearch配置
cat >> "$env_file" << EOF
# Meilisearch配置 - 使用Docker容器名称进行服务间通信
SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://meilisearch:7700
MEILISEARCH_KEY=$meilisearch_key
# 文档转换配置
DOCUMENT_CONVERSION_DRIVER=pandoc
PANDOC_PATH=/usr/bin/pandoc
CONVERSION_TIMEOUT=300
CONVERSION_QUEUE=documents
CONVERSION_RETRY_TIMES=3
CONVERSION_RETRY_DELAY=60
# Markdown配置
MARKDOWN_RENDERER=commonmark
MARKDOWN_SANITIZE=true
MARKDOWN_PREVIEW_LENGTH=500
MARKDOWN_MAX_FILE_SIZE=10485760
# 存储配置
DOCUMENTS_DISK=documents
MARKDOWN_DISK=markdown
STORAGE_ORGANIZE_BY_DATE=true
EOF
# 添加开发环境特定配置
if [ "$ENV_TYPE" = "development" ]; then
cat >> "$env_file" << EOF
# 开发工具配置
TELESCOPE_ENABLED=true
DEBUGBAR_ENABLED=true
VITE_APP_NAME="\${APP_NAME}"
# 开发环境特定配置
PHP_IDE_CONFIG=serverName=knowledge-base-dev
XDEBUG_MODE=develop,debug
XDEBUG_CONFIG=client_host=host.docker.internal client_port=9003
EOF
fi
echo -e "${GREEN}✓ 环境配置文件已创建: $env_file${NC}"
# 创建.env符号链接
if [ "$FORCE" = true ] || [ ! -f ".env" ]; then
ln -sf "$env_file" .env
echo -e "${GREEN}✓ 已创建 .env 符号链接指向 $env_file${NC}"
fi
# 创建存储目录
echo ""
echo "创建存储目录..."
echo "-----------------------------------"
if [ "$ENV_TYPE" = "development" ]; then
storage_dirs=(
"storage/dev/mysql"
"storage/dev/redis"
"storage/dev/meilisearch"
"storage/dev/app"
"storage/dev/app/private/documents"
"storage/dev/app/public"
"storage/dev/logs"
"storage/dev/logs/app"
"storage/dev/logs/queue"
)
else
storage_dirs=(
"storage/mysql"
"storage/redis"
"storage/meilisearch"
"storage/app"
"storage/app/private/documents"
"storage/app/public"
"storage/logs"
"storage/logs/app"
"storage/logs/queue"
)
fi
for dir in "${storage_dirs[@]}"; do
if [ ! -d "$dir" ]; then
mkdir -p "$dir"
echo -e "${GREEN}✓ 创建目录: $dir${NC}"
else
echo -e "${YELLOW}目录已存在: $dir${NC}"
fi
done
# 设置目录权限
echo ""
echo "设置目录权限..."
echo "-----------------------------------"
# Laravel需要写入权限的目录
laravel_dirs=(
"storage"
"bootstrap/cache"
)
for dir in "${laravel_dirs[@]}"; do
if [ -d "$dir" ]; then
chmod -R 775 "$dir"
echo -e "${GREEN}✓ 设置权限: $dir${NC}"
fi
done
# 显示配置摘要
echo ""
echo "==================================="
echo "配置摘要"
echo "==================================="
echo "环境类型: $ENV_TYPE"
echo "配置文件: $env_file"
echo "Compose文件: $compose_file"
echo "应用名称: $app_name"
echo "应用URL: $app_url"
echo "数据库名: $db_name"
echo "数据库用户: $db_user"
echo "APP_KEY: ${app_key:0:20}..."
echo "Meilisearch密钥: ${meilisearch_key:0:20}..."
echo ""
echo "==================================="
echo "下一步操作"
echo "==================================="
echo "1. 验证环境配置:"
echo " ./docker/validate-env.sh"
echo ""
echo "2. 启动Docker服务:"
if [ "$ENV_TYPE" = "development" ]; then
echo " docker-compose -f docker-compose.dev.yml up -d"
else
echo " docker-compose up -d"
fi
echo ""
echo "3. 测试网络连接:"
echo " ./docker/test-network.sh"
echo ""
echo "4. 初始化应用:"
echo " docker exec knowledge_base_app php artisan migrate"
echo " docker exec knowledge_base_app php artisan db:seed"
echo ""
echo -e "${GREEN}✓ 环境配置完成!${NC}"