المشكلة: صورة تعمل ليست خدمة تعمل
بناء API نظيفاً في صورة حاوية هو الـ 20 بالمئة السهلة؛ إيصاله إلى الإنتاج هو الـ 80 الأخرى. تقليدياً يعني ذلك استئجار خادم افتراضي، وتثبيت بيئة تشغيل، وتهيئة بروكسي عكسي، والحصول على شهادات TLS وتجديدها، وفتح المنافذ الصحيحة، وإضافة مدير عمليات كي يعيد التطبيق التشغيل عند التعطل، وربط جمع السجلات، والوقوف حارساً ضد المهاجمين الذين يجدون الصندوق خلال ساعات من اتصاله بالإنترنت. كل واحدة من تلك الخطوات عمل بنية غير مميِّز لا علاقة له بوظيفة الـ API الفعلية، وكل منها مكان لأخطاء أمنية أو موثوقية دقيقة. وُجدت تطبيقات الحاويات لتطوي تلك القائمة كلها إلى بضعة حقول.
كيف تحلها cdn.com.tr: حاويات مُدارة خلف الحافة
تعطي المنصة صورة ومنفذاً و healthcheck، فتشغّل الحاوية، وتوجّه الحركة إليها عبر الحافة، وتبقيها حية. يُتولى TLS بـ Auto SSL، ونقطة الدخول العامة هي مسار الحافة لا الحاوية الخام، ويصفّي الـ WAF الحركة الخبيثة قبل أن تصل إلى خدمتك. تأتي التهيئة كمتغيرات بيئة وأسرار تُحقَن وقت التشغيل، والتوسع عدد نسخ تضبطه، والسجلات والحالة تُعرَض في اللوحة. النتيجة أن الشيء الوحيد المسؤول عنه هو صورة تطبيقك؛ أما مخاوف الخادم والبروكسي والشهادة والجدار الناري فتمتصها المنصة.
healthchecks: شبكة أمان النشر
الـ healthcheck هو ما يحوّل النشر من أمنية إلى عملية محكومة. عندما تدفع إصداراً جديداً، تبدأ المنصة الحاوية وتستطلع نقطة نهاية الصحة لديك، ولا توجّه الحركة إلى النسخة الجديدة إلا عندما تبلّغ تلك النقطة عن سلامتها. البناء الذي يتعطل عند الإقلاع، أو لا يصل إلى قاعدة بياناته، أو تنقصه أسرار مطلوبة يفشل في الفحص ولا يُوضَع في الدوران، فيُلتقط النشر السيئ عند الطرح بدلاً من التقاطه من مستخدميك. لهذا ينبغي أن يتحقق الـ healthcheck من جاهزية حقيقية — الاعتماديات قابلة للوصول، التهيئة موجودة — بدلاً من مجرد إعادة 200 دون شرط. الـ healthcheck الجاد هو الفرق بين إعادات نشر آمنة وانقطاعات صامتة.
البيئة مقابل الأسرار: تهيئة بلا تسريبات
تحتاج واجهات الـ API تهيئة — عناوين قواعد البيانات، ومفاتيح الأطراف الثالثة، وأعلام الميزات — والطريقة الخاطئة لتوفيرها هي دمجها في الصورة أو إيداعها في المستودع، حيث تعيش للأبد في الطبقات والتاريخ. تفصل المنصة متغيرات البيئة العادية عن الأسرار: الإعدادات غير الحساسة تدخل كبيئة، بينما كلمات المرور والرموز ومفاتيح API تُخزَّن كأسرار وتُحقَن وقت التشغيل بالمفتاح، ولا تُعرَض مجدداً ولا تُكتَب في بنائك. هذا يعني أن الصورة نفسها يمكن أن تنتقل بين البيئات بتهيئة مختلفة، وتبقى بيانات اعتمادك خارج التحكم بالإصدارات، ويكون تدوير سرّ إجراءً على المنصة بدلاً من عناء إعادة بناء وإعادة نشر.
التوسع والسجلات والحلقة التشغيلية
بمجرد أن يصبح الـ API حياً، يكون تشغيله مسألة بضعة عناصر تحكم بدلاً من إدارة خوادم. تختار خطة موارد وتضبط عدد النسخ التي تشغّلها، توسّع صعوداً لإطلاق أو لموجة حركة ونزولاً بعدها. تتدفق السجلات في اللوحة كي تتبع طلباً، أو تصحّح 500، أو تؤكد أن نشراً تم فعلاً، وتُظهر الحالة ما إذا كانت الخدمة سليمة ومتى أُعيد تشغيلها آخر مرة. كل إعادة نشر تمر عبر بوابة الـ healthcheck نفسها، فيكون شحن بناء جديد إجراءً قابلاً للتكرار والمراقبة — تدفع الصورة، وتراقب نجاح الفحص، وتؤكد في السجلات، دون SSH إلى أي شيء أبداً.
ربط التخزين والبيانات
معظم واجهات الـ API تحتاج مكاناً لحفظ الحالة، وتتكامل الخدمة بنظافة مع بقية المنصة لذلك. يمكنك ربط bucket من Object Storage بالحاوية كمتغيرات بيئة كي تقرأ وتكتب الوسائط أو المستندات مباشرة، ويمكنك وصل قاعدة بيانات مُدارة أو Redis كي تحصل الخدمة على الاستمرارية والتخزين المؤقت دون أن تشغّل تلك أيضاً. ولأن هذه مربوطة عبر المنصة ومقدَّمة كتهيئة محقونة، يبقى الـ API صورة عديمة الحالة يمكن توسيعها وإعادة نشرها بحرية بينما تعيش بياناتها في خدمات مُدارة بجانبها.
كيفية الإعداد، خطوة بخطوة
أشر إلى صورتك
في اللوحة أنشئ تطبيق حاوية وأشر إلى صورتك (image) المبنية مسبقاً (مثلاً myorg/api:1.4) من سجل (registry) عام أو خاص. للصور الخاصة، أضف بيانات اعتماد سجل مرة واحدة كي تتمكن المنصة من سحبها. اضبط المنفذ الذي يستمع عليه الـ API لديك كي تعرف الحافة أين ترسل الحركة.
عرّف الـ healthcheck
امنح التطبيق مسار healthcheck مثل /health أو /ready يعيد 200 فقط عندما تكون الخدمة قادرة فعلاً على الخدمة. هذا ما تستخدمه المنصة لتقرر ما إذا كان نشر جديد سليماً قبل أن يتلقى حركة، لذا اجعله يفحص الأشياء المهمة فعلاً، مثل الاتصال بقاعدة البيانات.
اضبط البيئة والأسرار
أضف التهيئة غير الحساسة كمتغيرات بيئة والقيم الحساسة — مفاتيح API وكلمات مرور قواعد البيانات والرموز — كأسرار، كي تُحقَن وقت التشغيل بدلاً من دمجها في الصورة أو إيداعها في مستودعك. تُخزَّن قيم الأسرار بأمان ويُشار إليها بالمفتاح، ولا تُعرَض مجدداً.
انشر وراقب الـ healthcheck
أطلق النشر من اللوحة أو مع cdnctl. تُبدأ الحاوية، ويُستطلَع الـ healthcheck، ولا تُوسَم الخدمة جاهزة — ولا تُوضَع في الدوران — إلا عند نجاحها، كي لا يأخذ بناء معطوب الحركة صامتاً.
اربط نطاقاً مع Auto SSL و WAF
اعرض الخدمة للحصول على عنوان مجاني name.cdn.com.tr مع HTTPS تلقائي، أو اربط نطاقك الخاص ودع Auto SSL يصدر الشهادة. فعّل الـ WAF كي يجلس الـ API خلف تصفية الحافة، وتكون حاوية الأصل قابلة للوصول عبر مسار الحافة ذاك فقط.
وسّع وراقب
اضبط خطة الموارد وعدد النسخ (replicas) للحمل الذي تتوقعه، واستخدم السجلات والحالة لمراقبة عمليات النشر والإعادات والسلوك أثناء التشغيل. تتبع عمليات إعادة النشر المسار نفسه المحكوم بالـ healthcheck، فيكون دفع إصدار جديد عملية روتينية قابلة للمراقبة.
سيناريوهات مثال
يُنشَر JSON API من صورته خلف نطاق مع Auto SSL و WAF، ما يمنح الواجهة الأمامية نقطة نهاية HTTPS مستقرة ومؤمَّنة دون أي خادم للصيانة.
يعمل مستقبِل webhook أو معالج صور أو خدمة توثيق في عزلة بتوسعها وأسرارها الخاصة، يُنشَر ويُعاد نشره باستقلال عن كل شيء آخر.
يقيم فريق منتج حاوية من صورة موسومة للحصول على عنوان HTTPS قابل للمشاركة لعرض توضيحي، ثم يفككها أو يعيد نشرها مع تقدم البناء.
الأسئلة الشائعة
هل تبني المنصة صورتي، أم أحضر واحدة؟
تحضر صورة مبنية مسبقاً من سجل (registry). تشغّل تطبيقات الحاويات وتوجّه الصورة التي توفرها؛ وإن كانت خاصة، تضيف بيانات اعتماد سجل مرة واحدة كي تتمكن المنصة من سحبها أثناء النشر.
ماذا يحدث إن كان نشري الجديد معطوباً؟
يفشل في الـ healthcheck ولا يُوضَع في الدوران، فتستمر الحركة إلى النسخة العاملة. الحاوية التي تتعطل عند الإقلاع أو لا تصل إلى اعتمادياتها تُلتقط عند الطرح بدلاً من تقديم أخطاء لمستخدميك.
كيف أبقي مفاتيح API وكلمات مرور قواعد البيانات خارج شيفرتي؟
خزّنها كأسرار، تُحقَن في الحاوية وقت التشغيل بالمفتاح ولا تُدمَج أبداً في الصورة ولا تُودَع في مستودعك. الإعدادات غير الحساسة تدخل كمتغيرات بيئة عادية، فتعمل الصورة نفسها في بيئات مختلفة بتهيئة مختلفة.
هل يمكن لـ API الوصول إلى قاعدة بيانات أو bucket من Object Storage؟
نعم. يمكنك ربط bucket من Object Storage بالحاوية كمتغيرات بيئة ووصل قاعدة بيانات مُدارة أو Redis، كي تحصل الخدمة على تخزين واستمرارية وتخزين مؤقت بينما تبقى صورة عديمة الحالة قابلة لإعادة النشر.
كيف أتعامل مع ارتفاع الحركة؟
ارفع عدد النسخ (replicas)، وإن لزم، خطة الموارد للتطبيق. ولأن الحركة تدخل عبر الحافة وتجلس الحاويات خلفها، توسّع عدد النسخ ليطابق الحمل وتخفّضها بعد ذلك.
هل يمكنني النشر من سطر الأوامر بدلاً من اللوحة؟
نعم. يقود cdnctl عمليات الحاويات نفسها من طرفيتك — النشر وإعادة النشر والتوسع والفحص — كي تتمكن من كتابة سكربتات للنشر أو تشغيلها من CI مع الحصول على السلوك نفسه المحكوم بالـ healthcheck كما في اللوحة.