#!/bin/bash # ============================================================================ # Crawlful Hub 环境配置脚本 # Task ID: OP-DE001 # Description: 环境变量配置与验证脚本 # ============================================================================ set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 环境变量配置模板 ENV_TEMPLATE="# ============================================================================ # Crawlful Hub 环境变量配置 # ============================================================================ # 应用配置 NODE_ENV=development APP_PORT=3000 APP_NAME=crawlful-hub # 数据库配置 (阿里云 RDS MySQL 8.0) DB_HOST=localhost DB_PORT=3306 DB_NAME=crawlful_hub DB_USER=root DB_PASSWORD=your_password_here DB_POOL_MIN=5 DB_POOL_MAX=20 # Redis 配置 (本地 Redis 6379) REDIS_HOST=localhost REDIS_PORT=6379 REDIS_PASSWORD= REDIS_DB=0 # JWT 配置 JWT_SECRET=your_jwt_secret_here JWT_EXPIRES_IN=7d # 租户配置 DEFAULT_TENANT_ID=tenant_001 # 日志配置 LOG_LEVEL=info LOG_FORMAT=json # 五元组追踪 TRACE_ENABLED=true TRACE_SAMPLE_RATE=1.0 # 利润红线配置 PROFIT_MARGIN_B2B_THRESHOLD=0.15 PROFIT_MARGIN_B2C_THRESHOLD=0.20 # 并发控制 WORKER_CONCURRENCY=10 API_RATE_LIMIT=100 # 内存限制 (MB) NODE_MAX_OLD_SPACE_SIZE=4096 # 插件配置 PLUGIN_DATA_DIR=./data/plugins PLUGIN_PROFILE_DIR=./data/profiles # 安全配置 CORS_ORIGIN=http://localhost:8000 HELMET_ENABLED=true " # 创建 .env 文件 create_env_file() { local env_file=".env" if [ -f "$env_file" ]; then log_warn ".env 文件已存在,跳过创建" return 0 fi log_info "创建 .env 文件..." echo "$ENV_TEMPLATE" > "$env_file" log_success ".env 文件创建成功" } # 创建 .env.example 文件 create_env_example() { local env_example=".env.example" log_info "创建 .env.example 文件..." echo "$ENV_TEMPLATE" > "$env_example" log_success ".env.example 文件创建成功" } # 验证环境变量 validate_env() { log_info "验证环境变量..." local missing_vars=() local required_vars=( "NODE_ENV" "DB_HOST" "DB_PORT" "DB_NAME" "DB_USER" "REDIS_HOST" "REDIS_PORT" "JWT_SECRET" ) for var in "${required_vars[@]}"; do if [ -z "${!var}" ]; then missing_vars+=("$var") fi done if [ ${#missing_vars[@]} -gt 0 ]; then log_error "缺少必要的环境变量: ${missing_vars[*]}" return 1 fi log_success "所有必要的环境变量已配置" return 0 } # 验证数据库连接 validate_db_connection() { log_info "验证数据库连接..." if command -v mysql &> /dev/null; then if mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASSWORD}" -e "SELECT 1" &> /dev/null; then log_success "数据库连接成功" return 0 else log_warn "数据库连接失败,请检查配置" return 1 fi else log_warn "mysql 客户端未安装,跳过数据库连接验证" return 0 fi } # 验证 Redis 连接 validate_redis_connection() { log_info "验证 Redis 连接..." if command -v redis-cli &> /dev/null; then if redis-cli -h"${REDIS_HOST}" -p"${REDIS_PORT}" ping &> /dev/null; then log_success "Redis 连接成功" return 0 else log_warn "Redis 连接失败,请检查配置" return 1 fi else log_warn "redis-cli 未安装,跳过 Redis 连接验证" return 0 fi } # 创建必要的目录 create_directories() { log_info "创建必要的目录..." local directories=( "./logs" "./data" "./data/plugins" "./data/profiles" "./data/uploads" "./data/backups" "./tmp" ) for dir in "${directories[@]}"; do if [ ! -d "$dir" ]; then mkdir -p "$dir" log_success "创建目录: $dir" else log_info "目录已存在: $dir" fi done } # 设置文件权限 set_permissions() { log_info "设置文件权限..." chmod 700 ./data chmod 700 ./data/plugins chmod 700 ./data/profiles chmod 600 .env 2>/dev/null || true log_success "文件权限设置完成" } # 检查 Node.js 版本 check_node_version() { log_info "检查 Node.js 版本..." if command -v node &> /dev/null; then local node_version=$(node -v | cut -d 'v' -f 2 | cut -d '.' -f 1) if [ "$node_version" -ge 18 ]; then log_success "Node.js 版本: $(node -v)" else log_error "Node.js 版本过低,需要 >= 18.x" return 1 fi else log_error "Node.js 未安装" return 1 fi } # 检查依赖 check_dependencies() { log_info "检查依赖..." local missing_deps=() local deps=("node" "npm") for dep in "${deps[@]}"; do if ! command -v "$dep" &> /dev/null; then missing_deps+=("$dep") fi done if [ ${#missing_deps[@]} -gt 0 ]; then log_error "缺少依赖: ${missing_deps[*]}" return 1 fi log_success "所有依赖已安装" return 0 } # 显示配置摘要 show_summary() { echo "" echo "==========================================" echo " Crawlful Hub 环境配置摘要" echo "==========================================" echo "" echo "应用配置:" echo " - NODE_ENV: ${NODE_ENV:-未设置}" echo " - APP_PORT: ${APP_PORT:-未设置}" echo "" echo "数据库配置:" echo " - DB_HOST: ${DB_HOST:-未设置}" echo " - DB_PORT: ${DB_PORT:-未设置}" echo " - DB_NAME: ${DB_NAME:-未设置}" echo "" echo "Redis 配置:" echo " - REDIS_HOST: ${REDIS_HOST:-未设置}" echo " - REDIS_PORT: ${REDIS_PORT:-未设置}" echo "" echo "业务约束:" echo " - B2B 利润红线: ${PROFIT_MARGIN_B2B_THRESHOLD:-15%}" echo " - B2C 利润红线: ${PROFIT_MARGIN_B2C_THRESHOLD:-20%}" echo " - Worker 并发数: ${WORKER_CONCURRENCY:-10}" echo "" echo "==========================================" } # 主函数 main() { echo "" echo "==========================================" echo " Crawlful Hub 环境配置脚本 v1.0" echo "==========================================" echo "" # 加载环境变量 if [ -f ".env" ]; then log_info "加载 .env 文件..." export $(cat .env | grep -v '^#' | xargs) fi # 执行配置步骤 create_env_file create_env_example create_directories set_permissions check_node_version check_dependencies # 验证连接 if [ -f ".env" ]; then validate_db_connection || true validate_redis_connection || true fi # 显示摘要 show_summary log_success "环境配置完成!" } # 运行主函数 main "$@"