Files
wecom_it_smart_desk/scripts/restart_backend.ps1

122 lines
4.9 KiB
PowerShell
Raw Permalink 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.
# ==================================================================================================
# 一键重启后端服务(支持从任意位置运行)
# 用法:scripts\restart_backend.ps1
# ==================================================================================================
$SCRIPT_DIR = Split-Path -Parent $MyInvocation.MyCommand.Path
$PROJECT_ROOT = Split-Path -Parent $SCRIPT_DIR
$BACKEND_DIR = Join-Path $PROJECT_ROOT "backend"
# ===================================================================
# Step 1: 杀掉占用 8000 端口的旧进程
# ===================================================================
Write-Host "=== Step 1: Kill old processes on port 8000 ===" -ForegroundColor Yellow
$raw = netstat -ano | Select-String ":8000" | Select-String "LISTENING"
$pids = $raw | ForEach-Object { ($_ -split '\s+')[-1] } | Sort-Object -Unique
foreach ($pid in $pids) {
if ($pid -match '^\d+$') {
Write-Host " Killing PID $pid ..." -ForegroundColor Red
Stop-Process -Id ([int]$pid) -Force -ErrorAction SilentlyContinue
}
}
Start-Sleep -Seconds 2
Write-Host " Done." -ForegroundColor Green
# ===================================================================
# Step 2: 检查 PostgreSQL
# ===================================================================
Write-Host ""
Write-Host "=== Step 2: Check PostgreSQL ===" -ForegroundColor Yellow
# 动态查找 psql.exe(常见安装路径 → PATH
$PG_CANDIDATES = @(
"C:\Program Files\PostgreSQL\16\bin\psql.exe",
"C:\Program Files\PostgreSQL\15\bin\psql.exe",
"C:\Program Files\PostgreSQL\14\bin\psql.exe"
)
$PG_CLI = $PG_CANDIDATES | Where-Object { Test-Path $_ } | Select-Object -First 1
if (-not $PG_CLI) {
$PG_CLI = Get-Command psql -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Source
}
if ($PG_CLI -and (Test-Path $PG_CLI)) {
# 从 .env 文件读取数据库密码(优先 POSTGRES_PASSWORD,其次解析 DATABASE_URL
$envFile = Join-Path $PROJECT_ROOT ".env"
$pgPassword = "postgres" # 兜底默认值
if (Test-Path $envFile) {
$envLines = Get-Content $envFile
# 方式1:直接读取 POSTGRES_PASSWORD
$pwLine = $envLines | Where-Object { $_ -match '^POSTGRES_PASSWORD=' }
if ($pwLine) {
$pgPassword = ($pwLine -replace '^POSTGRES_PASSWORD=' , '').Trim('"')
} else {
# 方式2:从 DATABASE_URL 中解析密码
$dbLine = $envLines | Where-Object { $_ -match '^DATABASE_URL=' }
if ($dbLine -match '://[^:]+:([^@]+)@') {
$pgPassword = $matches[1]
}
}
}
$env:PGPASSWORD = $pgPassword
$pgResult = & $PG_CLI -U postgres -h localhost -c "SELECT 1" -d it_smart_desk 2>&1
if ($pgResult -match "1 row") {
Write-Host " PostgreSQL OK" -ForegroundColor Green
} else {
Write-Host " PostgreSQL FAILED - make sure it is running" -ForegroundColor Red
}
} else {
Write-Host " psql.exe not found. Install PostgreSQL client or add it to PATH." -ForegroundColor Red
}
# ===================================================================
# Step 3: 检查 Redis
# ===================================================================
Write-Host ""
Write-Host "=== Step 3: Check Redis ===" -ForegroundColor Yellow
# 动态查找 redis-cli.exe
$REDIS_CANDIDATES = @(
"C:\Program Files\Redis\redis-cli.exe",
"C:\Program Files (x86)\Redis\redis-cli.exe"
)
$REDIS_CLI = $REDIS_CANDIDATES | Where-Object { Test-Path $_ } | Select-Object -First 1
if (-not $REDIS_CLI) {
$REDIS_CLI = Get-Command redis-cli -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Source
}
if ($REDIS_CLI -and (Test-Path $REDIS_CLI)) {
$redisResult = & $REDIS_CLI ping 2>&1
if ($redisResult -match "PONG") {
Write-Host " Redis OK" -ForegroundColor Green
} else {
Write-Host " Redis FAILED - make sure it is running" -ForegroundColor Red
}
} else {
Write-Host " redis-cli.exe not found. Install Redis client or add it to PATH." -ForegroundColor Red
}
# ===================================================================
# Step 4: 启动后端
# ===================================================================
Write-Host ""
Write-Host "=== Step 4: Starting backend ===" -ForegroundColor Yellow
Set-Location $BACKEND_DIR
# 优先使用 venv 中的 python,找不到则使用 PATH 中的 python
if (Test-Path "venv\Scripts\python.exe") {
$PYTHON_EXE = "venv\Scripts\python.exe"
} elseif (Get-Command python -ErrorAction SilentlyContinue) {
$PYTHON_EXE = "python"
} else {
Write-Host " [ERROR] python not found. Please install Python or create backend\venv." -ForegroundColor Red
Read-Host "Press Enter to exit"
exit 1
exit 1
}
Write-Host " Backend dir : $BACKEND_DIR"
Write-Host " Python : $PYTHON_EXE"
Write-Host ""
& $PYTHON_EXE -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000