ديف أوبس

إعداد Django مع Uvicorn وPostgres

إعداد تطبيق ASGI Django للنشر مع Postgres وخادم Nginx باستخدام Uvicorn

مقدمة

في عالم تطوير تطبيقات الويب الحديثة، يعتبر استخدام بروتوكول ASGI (Asynchronous Server Gateway Interface) من الحلول الرائدة لدعم الأداء العالي في تطبيقات Django، خصوصًا عند العمل مع تطبيقات تحتاج إلى التعامل مع الاتصالات غير المتزامنة مثل WebSockets أو عمليات الاستجابة المتوازية. ولكن إعداد Django للعمل في بيئة الإنتاج مع قاعدة بيانات Postgres وخادم Nginx يتطلب فهمًا عميقًا للبنية التحتية للتطبيقات الحديثة، بالإضافة إلى بعض الأدوات الأساسية مثل Uvicorn و Daphne. في هذا المقال، سوف نغطي كيفية إعداد تطبيق Django ASGI للنشر باستخدام Uvicorn كخادم ASGI و Postgres كقاعدة بيانات في بيئة الإنتاج.

1. التحضير للتطبيق

تثبيت المتطلبات

أولًا، تأكد من أن لديك بيئة Python مُهيئة بشكل صحيح على جهازك. يمكنك استخدام virtualenv لعزل بيئة التطبيق:

bash
python3 -m venv venv source venv/bin/activate

ثم قم بتثبيت مكتبات Django و Uvicorn و psycopg2 (لتعامل Django مع قاعدة بيانات Postgres):

bash
pip install django uvicorn psycopg2

إذا كنت تخطط لاستخدام Daphne كخادم بديل لـ Uvicorn، يمكن تثبيته كالتالي:

bash
pip install daphne

إعداد تطبيق Django

ابدأ بإنشاء تطبيق Django جديد (أو استخدم التطبيق القائم إذا كان لديك واحد بالفعل):

bash
django-admin startproject myproject cd myproject

تكوين إعدادات Django للـ ASGI

افترض أن المشروع يعمل بنظام ASGI وليس WSGI. في الإصدار 3.0 من Django وما بعده، أصبح دعم ASGI متاحًا بشكل افتراضي. يمكنك إعداد التطبيق ليدعم ASGI عن طريق تعديل الملف asgi.py داخل مجلد المشروع (الذي يتم إنشاؤه تلقائيًا):

python
# myproject/asgi.py import os from django.core.asgi import get_asgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') application = get_asgi_application()

2. إعداد قاعدة بيانات Postgres

تثبيت Postgres

لتشغيل التطبيق في بيئة الإنتاج، سنحتاج إلى قاعدة بيانات PostgreSQL. يمكن تثبيت Postgres على الخادم باستخدام apt أو yum حسب نظام التشغيل الخاص بك:

على Ubuntu:

bash
sudo apt update sudo apt install postgresql postgresql-contrib

على CentOS:

bash
sudo yum install postgresql-server postgresql-contrib

إعداد قاعدة البيانات في Postgres

بعد تثبيت PostgreSQL، يجب إنشاء قاعدة بيانات ومستخدم خاص بتطبيق Django:

  1. قم بالدخول إلى قاعدة البيانات كـ postgres:

    bash
    sudo -u postgres psql
  2. أنشئ قاعدة البيانات والمستخدم:

    sql
    CREATE DATABASE myprojectdb; CREATE USER myprojectuser WITH PASSWORD 'password'; ALTER ROLE myprojectuser SET client_encoding TO 'utf8'; ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed'; ALTER ROLE myprojectuser SET timezone TO 'UTC'; GRANT ALL PRIVILEGES ON DATABASE myprojectdb TO myprojectuser;
  3. ثم قم بتحديث إعدادات DATABASES في ملف settings.py في مشروع Django لاستخدام قاعدة بيانات Postgres:

python
# myproject/settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'myprojectdb', 'USER': 'myprojectuser', 'PASSWORD': 'password', 'HOST': 'localhost', # يمكن تغييره إذا كانت قاعدة البيانات على خادم آخر 'PORT': '5432', } }

تشغيل الترحيلات

قم بتشغيل الترحيلات لتحضير قاعدة البيانات:

bash
python manage.py migrate

3. إعداد خادم Uvicorn

بما أن Uvicorn هو الخادم الذي يدير تطبيق ASGI في بيئة الإنتاج، يجب أن يتم تثبيته وتكوين تشغيله بالشكل الصحيح. لتشغيله مع Django، يمكنك استخدام الأمر التالي:

bash
uvicorn myproject.asgi:application --host 0.0.0.0 --port 8000

بذلك، سيكون تطبيقك جاهزًا للاستماع على المنفذ 8000. بالطبع، في بيئة الإنتاج، ستحتاج إلى تهيئة Nginx للتوجيه إلى Uvicorn بشكل صحيح.

4. إعداد Nginx

تثبيت Nginx

إذا لم يكن لديك Nginx مثبتًا بعد، قم بتثبيته باستخدام:

bash
sudo apt update sudo apt install nginx

تكوين Nginx للاتصال بـ Uvicorn

بعد تثبيت Nginx، يجب عليك تعديل ملف إعدادات Nginx ليقوم بتوجيه طلبات HTTP إلى تطبيق Django الذي يعمل مع Uvicorn.

  1. قم بإنشاء ملف إعدادات جديد في مجلد /etc/nginx/sites-available/:

bash
sudo nano /etc/nginx/sites-available/myproject
  1. أضف التكوين التالي في الملف:

nginx
server { listen 80; server_name example.com; # استخدم اسم النطاق الخاص بك location / { proxy_pass http://127.0.0.1:8000; # توجيه الطلبات إلى Uvicorn proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /static/ { alias /path/to/static/; # المسار الكامل إلى مجلد static } location /media/ { alias /path/to/media/; # المسار الكامل إلى مجلد media } }
  1. قم بإنشاء رابط رمزي لتمكين الموقع:

bash
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
  1. تحقق من إعدادات Nginx وأعد تحميله:

bash
sudo nginx -t sudo systemctl reload nginx

5. إعداد Gunicorn (اختياري)

في بعض الحالات، قد ترغب في إضافة Gunicorn كخادم إضافي بين Nginx و Uvicorn. رغم أن Uvicorn هو خادم ASGI الأساسي، قد يكون Gunicorn مفيدًا عندما تحتاج إلى معالجة إضافية للأداء.

يمكنك تثبيت Gunicorn عن طريق:

bash
pip install gunicorn

ثم قم بتشغيله:

bash
gunicorn -w 4 myproject.asgi:application

6. تشغيل التطبيق في بيئة الإنتاج

أخيرًا، يمكنك تشغيل تطبيقك في بيئة الإنتاج باستخدام أدوات مثل Supervisor أو systemd لإدارة عملية Uvicorn.

إعداد Supervisor

  1. قم بتثبيت Supervisor:

bash
sudo apt install supervisor
  1. قم بإنشاء ملف تكوين لـ Supervisor:

bash
sudo nano /etc/supervisor/conf.d/myproject.conf
  1. أضف التكوين التالي:

ini
[program:myproject] command=uvicorn myproject.asgi:application --host 0.0.0.0 --port 8000 directory=/path/to/myproject autostart=true autorestart=true stderr_logfile=/var/log/myproject.err.log stdout_logfile=/var/log/myproject.out.log
  1. قم بتحديث Supervisor وإعادة تشغيل التطبيق:

bash
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start myproject

7. ختام

بذلك، تكون قد أكملت إعداد تطبيق Django باستخدام ASGI مع Uvicorn و Postgres على Nginx في بيئة الإنتاج. هذه البيئة توفر أداءً عاليًا مع دعم الاتصالات غير المتزامنة وتكاملًا سلسًا مع قاعدة بيانات Postgres.