Flask، کوچک و آماده
اگر Procfile نباشد، wsgi.py و بعد app.py و main.py بررسی میشوند و gunicorn با دو worker روی پورت اپ اجرا میشود. بنابراین یک اپ Flask ساده بدون هیچ تنظیمی بالا میآید.
سرور توسعهی Flask (flask run) برای تولید مناسب نیست. gunicorn را به وابستگیها اضافه کنید و اگر درخواستهای طولانی دارید، timeout را در Procfile بالا ببرید.
مناسب برای
- API سبک و میکروسرویس
- وبهوک و بات
- سرویس مدل یادگیری ماشین
- داشبورد داخلی کوچک
مسیر بیلد Flask
تشخیص
فایل وابستگیها و
app.pyیاwsgi.py.app.pyنصب
وابستگیها با ابزار پروژه نصب میشوند.
pip install -r requirements.txtاجرا
gunicorn شیء app را با دو worker اجرا میکند.
gunicorn app:app
خروجی یک استقرار واقعی
sakoocloud deploy ✔ Packed 0.2MB ✔ Source uploaded ℹ Build started · dep_7k2m9q #4 [build 1/5] FROM python:3.12-slim #6 [build 3/5] RUN pip install -r requirements.txt #8 [build 4/5] COPY . . #10 exporting to image ✔ Deployed — app is running. → https://my-flask.sakooapps.ir
کمترین چیزی که لازم دارید
gunicorn را به وابستگیها اضافه کنید؛ Procfile اختیاری است ولی رفتار را صریح میکند.
from flask import Flask, jsonify
app = Flask(__name__)
@app.get("/health")
def health():
return jsonify(ok=True)
web: gunicorn app:app --bind 0.0.0.0:$PORT --workers 2 --timeout 60
flask==3.*
gunicorn==23.*
تنظیمات
نسخهی Python
نسخههای 3.10 تا 3.13 در دسترساند و بدون اعلام نسخه، Python 3.12 استفاده میشود.
| از کجا خوانده میشود | نمونه |
|---|---|
runtime.txt | python-3.12.4 |
.python-version | 3.12 |
requires-python در pyproject.toml | ">=3.12" |
مدیریت وابستگیها
اگر چند فایل کنار هم باشند، اولویت از بالا به پایین است.
| فایل | ابزار |
|---|---|
Pipfile | Pipenv |
poetry.lock یا [tool.poetry] در pyproject.toml | Poetry |
uv.lock | uv |
pdm.lock | PDM |
requirements.txt | pip |
اتصال به دیتابیس
بعد از لینک کردن دیتابیس، DATABASE_URL در محیط اپ است و ORM ها مستقیم از آن استفاده میکنند.
sakoocloud apps link-db <db-id> --app my-api
import os
from sqlalchemy import create_engine
engine = create_engine(os.environ["DATABASE_URL"])
دیتابیسهایی که معمولاً کنارش میآیند
همراه هر استقرار
اینها به رانتایم بستگی ندارند و برای هر اپ روی سکو کلود فعالاند. بعضی، مثل مقیاسدهی خودکار و کرانجاب، به پلن بستگی دارند.
- دامنهی اختصاصی و SSLدامنه را اضافه کنید؛ گواهی خودکار صادر و تمدید میشود.
- متغیرهای محیطی و سکرتمقادیر رمزگذاریشده فقط در زمان اجرا به اپ میرسند.
- مرحلهی انتشارmigration بعد از بیلد و پیش از جایگزینی نسخهی قبلی اجرا میشود.
- لاگ زندهلاگ بیلد و زمان اجرا، در CLI و کنسول.
- بازگشت به نسخهی قبلهر استقرار قبلی با یک دستور برمیگردد.
- مقیاسدهیمنابع و تعداد نمونهها را تغییر دهید یا خودکارش کنید.
- دیسک ماندگاربرای فایلهایی که باید بعد از هر استقرار بمانند.
- کرانجابدستور زمانبندیشده با همان ایمیج و متغیرها.
- استقرار خودکار با گیتهر push روی شاخهی هدف بیلد و مستقر میشود.
خطاهای رایج
اپ بالا نمیآید یا مدام ریاستارت میشود
علتاپ با app.run() روی پورت ثابت اجرا شده است.
راهحلپورت را از PORT بخوانید و روی 0.0.0.0 گوش بدهید.
web: gunicorn app:app --bind 0.0.0.0:$PORT
WORKER TIMEOUT در لاگ
علتدرخواستهای طولانی از timeout پیشفرض 30 ثانیهی gunicorn بیشتر طول میکشند.
راهحل--timeout را در Procfile بالا ببرید یا کار طولانی را به صف پسزمینه بسپارید.
gunicorn پیدا نمیشود
علتgunicorn در requirements.txt نیامده است.
راهحلgunicorn را به وابستگیها اضافه کنید.
پاد با OOMKilled متوقف میشود
علتمصرف حافظه از سقف منابع اپ بیشتر شده است.
راهحلحافظه را بیشتر کنید یا مصرف برنامه را پایین بیاورید.
sakoocloud apps scale --memory 1Gi
پرسشهای متداول
flask run را در تولید استفاده کنم؟
نه. سرور توسعه برای یک کاربر طراحی شده؛ gunicorn را استفاده کنید.
تعداد worker ها را چطور تعیین کنم؟
در Procfile با --workers. برای اپهای کوچک 2 کافی است؛ با افزایش CPU اپ، worker ها را بیشتر کنید.
Flask-SQLAlchemy به دیتابیس وصل میشود؟
بله. SQLALCHEMY_DATABASE_URI را برابر DATABASE_URL بگذارید.
جزئیات بیشتر در راهنمای Flask در مستندات و مرجع CLI.