Files
makemd/scripts/env-config.sh

325 lines
7.3 KiB
Bash
Raw Permalink Normal View History

#!/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 "$@"