حول المحتوى:
طريقة إعداد VPS، تثبيت Docker، كتابة docker-compose، تهيئة Nginx، وإطلاق الموقع على الإنترنت مع أفضل ممارسات الأمان.
إذا كنت تبحث عن طريقة احترافية لنشر مشروع Django أو FastAPI على سيرفر VPS باستخدام Docker Compose، فهذه المقالة لك. سنشرح خطوة بخطوة كيفية:
سنستخدم المصطلح الإنجليزي الرئيسي Deploy Python VPS Docker ونربطه عمليًا بنشر مشاريع Django و FastAPI على سيرفرات حقيقية.
باستخدام Docker، يمكنك تشغيل مشروعك في بيئة معزولة وقابلة للتكرار على أي سيرفر بدون أن تقلق بشأن اختلاف الإصدارات أو إعداد النظام. مع Docker Compose يمكنك إدارة عدة خدمات (Web App + قاعدة بيانات + Nginx) في ملف واحد.
هذا الأسلوب رائع سواء كنت تنشر:
يفضل استخدام توزيعة Ubuntu LTS (مثل 22.04) لأنها الأكثر شيوعًا في شروحات السيرفرات، وتوجد لها حزم رسمية وموثوقة لـ Docker.
بعد الاتصال بالسيرفر عبر SSH:
sudo apt update && sudo apt upgrade -y
إنشاء مستخدم عادي (اختياري لكنه أفضل أمنيًا):
adduser appuser
usermod -aG sudo appuser
ثم سجل الدخول بالمستخدم الجديد:
su - appuser
على 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 version
إذا لم يكن متوفرًا، يمكن تثبيت الإصدار المستقل من GitHub، لكن غالبًا في توزيعات حديثة لن تحتاج لذلك.
قبل تنفيذ Deploy Python VPS Docker يجب أن يكون مشروعك منظمًا وقابلًا للتشغيل عبر أمر واضح (عادة باستخدام Uvicorn أو Gunicorn).
كما يمكنك مراجعة:
uvicorn main:appيمكننا كتابة Dockerfile موحد تقريبًا لمشاريع Python Web سواء Django أو FastAPI، مع اختلاف بسيط في أمر التشغيل.
# 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
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 إذا كانت نقطة الدخول مختلفة.
الآن سنعرّف خدمات التطبيق، قاعدة البيانات، و Nginx في ملف واحد docker-compose.yml. هذا هو قلب عملية Deploy Python VPS Docker.
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 في نفس مجلد 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 بدل كتابتها مباشرة في الكود.
الآن نحتاج Nginx ليعمل كـ reverse proxy أمام حاوية التطبيق (web) ويستقبل اتصالات HTTP من المنفذ 80 ويحوّلها إلى web:8000.
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 بشكل صحيح.
يمكنك استخدام 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 السيرفر.
لا يُنصح أن يبقى موقعك على HTTP فقط، خصوصًا إذا كان فيه تسجيل دخول أو بيانات حساسة. مع Docker لديك عدة خيارات، من أبسطها استخدام reverse proxy مخصص مثل nginx-proxy + acme-companion أو إعداد certbot مباشرة على السيرفر.
بشكل مبسط يمكنك:
تفاصيل إعداد HTTPS مع Docker قد تحتاج مقالًا منفصلًا، لكن الأهم أن تضعه كخطوة أساسية في استراتيجية Deploy Python VPS Docker.
docker image prune لتنظيف الصور غير المستخدمة.sudo ufw allow OpenSSH
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
في البداية يمكن أن تبدأ بنمط يدوي بسيط للنشر، ثم لاحقًا تنتقل إلى CI/CD كما شرحنا في: نشر مشروع Django على AWS باستخدام CI/CD عملي.
cd /path/to/yourproject
git pull
docker compose build web
docker compose up -d
docker compose logs -f web
عملية Deploy Python VPS Docker لمشاريع Django و FastAPI ليست معقدة إذا قسمتها إلى خطوات:
باتباع هذه الخطوات ستحصل على بيئة نشر مستقرة، قابلة للتوسع، وبأقل مشاكل ممكنة في الإنتاج، سواء لمشروع Django تقليدي، أو API مبني بـ FastAPI.
طريقة إعداد VPS، تثبيت Docker، كتابة docker-compose، تهيئة Nginx، وإطلاق الموقع على الإنترنت مع أفضل ممارسات الأمان.
مساحة اعلانية