Skip to main content

اپ جنگو

در این مستند نحوه راه‌اندازی یک اپ جنگو با استفاده از دارکوب را به شما آموزش می‌دهیم.

می‌توانید به جای مطالعه مستند ساخت این اپ، از ویدیو تهیه شده نیز استفاده نمایید.

ساخت virtual environment#

محیط مجازی یا virtual environment و یا venv محیطی است که به شما این امکان را می‌دهد که کد پایتون خود را در محیطی ایزوله و مستقل اجرا کنید و پکیج‌های مورد نظر خود را در آن نصب کنید.

برای ساخت یک virtual environment ابتدا با استفاده از دستور زیر پکیج virtualenv را نصب می‌کنیم.

sudo apt install python3-virtualenv

سپس با دستور زیر یک venv جدید با نام دلخواه django-app می‌سازیم:

virtualenv django-app

حال با دستور زیر تعیین می‌کنیم که pip پکیج‌ها را در محیط مجازی django-app نصب کند.

source django-app/bin/activate

ساخت پروژه جنگو#

با استفاده از دستور زیر پکیج جنگو را در venv خود نصب می‌کنیم:

pip install django

اکنون زمان آن فرا رسیده تا پروژه جنگو خود را بسازیم:

django-admin startproject django_app

در قدم بعد یک اپ با نام app می‌سازیم:

cd django_app
django-admin startapp app

اگر محتویات داخل پوشه django_app را مشاهده کنیم بدین صورت خواهد بود:

django_app
├── app
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── django_app
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

نصب gunicorn#

gunicorn پکیجی‌ است که کاری مشابه دستور runserver را برای ما انجام می‌دهد. اما runserver از چند جهت (امنیت، سرعت و ...) برای محیط عملیاتی مناسب نیست. در نتیجه ما از gunicorn که برای محیط عملیاتی مناسب تر‌است استفاده خواهیم کرد.

ابتدا با دستور زیر gunicorn را نصب می‌کنیم.

pip install gunicorn

حال می‌توانیم برای تست، با استفاده از دستور زیر پروژه خود را روی پورت ۸۰۰۰ بالا بیاوریم:

gunicorn --bind 0.0.0.0:8000 django_app.wsgi

برای افزایش throughput سیستم می‌توانید نوع worker را به انواع async تغییر بدهید. مثلا برای استفاده از تکنولوژی gevent کانفیگ زیر را به gunicorn معرفی کنید و کتابخانه‌های مربوط به gevent را نصب کنید:

# for patching postgresql_psycopg2 driver
def post_fork_fn(server, worker):
from psycogreen.gevent import patch_psycopg
patch_psycopg()
worker_class = "gevent"

قبل از اعمال این تغییر در محیط عملیاتی، ابتدا در محیط توسعه/تست عملکرد سیستم جدید و تطابق کتابخانه‌های مورد استفاده را بررسی کنید.

Gevent Introduction

Gunicorn Async Workers

Gunicorn worker_class Config

آماده سازی فایل settings.py#

لازم است تغییراتی در فایل settings.py اعمال شود.

تنظیمات دیتابیس#

برای استفاده از دیتابیس پستگرس مورد نظرمان لازم است فیلد DATABASES را به شکل زیر تغییر دهیم تا اطلاعات لازم جهت اتصال به دیتابیس را از متغیر‌های محیطی‌ای که در ادامه در دارکوب برای اپ خود تعریف خواهیم کرد دریافت کند.

DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
"NAME": os.getenv("DB_NAME"),
"USER": os.getenv("DB_USER"),
"PASSWORD": os.getenv("DB_PASSWORD"),
"HOST": os.getenv("DB_HOST"),
"PORT": os.getenv("DB_PORT"),
}
}

همچنین لازم است تا پکیج psycopg2 را نصب کنیم:

pip install psycopg2

تنظیمات ALLOWED_HOSTS#

در جنگو لازم است مشخص کنید که اپ شما از طریق چه آدرس‌هایی قابل دسترسی باشد. ما این مقدار را از طریق متغیر‌های محیطی به شکل زیر دریافت خواهیم کرد.

ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS").split(",")

در ادامه مقادیر این متغیر‌های محیطی را در دارکوب تعریف خواهیم کرد.

تنظیمات SECRET_KEY#

از آنجایی که SECRET_KEY محرمانه‌است و نباید در دسترس کسی قرار بگیرد، لازم است تا به جای قرار دادن آن در داخل کد، آن را از متغیر‌های محیطی دریافت کنیم. فلذا خط زیر را در فایل settings.py جایگزین می‌کنیم:

SECRET_KEY = os.getenv("SECRET_KEY")

آماده‌سازی فایل requirements.txt#

در این مرحله با استفاده از دستور زیر پکیج‌هایی را که تا به حال نصب کرده‌ایم، در فایل requirements.txt وارد می‌کنیم:

pip freeze > requirements.txt

آماده‌سازی داکرفایل#

در این مرحله لازم است یک داکرفایل ساده در پروژه خود اضافه کنیم تا دارکوب با استفاده از آن پروژه ما را بیلد و دیپلوی کند.

محتویات داکرفایل ما به صورت زیر خواهد بود:

FROM hub.hamdocker.ir/library/python:3.8
WORKDIR /django_app/
ADD ./requirements.txt ./
RUN pip install -r ./requirements.txt
ADD ./ ./
ENTRYPOINT ["/bin/sh", "-c" , "python manage.py migrate && gunicorn --bind 0.0.0.0:8000 django_app.wsgi"]

در خط اول نام آدرس ایمیج مورد نظر خود را وارد می‌کنیم که همان طور که واضح است از ایمیج آماده‌ی پایتون ۳.۸ استفاده کرده‌ایم.

در خط دوم مشخص می‌کنیم که می‌خواهیم در کدام آدرس دستورات مورد نظرمان اجرا شود.

در خط سوم فایل requirements.txt را در کانتینر و در دایرکتوری /django_app/ کپی می‌کنیم.

در خط چهارم پکیج‌هایی که در فایل requirements.txt مشخص کرده‌ایم را نصب می‌کنیم.

در خط پنجم تمامی محتویات ریپو را در مسیر /django_app/ کانتینر کپی می‌کنیم.

در خط آخر ابتدا مایگریشین‌های دیتابیس را اجرا می‌کنیم و سپس در دستور دوم، با استفاده از gunicorn اپ خود را روی پورت 8000 بالا می‌آوریم.

انتقال به ریپو هم‌گیت#

پروژه ما آماده است. دیگر تنها کافی‌است که پروژه خود را در یک ریپو هم‌گیت پوش کنیم و در مرحله‌ آخر نیز اپ خود را در دارکوب بسازیم.

برای این کار ابتدا در اکانت هم‌گیت خود یک پروژه جدید با نام django_app می‌سازیم و سپس با استفاده از دستورات زیر ریپو خود را در همگیت پوش می‌کنیم.

git init
git remote add origin <repo_url>
git add .
git commit -m "Initial commit"
git push origin master

ساخت دیتابیس#

از آنجایی که ‌‌می‌خواهیم از دیتابیس پستگرس برای اپ خود استفاده کنیم لازم است تا از طریق دارکوب این دیتابیس را بسازیم.

در قدم اول لازم است تا در دارکوب یک سازمان برای خود بسازید. پس از ثبت نام در کنسول هم‌روش وارد قسمت دارکوب شوید و برای خود یک سازمان بسازید.

سپس روی دکمه افزودن اپ کلیک کنید و با استفاده از راهنمای ساخت دیتابیس پستگرس دیتابیس خود را بسازید.

ساخت اپ در دارکوب#

پس از ساخت دیتابیس، برای ساخت اپ خود مجددا روی افزودن اپ کلیک و نوع اپ خود را «منبع گیت» انتخاب می‌کنیم.

سپس آدرس ریپو و برنچ مورد نظر را وارد می‌کنیم. از آنجایی که می‌خواهیم با هر بار پوش کردن در مستر اپ ما به‌روز‌رسانی شود گزینه «دیپلوی خودکار بعد از push کردن» را فعال می‌کنیم.

در قدم بعد یکی از پلن‌ها را انتخاب می‌کنیم.

در مرحله آخر ابتدا برای اپ خود اسمی انتخاب می‌کنیم.

با توجه به دستوری که برای اجرای gunicorn وارد کردیم، اپ ما روی پورت ۸۰۰۰ بالا خواهد آمد، پس در قسمت پورت مقدار ۸۰۰۰ را وارد می‌کنیم.

اطلاعات عمومی جنگو

حال از طریق تب آدرس هاست آدرسی که می‌خواهیم اپ‌مان روی آن بالا بیاید را وارد می‌کنیم.

به طور مثال ما از آدرس my-django-app.darkube.app استفاده می‌کنیم.

هاست جنگو

اضافه کردن متغیر‌های محیطی#

لازم است تا متغیر‌های محیطی‌ای را که در قسمت‌های قبل تعریف کردیم، مقدار‌دهی کنیم. برای این‌ کار در تب environment variables مقادیر لازم برای اتصال به دیتابیس و مقدار ALLOWED_HOSTS را وارد می‌کنیم:

متغیر محیطی جنگو

حال روی دکمه ذخیره و دیپلوی کلیک می‌کنیم و منتظر ساخته شدن اپ می‌شویم. بیلد شدن و در دسترس قرار گرفتن اپ ممکن است چند ثانیه تا چند دقیقه به طول بیانجامد .

پس از ساخت اپ به آدرس فوق مراجعه می‌کنیم و مشاهده می‌کنیم که اپ در آدرس مورد نظر در دسترس است.

صفحه اول جنگو

حال با خیال راحت به توسعه اپ خود بپردازید :)