Project.Fengling.QoderVersion/Backend/scripts/init-infrastructure.ps1
sam e24925e1ed chore(build): 添加基础构建配置和版本管理
- 新增 .dockerignore 文件,忽略多种临时及中间文件
- 新增 .gitattributes 文件,配置文本文件换行及合并行为
- 新增详细的 .gitignore 文件,排除多种开发及生成文件
- 新增 VS Code C# 代码片段,提升开发效率
- 添加 Directory.Build.props,统一 MSBuild 配置和代码分析规则
- 添加空的 Directory.Build.targets,预留构建任务扩展位置
- 添加 Directory.Packages.props,实现依赖包版本集中管理和声明
2026-02-11 12:58:54 +08:00

258 lines
8.4 KiB
PowerShell

# NetCorePal Template - Infrastructure Initialization Script (PowerShell)
# This script initializes the required infrastructure for development
param(
[switch]$SqlServer,
[switch]$Postgres,
[switch]$Kafka,
[switch]$Help
)
$ErrorActionPreference = "Stop"
# Color functions for output
function Write-Info {
param([string]$Message)
Write-Host "[INFO] $Message" -ForegroundColor Blue
}
function Write-Success {
param([string]$Message)
Write-Host "[SUCCESS] $Message" -ForegroundColor Green
}
function Write-Warning {
param([string]$Message)
Write-Host "[WARNING] $Message" -ForegroundColor Yellow
}
function Write-Error {
param([string]$Message)
Write-Host "[ERROR] $Message" -ForegroundColor Red
}
function Show-Help {
Write-Host "NetCorePal Template - Infrastructure Initialization" -ForegroundColor Green
Write-Host "=================================================" -ForegroundColor Green
Write-Host ""
Write-Host "Usage: .\init-infrastructure.ps1 [OPTIONS]"
Write-Host ""
Write-Host "Initialize infrastructure containers for NetCorePal Template development"
Write-Host ""
Write-Host "Options:"
Write-Host " -Help Show this help message"
Write-Host " -SqlServer Use SQL Server database instead of MySQL"
Write-Host " -Postgres Use PostgreSQL database instead of MySQL"
Write-Host " -Kafka Use Kafka instead of RabbitMQ"
Write-Host ""
Write-Host "Examples:"
Write-Host " .\init-infrastructure.ps1 # Start with MySQL and RabbitMQ (default)"
Write-Host " .\init-infrastructure.ps1 -Postgres # Start with PostgreSQL and RabbitMQ"
Write-Host " .\init-infrastructure.ps1 -Kafka # Start with MySQL and Kafka"
Write-Host ""
}
function Test-Docker {
Write-Info "Checking Docker installation..."
try {
$null = Get-Command docker -ErrorAction Stop
}
catch {
Write-Error "Docker is not installed. Please install Docker Desktop first."
Write-Host "Download from: https://www.docker.com/products/docker-desktop/" -ForegroundColor Cyan
exit 1
}
try {
$null = docker info 2>$null
}
catch {
Write-Error "Docker is not running. Please start Docker Desktop first."
exit 1
}
Write-Success "Docker is installed and running"
}
function Start-Container {
param(
[string]$Name,
[string]$Image,
[string]$Ports,
[string]$Environment,
[string]$Volumes,
[string]$AdditionalArgs
)
Write-Info "Starting $Name container..."
# Stop and remove existing container if it exists
$existingContainer = docker ps -a --format "table {{.Names}}" | Select-String "^$Name$"
if ($existingContainer) {
Write-Warning "Stopping existing $Name container..."
docker stop $Name 2>$null | Out-Null
docker rm $Name 2>$null | Out-Null
}
# Build the docker run command
$cmd = "docker run --restart unless-stopped --name $Name"
if ($Ports) { $cmd += " $Ports" }
if ($Environment) { $cmd += " $Environment" }
if ($Volumes) { $cmd += " $Volumes" }
if ($AdditionalArgs) { $cmd += " $AdditionalArgs" }
$cmd += " -d $Image"
try {
Invoke-Expression $cmd | Out-Null
Write-Success "$Name container started successfully"
return $true
}
catch {
Write-Error "Failed to start $Name container: $_"
return $false
}
}
function Wait-ForContainer {
param(
[string]$ContainerName,
[int]$MaxAttempts = 30
)
Write-Info "Waiting for $ContainerName to be healthy..."
for ($attempt = 1; $attempt -le $MaxAttempts; $attempt++) {
$running = docker ps --filter "name=$ContainerName" --filter "status=running" | Select-String $ContainerName
if ($running) {
Write-Success "$ContainerName is running"
return $true
}
Write-Host "." -NoNewline
Start-Sleep -Seconds 2
}
Write-Host "" # New line after dots
Write-Error "$ContainerName failed to start properly"
return $false
}
function Start-Infrastructure {
Write-Host ""
Write-Info "Starting infrastructure setup..."
Write-Host ""
# Check prerequisites
Test-Docker
# Start Redis
$success = Start-Container -Name "netcorepal-redis" -Image "redis:7.2-alpine" `
-Ports "-p 6379:6379" `
-Volumes "-v netcorepal_redis_data:/data" `
-AdditionalArgs "redis-server --appendonly yes --databases 1024"
if ($success) {
Wait-ForContainer -ContainerName "netcorepal-redis" -MaxAttempts 15
}
# Start Database
if ($Postgres) {
Write-Info "Setting up PostgreSQL database..."
$success = Start-Container -Name "netcorepal-postgres" -Image "postgres:15-alpine" `
-Ports "-p 5432:5432" `
-Environment "-e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=123456 -e POSTGRES_DB=postgres -e TZ=Asia/Shanghai" `
-Volumes "-v netcorepal_postgres_data:/var/lib/postgresql/data"
if ($success) {
Wait-ForContainer -ContainerName "netcorepal-postgres" -MaxAttempts 30
}
}
elseif ($SqlServer) {
Write-Info "Setting up SQL Server database..."
$success = Start-Container -Name "netcorepal-sqlserver" -Image "mcr.microsoft.com/mssql/server:2022-latest" `
-Ports "-p 1433:1433" `
-Environment "-e ACCEPT_EULA=Y -e MSSQL_SA_PASSWORD=Test123456! -e TZ=Asia/Shanghai" `
-Volumes "-v netcorepal_sqlserver_data:/var/opt/mssql"
if ($success) {
Wait-ForContainer -ContainerName "netcorepal-sqlserver" -MaxAttempts 30
}
}
else {
Write-Info "Setting up MySQL database..."
$success = Start-Container -Name "netcorepal-mysql" -Image "mysql:8.0" `
-Ports "-p 3306:3306" `
-Environment "-e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_CHARACTER_SET_SERVER=utf8mb4 -e MYSQL_COLLATION_SERVER=utf8mb4_unicode_ci -e TZ=Asia/Shanghai" `
-Volumes "-v netcorepal_mysql_data:/var/lib/mysql"
if ($success) {
Wait-ForContainer -ContainerName "netcorepal-mysql" -MaxAttempts 30
}
}
# Start Message Queue
if ($Kafka) {
Write-Info "Setting up Kafka message queue..."
Write-Warning "Kafka setup requires Zookeeper. For full Kafka setup, please use Docker Compose:"
Write-Host "docker-compose --profile kafka up -d" -ForegroundColor Cyan
}
else {
Write-Info "Setting up RabbitMQ message queue..."
$success = Start-Container -Name "netcorepal-rabbitmq" -Image "rabbitmq:3.12-management-alpine" `
-Ports "-p 5672:5672 -p 15672:15672" `
-Environment "-e RABBITMQ_DEFAULT_USER=guest -e RABBITMQ_DEFAULT_PASS=guest" `
-Volumes "-v netcorepal_rabbitmq_data:/var/lib/rabbitmq"
if ($success) {
Wait-ForContainer -ContainerName "netcorepal-rabbitmq" -MaxAttempts 20
}
}
Write-Host ""
Write-Success "🎉 Infrastructure setup completed successfully!"
Write-Host ""
Write-Host "📋 Service Summary:" -ForegroundColor Cyan
Write-Host "==================="
Write-Host "✅ Redis: localhost:6379"
if ($Postgres) {
Write-Host "✅ PostgreSQL: localhost:5432 (postgres/123456)"
}
elseif ($SqlServer) {
Write-Host "✅ SQL Server: localhost:1433 (sa/Test123456!)"
}
else {
Write-Host "✅ MySQL: localhost:3306 (root/123456)"
}
if (-not $Kafka) {
Write-Host "✅ RabbitMQ: localhost:5672 (guest/guest)"
Write-Host "📊 RabbitMQ Management UI: http://localhost:15672"
}
Write-Host ""
Write-Host "💡 Tips:" -ForegroundColor Yellow
Write-Host "• Use 'docker ps' to see running containers"
Write-Host "• Use 'docker logs <container_name>' to check logs"
Write-Host "• Use '.\clean-infrastructure.ps1' to stop and remove all containers"
Write-Host ""
Write-Info "Ready for development! 🚀"
}
# Main execution
Write-Host "🚀 NetCorePal Template - Infrastructure Setup" -ForegroundColor Green
Write-Host "==============================================" -ForegroundColor Green
if ($Help) {
Show-Help
exit 0
}
try {
Start-Infrastructure
}
catch {
Write-Error "An error occurred during setup: $_"
exit 1
}