Stable-Video-Diffusion-Img2Vid / setup_and_run_fastapi.ps1
alibehzadir's picture
Upload 28 files
d7563ca verified
# setup_and_run_fastapi.ps1
<#
هدف:
- ایجاد محیط مجازی (venv)
- نصب fastapi و uvicorn
- نوشتن main.py با API پایه (در صورت نبود)
- اجرای uvicorn در یک پنجره جدید (اختیاری)
- تست سریع با Invoke-RestMethod (در صورت نیاز)
نحوه اجرا:
- PowerShell را با دسترسی مناسب باز کن (برای اجرای این اسکریپت نیاز به Policy مناسب داری)
- اجرا: .\setup_and_run_fastapi.ps1 -Port 8000 -Host 0.0.0.0 -AutoRun
- یا بدون AutoRun: .\setup_and_run_fastapi.ps1
#>
<#
پارامترها
-Port: پورت سرور (default 8000)
-Host: آدرس میزبانی (default 0.0.0.0)
-AutoRun: اگر حضور باشد، uvicorn در یک پنجرهٔ جدید اجرا می‌شود
#>
param(
[string]$Port = "8000",
[string]$Host = "0.0.0.0",
[string]$ProjectDir = (Get-Location).Path,
[switch]$AutoRun
)
$ErrorActionPreference = "Stop"
try {
Write-Host "شروع فرآیند آماده‌سازی در پوشه: $ProjectDir"
# بررسی وجود پایتون در PATH
$pyCmd = Get-Command python -ErrorAction SilentlyContinue
if (-not $pyCmd) {
Write-Error "Python در PATH شما پیدا نشد. لطفاً Python 3.13.7+ را نصب کرده و در PATH قرار بده."
exit 1
}
Write-Host "Python ورژن: $(python --version 2>&1)"
$venvPath = Join-Path -Path $ProjectDir -ChildPath "venv"
# ایجاد venv در صورت نبود
if (-Not (Test-Path $venvPath)) {
Write-Host "در حال ایجاد محیط مجازی (venv) ..."
& python -m venv $venvPath
} else {
Write-Host "محیط مجازی قبلاً وجود دارد."
}
$venvPython = Join-Path -Path $venvPath -ChildPath "Scripts\python.exe"
# اطمینان از وجود پکیج‌ها
Write-Host "ارتقاء pip و نصب وابستگی‌ها..."
& $venvPython -m pip install --upgrade pip
& $venvPython -m pip install fastapi uvicorn
# اضافه کردن main.py اگر وجود ندارد
$mainPath = Join-Path -Path $ProjectDir -ChildPath "main.py"
if (-Not (Test-Path $mainPath)) {
$mainContent = @"
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class GenerateRequest(BaseModel):
prompt: str
@app.post("/generate")
async def generate(req: GenerateRequest):
return {"received_prompt": req.prompt, "status": "ok"}
@app.get("/status")
async def status():
return {"status": "running"}
"@
Set-Content -Path $mainPath -Value $mainContent -Encoding UTF8
Write-Host "main.py ایجاد شد در: $mainPath"
} else {
Write-Host "main.py وجود دارد. از آن استفاده می‌شود."
}
# اجرای uvicorn
if ($AutoRun) {
Write-Host "در حال اجرای uvicorn در پنجرهٔ جدید..."
$args = @("-m","uvicorn","main:app","--reload","--port",$Port,"--host",$Host)
Start-Process -FilePath $venvPython -ArgumentList $args -WindowStyle Normal -WorkingDirectory $ProjectDir
Start-Sleep -Seconds 3
# تست ساده بعد از راه‌اندازی
$maxWait = 15
$t = 0
$ready = $false
while (-not $ready -and $t -lt $maxWait) {
try {
$resp = Invoke-RestMethod -Uri "http://localhost:$Port/status" -ErrorAction Stop
$ready = $true
Write-Host "API در دسترس است: وضعیت -> $($resp.status)"
} catch {
Start-Sleep -Seconds 1
$t++
}
}
if (-not $ready) {
Write-Host "تست Startup به صورت کامل انجام نشد. می‌توانید به صورت دستی به پورت $Port مراجعه کنید."
}
} else {
Write-Host "برای اجرای سرور از این دستور استفاده کن (در همان پوشه):"
Write-Host " `"$venvPython`" -m uvicorn main:app --reload --port $Port --host $Host"
}
Write-Host "تمام شد. با موفقیت آماده است."
Write-Host "docs: http://localhost:$Port/docs"
} catch {
Write-Error "خطا در اجرای اسکریپت: $_"
}