# 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 "خطا در اجرای اسکریپت: $_" }