محیط اجرای Python
ابرکلیک از استقرار و اجرای پروژههای Python پشتیبانی میکند. بیلدپکِ ابری بهصورت خودکار نوع پکیجمنیجر (pip, poetry, pipenv, uv, pdm) را تشخیص داده و برنامه شما را آماده میکند.
نسخهها و ابزارهای پشتیبانیشده
- نسخههای فعال پایتون: پایتون از نسخه
3.8تا آخرین نسخه پایدار3.13. - تشخیص نسخه: نسخه مورد نظر شما از طریق فایل
runtime.txt(توصیهشده) یا تنظیمات پروژههای Poetry خوانده میشود. در غیر این صورت، آخرین نسخه پایدار پیشفرض اعمال میشود.
منطق شناسایی پروژه (Project Detection)
ابرکلیک پروژههای پایتونی را از طریق وجود یکی از فایلهای زیر شناسایی میکند:
requirements.txt— مدیریت وابستگی با pipPipfile/Pipfile.lock— مدیریت وابستگی با Pipenvpoetry.lock/pyproject.toml— مدیریت وابستگی با Poetryuv.lock— مدیریت وابستگی با uvpdm.lock— مدیریت وابستگی با pdm
ترتیب اولویت بررسی فایلها در صورت وجود چند گزینه:
۱. وجود Pipfile → استفاده از Pipenv
۲. وجود poetry.lock → استفاده از Poetry
۳. وجود pyproject.toml با بخش [tool.poetry] → استفاده از Poetry
۴. وجود uv.lock → استفاده از uv
۵. وجود pdm.lock → استفاده از pdm
۶. وجود requirements.txt → استفاده از pip (حالت پیشفرض)
تعیین دقیق نسخه پایتون
روش اول — از طریق runtime.txt (سادهترین روش)
یک فایل متنی ساده با نام runtime.txt در ریشه پروژه خود بسازید و نسخه مورد نظر را به شکل زیر وارد کنید:
python-3.11.8
فرمت معتبر بهصورت python-X.Y.Z است.
روش دوم — از طریق pyproject.toml (مخصوص پروژههای Poetry)
اگر از ابزار Poetry استفاده میکنید، نسخه مورد نظر را در بخش وابستگیهای داک بفرستید:
[tool.poetry]
name = "my-app"
version = "0.1.0"
description = "Fast Python App on Abrclick"
[tool.poetry.dependencies]
python = "^3.11"
مدیریت پکیجها و نصب وابستگیها
۱. ابزار pip به همراه requirements.txt
سیستم برای نصب وابستگیها دستور زیر را اجرا میکند:
pip install -r requirements.txt
توصیه فنی: همیشه خروجی وابستگیها را با ابزار قفلکننده نسخه تهیه کنید (مثلاً اجرای pip freeze > requirements.txt یا استفاده از pip-compile). این کار از ناسازگاری لایبرریها در سرور نهایی جلوگیری میکند.
۲. ابزار Pipenv
سیستم با اجرای متد زیر برنامهها را سوار میکند (نیاز به حضور همزمان Pipfile و Pipfile.lock است):
pipenv install --deploy --ignore-pipfile
۳. ابزار Poetry
در صورت تشخیص فایل poetry.lock لایسنس زیر اجرا میشود:
poetry install --no-interaction --no-dev
وبسرورهای پیشنهادی برای اجرای برنامه (Application Server)
برای آنکه برنامه شما به درخواستهای ورودی کاربران پاسخ دهد، باید از یک سرور مناسب زمان اجرا (WSGI یا ASGI) استفاده کنید:
۱. ابزار Gunicorn (توصیهشده برای وبسایتهای WSGI مانند Flask یا Django)
ابتدا پکیج را به وابستگیها اضافه کنید:
pip install gunicorn
سپس در ریشه پروژه فایلی با نام Procfile (با P بزرگ و بدون هیچ پسوندی) بسازید و خط اجرای برنامه را وارد کنید:
web: gunicorn -w 4 -b 0.0.0.0:$PORT app:app
۲. ابزار Uvicorn (توصیهشده برای ساختارهای مدرن ASGI مانند FastAPI)
ابتدا پکیج را نصب کنید:
pip install uvicorn
سپس در فایل Procfile دستور لود وبسرور را قرار دهید:
web: uvicorn main:app --host 0.0.0.0 --port $PORT
۳. فریمورک جنگو (Django)
پیشنهاد میشود پکیجهای gunicorn و whitenoise (برای سرویسدهی فایلهای استاتیک جنگو) را نصب کنید:
pip install gunicorn whitenoise
فایل Procfile جنگو را به این صورت تعریف کنید:
web: gunicorn config.wsgi:application --bind 0.0.0.0:$PORT
استفاده از فایل Procfile (Procfile Specification)
ابرکلیک فرآیند وب را مستقیماً از روی فایل Procfile شما در ریشه پروژه میخواند. اگر فایل Procfile را نساخته باشید، بیلدپک تلاش میکند یکی از موارد زیر را بهطور هوشمند حدس بزند:
- وجود فایل
manage.py→ پروژه Django تشخیص داده شده و وبسرورgunicornرا بهطور خودکار فراخوانی میکند. - وجود فایل
wsgi.py→ پروژه WSGI خام تشخیص داده شده و دستورgunicorn wsgi:appرا اجرا میکند. - وجود فایل
app.pyبا لایبرری اکسپورتشده فلاسک → وبسرورFlaskرا راهاندازی میکند.
برای پایداری فرآیند بیلد و جلوگیری از حدسهای اشتباه، همیشه یک فایل Procfile صریح در ریشه پروژه خود اضافه کنید.
متغیرهای محیطی و پورت (PORT)
برنامه شما حتماً باید بر روی پورت مشخصشده در متغیر محیطی PORT اجرا شود. این مقدار بهصورت خودکار توسط ابرکلیک تنظیم میگردد و سیستم کوبرنتیز ترافیک کاربران را به این پورت هدایت میکند.
در برنامه خود برای خواندن متغیرهای محیطی از کتابخانه استاندارد پایتون استفاده کنید:
import os
port = int(os.environ.get("PORT", 8000))
مشاهده لاگها
برای بررسی لاگهای برنامه Python خود، از دستور زیر استفاده کنید:
abrclick logs <app>
این دستور لاگهای زمان اجرا را بهصورت زنده نمایش میدهد. لاگهای بیلد نیز در حین اجرای abrclick deploy استریم میشوند.
از طریق داشبورد نیز میتوانید لاگها را مشاهده کنید: وارد صفحه برنامه شوید و بر روی تب لاگها کلیک کنید.
در برنامههای سالم Python که از gunicorn استفاده میکنند، پیامهایی مانند Booting worker with pid: 123 و Listening at: http://0.0.0.0:8000 را خواهید دید. اگر این پیامها ظاهر نشوند، احتمالاً مشکلی در راهاندازی برنامه وجود دارد.
برای اطلاعات بیشتر، راهنمای کامل لاگها را مطالعه کنید.
رفع خطاهای رایج
اپ بالا نمیآید / پورت اشتباه
علت: برنامه شما بر روی پورت ثابت یا آدرس 127.0.0.1 گوش میدهد. پلتفرم ترافیک را به پورت موجود در متغیر محیطی PORT هدایت میکند و اگر برنامه روی پورت دیگری اجرا شود یا فقط روی localhost بالا بیاید، درخواستها دریافت نمیشوند.
راهحل: مطمئن شوید وبسرور شما (gunicorn، uvicorn و غیره) بر روی متغیر $PORT و آدرس 0.0.0.0 گوش میدهد. در Procfile:
web: gunicorn -w 4 -b 0.0.0.0:$PORT app:app
یا برای uvicorn:
web: uvicorn main:app --host 0.0.0.0 --port $PORT
فایل Procfile پیدا نشد یا نقطه ورود اشتباه
علت: بیلدپک نمیداند چطور برنامه شما را اجرا کند. ممکن است فایل Procfile وجود نداشته باشد یا ماژول WSGI/ASGI به درستی مشخص نشده باشد.
راهحل: یک فایل Procfile در ریشه پروژه ایجاد کنید و دستور اجرای برنامه را مشخص کنید:
web: gunicorn config.wsgi:application --bind 0.0.0.0:$PORT
برای FastAPI:
web: uvicorn main:app --host 0.0.0.0 --port $PORT
فایل requirements.txt پیدا نشد / بیلد ناموفق
علت: وابستگیهای پروژه شما به درستی مشخص نشدهاند یا فایل مربوطه (مثلاً requirements.txt) وجود ندارد. در محیط بیلد ابرکلیک، اینترنت عمومی در دسترس نیست و آینه داخلی بهصورت خودکار استفاده میشود.
راهحل: مطمئن شوید فایل requirements.txt (برای pip) یا Pipfile.lock (برای Pipenv) یا poetry.lock (برای Poetry) در ریشه پروژه موجود است و آن را کامیت کردهاید. سپس دوباره deploy کنید.
OOMKilled / خطای حافظه
علت: برنامه شما از حافظه بیشتر از محدودیت تعریفشده (پیشفرض ۵۱۲Mi) استفاده کرده است.
راهحل: محدودیت حافظه برنامه را از طریق داشبورد یا تغییر پلن افزایش دهید.
تایماوت worker در gunicorn (درخواستهای طولانی)
علت: درخواستهای طولانی (مثلاً پردازش تصاویر، فراخوانی APIهای خارجی) بیشتر از تایماوت پیشفرض worker (۳۰ ثانیه) طول میکشند و gunicorn آنها را میکشد.
راهحل: تایماوت worker را با افزایش آن در تنظیمات برنامه خود بالا ببرید. میتوانید این کار را از طریق آرگومان --timeout در Procfile انجام دهید:
web: gunicorn -w 4 -b 0.0.0.0:$PORT --timeout 120 app:app