Django آمادهی تولید
وجود manage.py کنار فایل وابستگیها یعنی پروژهی Django. ماژول wsgi از روی ساختار پروژه پیدا میشود و gunicorn با دو worker روی پورت اپ اجرا میشود؛ اگر Procfile داشته باشید، همان اجرا میشود.
در هر شروع، python manage.py collectstatic --noinput و migrate قبل از gunicorn اجرا میشوند. برای کنترل دقیقتر migration ها، آنها را به مرحلهی انتشار ببرید تا نسخهی جدید فقط بعد از migration موفق بالا بیاید.
مناسب برای
- پنل مدیریت و بکآفیس
- API با Django REST Framework
- فروشگاه و CMS با Wagtail
- سامانههای دادهمحور
مسیر بیلد Django
تشخیص
manage.pyو یکی از فایلهای وابستگی در ریشه.manage.pyنصب
وابستگیها با ابزار پروژه نصب میشوند.
pip install -r requirements.txtآمادهسازی
فایلهای استاتیک جمع و migration ها اجرا میشوند.
collectstatic · migrateاجرا
gunicorn ماژول wsgi پروژه را اجرا میکند.
gunicorn config.wsgi
خروجی یک استقرار واقعی
sakoocloud deploy ✔ Packed 1.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-django.sakooapps.ir
تنظیمات تولید
میزبانهای مجاز را از محیط بخوانید و WhiteNoise را برای فایلهای استاتیک اضافه کنید.
import os
DEBUG = False
ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", ".sakoocloud.run").split(",")
CSRF_TRUSTED_ORIGINS = ["https://*.sakoocloud.run"]
STATIC_ROOT = BASE_DIR / "staticfiles"
MIDDLEWARE.insert(1, "whitenoise.middleware.WhiteNoiseMiddleware")
web: gunicorn config.wsgi:application --bind 0.0.0.0:$PORT
sakoocloud apps create --name my-django --runtime django --port 8000
sakoocloud deploy
تنظیمات
نسخهی 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 |
اتصال به PostgreSQL
با dj-database-url همان DATABASE_URL تزریقشده را به تنظیمات Django تبدیل کنید.
sakoocloud apps link-db <db-id> --app my-django
import dj_database_url
DATABASES = {
"default": dj_database_url.config(conn_max_age=600),
}
دیتابیسهایی که معمولاً کنارش میآیند
همراه هر استقرار
اینها به رانتایم بستگی ندارند و برای هر اپ روی سکو کلود فعالاند. بعضی، مثل مقیاسدهی خودکار و کرانجاب، به پلن بستگی دارند.
- دامنهی اختصاصی و SSLدامنه را اضافه کنید؛ گواهی خودکار صادر و تمدید میشود.
- متغیرهای محیطی و سکرتمقادیر رمزگذاریشده فقط در زمان اجرا به اپ میرسند.
- مرحلهی انتشارmigration بعد از بیلد و پیش از جایگزینی نسخهی قبلی اجرا میشود.
- لاگ زندهلاگ بیلد و زمان اجرا، در CLI و کنسول.
- بازگشت به نسخهی قبلهر استقرار قبلی با یک دستور برمیگردد.
- مقیاسدهیمنابع و تعداد نمونهها را تغییر دهید یا خودکارش کنید.
- دیسک ماندگاربرای فایلهایی که باید بعد از هر استقرار بمانند.
- کرانجابدستور زمانبندیشده با همان ایمیج و متغیرها.
- استقرار خودکار با گیتهر push روی شاخهی هدف بیلد و مستقر میشود.
خطاهای رایج
خطای DisallowedHost یا ۴۰۰
علتآدرس اپ یا دامنهی شما در ALLOWED_HOSTS نیست.
راهحل.sakoocloud.run و دامنهی خودتان را به ALLOWED_HOSTS اضافه کنید.
CSS و تصویرها لود نمیشوند
علتبا DEBUG = False، Django فایل استاتیک سرو نمیکند.
راهحلWhiteNoise را نصب و در MIDDLEWARE اضافه کنید و STATIC_ROOT را تعریف کنید.
خطای CSRF در فرمها
علتآدرس HTTPS اپ در CSRF_TRUSTED_ORIGINS نیست.
راهحلآدرس کامل با https:// را اضافه کنید.
پاد با OOMKilled متوقف میشود
علتمصرف حافظه از سقف منابع اپ بیشتر شده است.
راهحلحافظه را بیشتر کنید یا مصرف برنامه را پایین بیاورید.
sakoocloud apps scale --memory 1Gi
پرسشهای متداول
migration ها خودکار اجرا میشوند؟
بله، قبل از gunicorn اجرا میشوند. برای کنترل بیشتر، دستور migrate را در مرحلهی انتشار بگذارید.
Celery را کجا اجرا کنم؟
در یک اپ جدا از همان مخزن با Procfile خودش، و صف را روی Redis یا RabbitMQ مدیریتشده بگذارید.
فایلهایی که کاربر آپلود میکند کجا ذخیره شوند؟
در فضای ذخیرهسازی ابری سازگار با S3 با django-storages، یا روی دیسک ماندگار اپ.
Django Channels و ASGI پشتیبانی میشود؟
بله. در Procfile بهجای gunicorn از uvicorn یا daphne با ماژول asgi استفاده کنید.
جزئیات بیشتر در راهنمای Django در مستندات و مرجع CLI.