Files
KnowledgeBase/docker/setup-env.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

400 lines
10 KiB
Bash
Executable File
Raw 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'
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}"