لماذا تستضيف FastAPI ذاتيًا على VPS؟
يستمد FastAPI كل أدائه من نموذج ASGI غير المتزامن: اتصالات WebSocket دائمة، وبث للاستجابات، واستدعاءات متزامنة لخدمات أخرى. وغالبًا ما تقطع منصات serverless الاتصالات الطويلة وتفوتر كل طلب، ما يضرّ بواجهة API عالية الإنتاجية أو تعمل في الوقت الفعلي. على VPS، تشغّل Uvicorn بإدارة Gunicorn بعدد workers يساوي عدد الأنوية، وتُبقي الاتصالات مفتوحة طالما لزم الأمر، وتضع Nginx في الواجهة لأجل TLS والتخزين المؤقت (buffering). كما تتحكم في مجمّع الاتصالات نحو PostgreSQL وفي ذاكرة Redis المؤقتة، وهما رافعتان أساسيتان لتحمّل آلاف الطلبات في الثانية.
فوائد ملموسة لاستضافة FastAPI ذاتيًا
- WebSockets وServer-Sent Events دون قطع الاتصال أو timeout مفروض.
- ضبط دقيق لـworkers الخاصة بـUvicorn/Gunicorn وفق عدد أنوية VPS.
- زمن استجابة منخفض وقابل للتوقّع، دون بدء بارد (cold start) الخاص بـserverless.
- وثائق Swagger وReDoc تُقدَّم داخليًا، متاحة أو محمية حسب رغبتك.
- تكامل مباشر مع مجمّع PostgreSQL غير متزامن (asyncpg) ومع Redis.
- تكلفة ثابتة بغض النظر عن عدد استدعاءات API، مثالية لخلفية (backend) إنتاجية.
المتطلبات المسبقة للعتاد والبرمجيات
واجهة FastAPI خفيفة: يكفي 1 vCPU و1 غيغابايت من ذاكرة RAM للبدء، لكن استهدف 2 vCPU و2 غيغابايت بمجرد إضافة قاعدة بيانات وذاكرة تخزين مؤقت على نفس VPS. ثبّت Python 3.11+ أو استخدم Docker مع صورة python:3.11-slim. جهّز Uvicorn مع الـworker uvicorn.workers.UvicornWorker، وGunicorn كمدير عمليات، وNginx للبروكسي العكسي. يلزم نطاق مُوجَّه نحو VPS للحصول على شهادة TLS. ونظام Ubuntu 22.04/24.04 LTS هو الأساس المُوصى به.
نشر FastAPI خطوة بخطوة
تهيئة VPS والتطبيق
اتصل عبر SSH، وثبّت Docker، واستنسخ مستودعك، وأنشئ ملف .env يضم متغيرات البيئة (رابط قاعدة البيانات، مفاتيح API، أصل CORS). تأكّد من أن نقطة الدخول تكشف فعلًا app = FastAPI().
التعبئة في حاوية باستخدام Uvicorn وGunicorn
في ملف Dockerfile، ثبّت الاعتماديات ثم شغّل gunicorn main:app -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000 --workers 4. والعدد المثالي للـworkers هو عادةً (2 × cœurs) + 1.
تنسيق الخدمات
في docker-compose.yml، عرّف خدمة api وخدمة db بـPostgreSQL وخدمة redis. استخدم depends_on وفحص سلامة (healthcheck) كي تنتظر الـAPI جاهزية قاعدة البيانات قبل أن تبدأ.
وضع Nginx كبروكسي عكسي
اضبط كتلة خادم بـproxy_pass http://api:8000، ولأجل WebSockets أضف proxy_set_header Upgrade $http_upgrade وproxy_set_header Connection "upgrade". عطّل التخزين المؤقت (buffering) للبث عند الحاجة.
التأمين بشهادة TLS
احصل على شهادة Let's Encrypt عبر Certbot أو حاوية companion، وافرض HTTPS وأعد توجيه HTTP. وتذكّر تقييد الوصول إلى /docs و/openapi.json في الإنتاج إذا لم تكن الـAPI عامة.
التشغيل والاختبار
ابدأ باستخدام docker compose up -d، وتحقّق من السلامة عبر نقطة النهاية /health التي أضفتها، واختبر الوثائق التفاعلية. راقب سجلات Uvicorn لضبط عدد الـworkers تحت الحِمل الفعلي.
بالنسبة إلى المهام الطويلة (إرسال رسائل البريد الإلكتروني، معالجة الصور، الاستدعاءات الخارجية البطيئة)، لا تحجب حلقة الأحداث (event loop): انقلها إلى worker يعمل في الخلفية باستخدام BackgroundTasks للحالات البسيطة، أو إلى Celery/ARQ مع Redis للمعالجات الثقيلة. فواجهة API تستجيب بسرعة وتفوّض العمل غير المتزامن تبقى سريعة الاستجابة حتى تحت التزامن العالي.