من الصفر إلى الإنتاج: FastAPI على Fly.io و GitHub Actions

تقوم بدفع الكود إلى الفرع الرئيسي (main). تُشغل الاختبارات. وتصبح واجهة برمجة التطبيقات (API) الخاصة بك متاحة مباشرة بعد دقائق قليلة.

هكذا تبني مسار نشر (deployment pipeline) احترافي. لا تحتاج إلى قاعدة بيانات أو Redis لهذا الإعداد. كل ما تحتاجه هو تطبيق FastAPI واحد، وصورة Docker واحدة، وملف إعداد YAML واحد، وسير عمل (workflow) واحد في GitHub Actions.

يبدو سير العمل كالتالي: git push → GitHub Actions → تشغيل الاختبارات → بناء الصورة → النشر على Fly.io → مباشر (live)

يتكون هذا النظام من ثلاثة أجزاء:

  • تطبيق FastAPI الخاص بك. تقوم بتغليفه في صورة Docker ليعمل بنفس الطريقة في كل مكان.
  • Fly.io. يقوم بتشغيل صورتك على أجهزة صغيرة، ويتولى عمليات التوجيه (routing) وفحوصات الحالة (health checks) نيابة عنك.
  • GitHub Actions. يراقب الكود الخاص بك ويقوم بالنشر تلقائيًا عند كل عملية دفع (push).

لجعل هذا الإعداد آمنًا، استخدم رمز نشر محدود النطاق (scoped deploy token). لا تستخدم رمز Fly API الشخصي الخاص بك. قم بإنشاء رمز يمتلك صلاحية الوصول إلى تطبيق واحد محدد فقط. قم بتخزين هذا الرمز في GitHub Secrets تحت اسم FLY_API_TOKEN.

تفاصيل تقنية رئيسية لإعدادك:

  • استخدم Dockerfile مع مستخدم غير جذر (non-root user). هذا يعزز الأمان.
  • اربط تطبيقك بالعنوان 0.0.0.0 في ملف Dockerfile الخاص بك. إذا استخدمت 127.0.0.1، فلن يتمكن Fly من الوصول إلى تطبيقك.
  • استخدم ملف fly.yaml. هذا الملف هو "المصدر الوحيد للحقيقة" (source of truth)؛ حيث يحدد المنطقة (region)، والذاكرة، والمنفذ (port).
  • قم بإعداد نقطة نهاية لفحص الحالة (health check endpoint) في FastAPI. يستخدم Fly هذا للتأكد من أن تطبيقك يعمل قبل توجيه حركة المرور (traffic) إليه، مما يسمح بعمليات نشر دون أي توقف (zero-downtime deployments).

في سير عمل GitHub Actions، استخدم الأمر needs: test. يضمن ذلك عدم نشر تطبيقك إلا إذا اجتازت الاختبارات بنجاح. إذا كان الكود معطلاً، سيتوقف مسار النشر قبل أن يصل إلى مرحلة الإنتاج.

هذا الإعداد يتوسع معك. يمكنك إضافة بيئات تجريبية (staging) وبيئات إنتاج (production) باستخدام ملفات إعداد مختلفة مثل fly.stg.yaml و fly.prod.yaml.

توقف عن النشر يدويًا. انتقل من مرحلة "يعمل على جهازي المحمول" إلى مرحلة "يتم إطلاقه مع كل عملية دمج (merge)".

المصدر: https://dev.to/devded/zero-to-production-fastapi-on-flyio-and-github-actions-1ejo