نشر مشاريع Django و FastAPI على VPS باستخدام Docker Compose خطوة بخطوة

نشر مشاريع Django و FastAPI على VPS باستخدام Docker Compose خطوة بخطوة

إذا كنت تبحث عن طريقة احترافية لنشر مشروع Django أو FastAPI على سيرفر VPS باستخدام Docker Compose، فهذه المقالة لك. سنشرح خطوة بخطوة كيفية:

  • إعداد VPS وتجهيزه
  • تثبيت Docker و Docker Compose
  • كتابة ملفات Dockerfile و docker-compose.yml
  • تهيئة Nginx كـ reverse proxy
  • ربط الدومين واستخدام HTTPS (باختصار)
  • تطبيق أفضل ممارسات الأمان والتنظيم

سنستخدم المصطلح الإنجليزي الرئيسي Deploy Python VPS Docker ونربطه عمليًا بنشر مشاريع Django و FastAPI على سيرفرات حقيقية.

لماذا Docker و Docker Compose في نشر مشاريع بايثون؟

باستخدام Docker، يمكنك تشغيل مشروعك في بيئة معزولة وقابلة للتكرار على أي سيرفر بدون أن تقلق بشأن اختلاف الإصدارات أو إعداد النظام. مع Docker Compose يمكنك إدارة عدة خدمات (Web App + قاعدة بيانات + Nginx) في ملف واحد.

هذا الأسلوب رائع سواء كنت تنشر:

الخطوة 1: تجهيز VPS لنشر مشروع Python باستخدام Docker

اختيار نظام التشغيل

يفضل استخدام توزيعة Ubuntu LTS (مثل 22.04) لأنها الأكثر شيوعًا في شروحات السيرفرات، وتوجد لها حزم رسمية وموثوقة لـ Docker.

تحديث النظام

بعد الاتصال بالسيرفر عبر SSH:

sudo apt update && sudo apt upgrade -y

إنشاء مستخدم عادي (اختياري لكنه أفضل أمنيًا):

adduser appuser
usermod -aG sudo appuser

ثم سجل الدخول بالمستخدم الجديد:

su - appuser

الخطوة 2: تثبيت Docker و Docker Compose على VPS

تثبيت Docker Engine

على Ubuntu، يمكنك استخدام السكربت الرسمي:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

إضافة المستخدم الحالي لمجموعة docker لتشغيل الأوامر بدون sudo:

sudo usermod -aG docker $USER
# سجّل الخروج ثم الدخول مرة أخرى أو:
newgrp docker

تثبيت Docker Compose

في الإصدارات الحديثة، غالبًا يكون Docker Compose مدمجًا كـ docker compose:

docker compose version

إذا لم يكن متوفرًا، يمكن تثبيت الإصدار المستقل من GitHub، لكن غالبًا في توزيعات حديثة لن تحتاج لذلك.

الخطوة 3: تجهيز مشروع Django/FASTAPI للنشر

قبل تنفيذ Deploy Python VPS Docker يجب أن يكون مشروعك منظمًا وقابلًا للتشغيل عبر أمر واضح (عادة باستخدام Uvicorn أو Gunicorn).

مثال لمشروع Django

  • ملف manage.py
  • مجلد المشروع core/ يحتوي على settings.py، urls.py، إلخ.
  • تأكد من إعداد:
    • ALLOWED_HOSTS ليشمل الدومين أو IP
    • استخدام متغيرات بيئة لبيانات السرية (SECRET_KEY, DB, DEBUG)

كما يمكنك مراجعة:

مثال لمشروع FastAPI

الخطوة 4: كتابة Dockerfile لمشروع Django أو FastAPI

يمكننا كتابة Dockerfile موحد تقريبًا لمشاريع Python Web سواء Django أو FastAPI، مع اختلاف بسيط في أمر التشغيل.

Dockerfile لمشروع Django (مع Gunicorn)

# Dockerfile

FROM python:3.12-slim

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

WORKDIR /app

RUN apt-get update && apt-get install -y build-essential libpq-dev \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

RUN python manage.py collectstatic --noinput

CMD ["gunicorn", "core.wsgi:application", "-b", "0.0.0.0:8000", "--workers", "3"]

استبدل core.wsgi:application باسم مشروعك الحقيقي.

Dockerfile لمشروع FastAPI (Uvicorn Workers)

# Dockerfile

FROM python:3.12-slim

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

WORKDIR /app

RUN apt-get update && apt-get install -y build-essential \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "3"]

استبدل main:app إذا كانت نقطة الدخول مختلفة.

الخطوة 5: إعداد docker-compose.yml لربط الخدمات

الآن سنعرّف خدمات التطبيق، قاعدة البيانات، و Nginx في ملف واحد docker-compose.yml. هذا هو قلب عملية Deploy Python VPS Docker.

مثال docker-compose لمشروع Django + PostgreSQL + Nginx

version: "3.9"

services:
  web:
    build: .
    container_name: app_web
    command: gunicorn core.wsgi:application -b 0.0.0.0:8000 --workers 3
    env_file:
      - .env
    volumes:
      - static_volume:/app/staticfiles
      - media_volume:/app/media
    depends_on:
      - db

  db:
    image: postgres:15
    container_name: app_db
    restart: always
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    volumes:
      - db_data:/var/lib/postgresql/data

  nginx:
    image: nginx:alpine
    container_name: app_nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
      - static_volume:/app/staticfiles
      - media_volume:/app/media
    depends_on:
      - web

volumes:
  db_data:
  static_volume:
  media_volume:

نفس الفكرة يمكن تطبيقها لمشروع FastAPI مع تغيير أمر التشغيل في خدمة web وأي تفاصيل تخص المسارات.

ملف .env لمتغيرات البيئة

أنشئ ملف .env في نفس مجلد docker-compose.yml:

DEBUG=0
SECRET_KEY=some-very-secret-key
ALLOWED_HOSTS=yourdomain.com,localhost,127.0.0.1

DB_NAME=mydb
DB_USER=myuser
DB_PASSWORD=mypassword
DB_HOST=db
DB_PORT=5432

ثم استخدم هذه المتغيرات في إعدادات Django أو FastAPI بدل كتابتها مباشرة في الكود.

الخطوة 6: إعداد Nginx كـ Reverse Proxy مع Docker

الآن نحتاج Nginx ليعمل كـ reverse proxy أمام حاوية التطبيق (web) ويستقبل اتصالات HTTP من المنفذ 80 ويحوّلها إلى web:8000.

ملف nginx.conf

server {
    listen 80;
    server_name yourdomain.com;

    client_max_body_size 50M;

    location /static/ {
        alias /app/staticfiles/;
    }

    location /media/ {
        alias /app/media/;
    }

    location / {
        proxy_pass http://web:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

تأكد من أن اسم خدمة التطبيق في docker-compose هو web ليعمل proxy_pass بشكل صحيح.

الخطوة 7: نسخ المشروع إلى VPS وتشغيل Docker Compose

رفع المشروع للسيرفر

يمكنك استخدام git:

git clone https://github.com/youruser/yourproject.git
cd yourproject

أو استخدام scp أو أي أداة لنقل الملفات.

بناء وتشغيل الحاويات

من داخل مجلد المشروع الذي يحتوي docker-compose.yml:

docker compose build
docker compose up -d

للتحقق من حالة الحاويات:

docker compose ps

ومشاهدة السجلات إن لزم:

docker compose logs -f

الآن يمكنك زيارة http://your_server_ip/ أو الدومين إذا كان موجهًا إلى IP السيرفر.

الخطوة 8: إعداد HTTPS باستخدام Let’s Encrypt (اختياري لكن مهم)

لا يُنصح أن يبقى موقعك على HTTP فقط، خصوصًا إذا كان فيه تسجيل دخول أو بيانات حساسة. مع Docker لديك عدة خيارات، من أبسطها استخدام reverse proxy مخصص مثل nginx-proxy + acme-companion أو إعداد certbot مباشرة على السيرفر.

بشكل مبسط يمكنك:

  1. إغلاق المنفذ 80 من Nginx داخل Docker مؤقتًا
  2. تثبيت certbot على السيرفر Ubuntu
  3. إصدار شهادة لـ yourdomain.com
  4. تعديل nginx.conf لاستخدام ملفات الشهادة (ssl_certificate و ssl_certificate_key)

تفاصيل إعداد HTTPS مع Docker قد تحتاج مقالًا منفصلًا، لكن الأهم أن تضعه كخطوة أساسية في استراتيجية Deploy Python VPS Docker.

أفضل ممارسات الأمان عند استخدام Docker على VPS

  • عدم تشغيل الحاويات كمستخدم root داخلها إن أمكن؛ استخدم USER في Dockerfile لمستخدم عادي.
  • تقييد المنافذ المكشوفة؛ اجعل الحاويات تتواصل بعضها داخليًا، وافتح فقط المنفذ 80/443 من حاوية Nginx للعالم الخارجي.
  • تحديث الصور باستمرار:
    • تحديث base image في Dockerfile بشكل دوري.
    • تشغيل: docker image prune لتنظيف الصور غير المستخدمة.
  • التعامل الصحيح مع الأسرار (Secrets):
    • لا ترفع ملف .env إلى GitHub.
    • استخدم بيئة السيرفر لمتغيرات البيئة الحساسة.
  • استخدام جدار ناري (UFW) على Ubuntu:
    sudo ufw allow OpenSSH
    sudo ufw allow 80
    sudo ufw allow 443
    sudo ufw enable
    

نصائح عملية لتحسين الأداء والموثوقية

  • الـ Workers وعددها:
    • في Gunicorn/ Uvicorn: اختر عدد workers مناسبًا حسب عدد الـ CPU (مثلاً 2–4).
    • لا ترفع العدد بشكل مبالغ حتى لا تجهد السيرفر.
  • تهيئة Timeouts في Nginx وGunicorn لتجنب تعليق الاتصالات الطويلة.
  • استخدام الـ Healthchecks في Docker Compose (اختياري) لمراقبة صحة الحاويات وإعادة تشغيلها عند الفشل.
  • استخدام بيئة staging على VPS منفصل أو على نفس السيرفر لكن ببورت مختلف لاختبار الإصدارات قبل النشر على الإنتاج.

تحديث الكود ونشر نسخ جديدة (CI/CD بسيط)

في البداية يمكن أن تبدأ بنمط يدوي بسيط للنشر، ثم لاحقًا تنتقل إلى CI/CD كما شرحنا في: نشر مشروع Django على AWS باستخدام CI/CD عملي.

نمط نشر يدوي بسيط

  1. على جهاز التطوير: ادفع (push) التعديلات إلى GitHub أو GitLab.
  2. على السيرفر:
    cd /path/to/yourproject
    git pull
    docker compose build web
    docker compose up -d
    
  3. تحقق من السجلات للتأكد من أن كل شيء يعمل:
    docker compose logs -f web
    

متى تختار Django أو FastAPI مع Docker وVPS؟

  • Django مناسب إذا:
  • FastAPI مناسب إذا:
    • أغلب عملك هو APIs عالية الأداء.
    • تحتاج دعمًا قويًا لـ async و background tasks.
    • تهتم بأداء أعلى وLatency أقل كما في تطبيقات المايكروسيرفس.

خلاصة: Deploy Python VPS Docker باحترافية

عملية Deploy Python VPS Docker لمشاريع Django و FastAPI ليست معقدة إذا قسمتها إلى خطوات:

  1. إعداد VPS وتثبيت Docker/Docker Compose.
  2. كتابة Dockerfile منظم لمشروعك.
  3. إعداد docker-compose.yml لربط التطبيق، قاعدة البيانات، وNginx.
  4. تهيئة Nginx كـ reverse proxy وخدمة ملفات static/media.
  5. تشغيل الحاويات، ربط الدومين، وإعداد HTTPS.
  6. تطبيق أفضل ممارسات الأمان والتحديث المستمر.

باتباع هذه الخطوات ستحصل على بيئة نشر مستقرة، قابلة للتوسع، وبأقل مشاكل ممكنة في الإنتاج، سواء لمشروع Django تقليدي، أو API مبني بـ FastAPI.

حول المحتوى:

طريقة إعداد VPS، تثبيت Docker، كتابة docker-compose، تهيئة Nginx، وإطلاق الموقع على الإنترنت مع أفضل ممارسات الأمان.

هل كان هذا مفيدًا لك؟

أضف تعليقك