# ============================================ # 配置验证脚本 (PowerShell) # ============================================ # 功能: # - 验证环境变量配置 # - 验证端口可用性 # - 验证依赖服务连接 # 使用: # .\scripts\validate-config.ps1 # ============================================ param( [switch]$Verbose ) $ErrorActionPreference = "Continue" $script:HasErrors = $false $script:HasWarnings = $false function Write-Check { param([string]$Name, [string]$Status, [string]$Message) $icon = switch ($Status) { "OK" { "✅" } "WARN" { "⚠️" } "ERROR" { "❌" } default { "ℹ️" } } Write-Host " $icon $Name : $Message" if ($Status -eq "ERROR") { $script:HasErrors = $true } if ($Status -eq "WARN") { $script:HasWarnings = $true } } Write-Host "" Write-Host "========================================" Write-Host " 配置验证脚本" Write-Host "========================================" Write-Host "" # 1. 检查环境变量文件 Write-Host "📋 检查环境变量..." if (Test-Path ".env") { Write-Check "环境变量文件" "OK" ".env 文件存在" # 读取 .env 文件 $envContent = Get-Content ".env" -Raw # 检查必需的环境变量 $requiredVars = @( @{ Name = "DATABASE_URL"; Pattern = "DATABASE_URL=" } ) # JWT_SECRET 或 NEXTAUTH_SECRET 至少需要一个 if ($envContent -match "JWT_SECRET=" -or $envContent -match "NEXTAUTH_SECRET=") { Write-Check "JWT/Auth Secret" "OK" "已配置" } else { Write-Check "JWT/Auth Secret" "ERROR" "未配置 (需要 JWT_SECRET 或 NEXTAUTH_SECRET)" } foreach ($var in $requiredVars) { if ($envContent -match $var.Pattern) { Write-Check $var.Name "OK" "已配置" } else { Write-Check $var.Name "ERROR" "未配置" } } # 检查可选但推荐的环境变量 $optionalVars = @( @{ Name = "S3_ENDPOINT"; Pattern = "S3_ENDPOINT=" }, @{ Name = "S3_ACCESS_KEY"; Pattern = "S3_ACCESS_KEY=" }, @{ Name = "S3_SECRET_KEY"; Pattern = "S3_SECRET_KEY=" } ) foreach ($var in $optionalVars) { if ($envContent -match $var.Pattern) { Write-Check $var.Name "OK" "已配置" } else { Write-Check $var.Name "WARN" "未配置(可选)" } } } else { Write-Check "环境变量文件" "ERROR" ".env 文件不存在" } Write-Host "" # 2. 检查端口可用性 Write-Host "🔌 检查端口可用性..." $ports = @( @{ Port = 3000; Name = "Next.js 应用" }, @{ Port = 5432; Name = "PostgreSQL" }, @{ Port = 9000; Name = "MinIO API" }, @{ Port = 9001; Name = "MinIO Console" } ) foreach ($p in $ports) { $connection = Get-NetTCPConnection -LocalPort $p.Port -ErrorAction SilentlyContinue if ($connection) { $process = Get-Process -Id $connection.OwningProcess -ErrorAction SilentlyContinue $processName = if ($process) { $process.ProcessName } else { "未知进程" } Write-Check "$($p.Name) (端口 $($p.Port))" "OK" "已被 $processName 使用" } else { Write-Check "$($p.Name) (端口 $($p.Port))" "OK" "端口可用" } } Write-Host "" # 3. 检查依赖服务 Write-Host "🔗 检查依赖服务..." # 检查 PostgreSQL try { $pgConnection = Test-NetConnection -ComputerName localhost -Port 5432 -WarningAction SilentlyContinue if ($pgConnection.TcpTestSucceeded) { Write-Check "PostgreSQL" "OK" "服务运行中" } else { Write-Check "PostgreSQL" "WARN" "服务未运行或无法连接" } } catch { Write-Check "PostgreSQL" "WARN" "无法检测服务状态" } # 检查 MinIO try { $minioConnection = Test-NetConnection -ComputerName localhost -Port 9000 -WarningAction SilentlyContinue if ($minioConnection.TcpTestSucceeded) { Write-Check "MinIO" "OK" "服务运行中" } else { Write-Check "MinIO" "WARN" "服务未运行或无法连接" } } catch { Write-Check "MinIO" "WARN" "无法检测服务状态" } Write-Host "" # 4. 检查 Node.js 和 npm Write-Host "📦 检查开发环境..." try { $nodeVersion = node --version 2>$null if ($nodeVersion) { Write-Check "Node.js" "OK" "版本 $nodeVersion" } else { Write-Check "Node.js" "ERROR" "未安装" } } catch { Write-Check "Node.js" "ERROR" "未安装" } try { $npmVersion = npm --version 2>$null if ($npmVersion) { Write-Check "npm" "OK" "版本 $npmVersion" } else { Write-Check "npm" "ERROR" "未安装" } } catch { Write-Check "npm" "ERROR" "未安装" } # 检查 node_modules if (Test-Path "node_modules") { Write-Check "依赖包" "OK" "node_modules 存在" } else { Write-Check "依赖包" "WARN" "node_modules 不存在,请运行 npm install" } Write-Host "" # 5. 检查 Docker(可选) Write-Host "🐳 检查 Docker..." try { $dockerVersion = docker --version 2>$null if ($dockerVersion) { Write-Check "Docker" "OK" $dockerVersion } else { Write-Check "Docker" "WARN" "未安装(可选)" } } catch { Write-Check "Docker" "WARN" "未安装(可选)" } try { $composeVersion = docker-compose --version 2>$null if ($composeVersion) { Write-Check "Docker Compose" "OK" $composeVersion } else { Write-Check "Docker Compose" "WARN" "未安装(可选)" } } catch { Write-Check "Docker Compose" "WARN" "未安装(可选)" } Write-Host "" Write-Host "========================================" if ($script:HasErrors) { Write-Host " ❌ 配置验证失败,请修复上述错误" Write-Host "========================================" exit 1 } elseif ($script:HasWarnings) { Write-Host " ⚠️ 配置验证通过,但有警告" Write-Host "========================================" exit 0 } else { Write-Host " ✅ 配置验证通过" Write-Host "========================================" exit 0 }