Back to Article List

فصل الإنتاج عن التطوير: لا تدع التجارب توقف خدمتك

فصل الإنتاج عن التطوير: حماية خدمتك من التجارب | مرام هوست - فصل الإنتاج عن التطوير: لا تدع التجارب توقف خدمتك

لنفترض أن مطوّراً يجرّب تعديلاً صغيراً على سيرفر الموقع نفسه. أمر ترحيل قاعدة بيانات يقفل جدولاً مهماً، أو سكربت اختبار يستهلك كل المعالج، أو مهمة مجدولة تجريبية ترسل رسالة حقيقية إلى المشتركين. لم يكن في الأمر هجوم ولا عطل عتادي، ومع ذلك توقفت الخدمة.

كل هذا له سبب واحد: التجربة والإنتاج يتشاركان الشيء نفسه. فصلهما لا يعني بالضرورة شراء سيرفر ثانٍ من أول يوم، بل يعني أن تقرر أي مستوى من الفصل يناسب مرحلتك، وتطبّقه على الموارد والبيانات والشبكة والأسرار معاً.

ما الذي يتشاركه الإنتاج والتطوير؟

حين نتكلم عن الفصل نقصد أربعة أشياء، وأي واحد منها يُترك مشتركاً يكفي لإسقاط الخدمة أو تسريب البيانات:

  • الموارد: المعالج والذاكرة وعمليات القرص. تجربة شرهة تجعل الموقع بطيئاً وإن لم تمسّ ملفاته.
  • البيانات: قاعدة بيانات واحدة تعني أن استعلام حذف خاطئ يصيب بيانات حقيقية.
  • الأسرار: مفتاح الدفع أو خدمة الرسائل نفسه يعني أن الاختبار قد ينفّذ عمليات فعلية.
  • الشبكة: بيئة تطوير ضعيفة الحماية تصل إلى الإنتاج تتحول إلى طريق مختصر للمهاجم.
مخطط يقارن بين بيئة مشتركة تختلط فيها التجارب بالإنتاج وبيئتين منفصلتين في الموارد والبيانات والأسرار والشبكة
الفصل ليس جهازاً إضافياً فقط: لاحظ أن كل طبقة من الطبقات الأربع يجب أن تنفصل، لا الخادم وحده

ثلاثة مستويات للفصل

لا يوجد حل واحد لكل مرحلة. اختر المستوى الذي يتناسب مع كلفة توقف خدمتك، لا مع ما يبدو أكثر احترافية.

المستوىكيف يبدويحميك منلا يحميك من
حاويات على سيرفر واحدLXC أو Docker بحدود موارد لكل بيئةاختلاط الملفات والإعداداتضغط القرص المشترك وأخطاء نواة النظام
أجهزة KVM منفصلةجهاز افتراضي لكل بيئة بنواة مستقلةتجارب النواة والخدمات وإعادة التشغيلعطل السيرفر الفيزيائي نفسه
سيرفرات منفصلةالتطوير على سيرفر والإنتاج على آخرأغلب تأثير التجارب على الإنتاجأخطاء النشر نفسها إن لم يكن هناك اختبار

لفريق صغير، غالباً يكون الجهاز الافتراضي المنفصل نقطة بداية عملية. وإن أردت فهم الفرق بين النوعين بالتفصيل فاقرأ KVM أم LXC في Proxmox.

حدّد سقفاً لكل بيئة

وجود بيئتين على سيرفر واحد لا يكفي ما دامت إحداهما تستطيع ابتلاع موارد الأخرى. على Proxmox تضع سقفاً واضحاً. في هذا المثال الافتراضي، 220 جهاز التجارب و120 حاوية اختبار:

# جهاز التجارب: نواتان و4GiB فقط، مع سقف لاستهلاك المعالج
qm set 220 --cores 2 --memory 4096 --cpulimit 2

# حاوية اختبار بحدود مماثلة
pct set 120 --cores 2 --memory 4096

ولا تنسَ القرص، فهو أول ما يختنق. ضع حدوداً لعمليات القرص لجهاز التجارب من إعدادات القرص نفسه، واجعل بيئة الإنتاج أولوية عند توزيع الموارد.

البيانات والشبكة: الفصل الذي يُنسى

لا تنسخ قاعدة الإنتاج كما هي

أغرى الطرق أن تأخذ نسخة كاملة من قاعدة الإنتاج إلى بيئة التطوير. لكن بيانات المشتركين الحقيقية لا مكان لها على جهاز حمايته أضعف. البديل:

  1. أنشئ بيانات اختبار مولّدة تغطي الحالات المهمة.
  2. إن احتجت حجماً واقعياً، فخذ نسخة وأخفِ الأسماء والهواتف والبريد قبل نقلها.
  3. استعمل حساب قاعدة بيانات مختلفاً لكل بيئة، ولا تسمح لحساب التطوير بالوصول إلى قاعدة الإنتاج.
  4. عطّل في بيئة الاختبار كل ما يرسل إلى الخارج: الرسائل والبريد والدفع، أو وجّهها إلى خدمات اختبار.

راجع ملف الإعدادات قبل كل تشغيل. أكثر حوادث هذا الباب تأتي من ملف .env منسوخ يشير إلى قاعدة الإنتاج. اجعل اسم البيئة ظاهراً في واجهة التطبيق وفي موجّه الطرفية، كي يعرف المطوّر أين يقف قبل تنفيذ الأمر.

افصل الشبكة، ثم خذ لقطة قبل التغيير

ضع كل بيئة في شبكة خاصة بها، وامنع المرور من التطوير إلى الإنتاج. مثال افتراضي بشبكتين:

# التطوير 10.0.0.128/25 لا يصل إلى الإنتاج 10.0.0.0/25
iptables -A FORWARD -s 10.0.0.128/25 -d 10.0.0.0/25 -j REJECT

أما التغييرات الخطرة على الإنتاج، كالترقية أو ترحيل قاعدة البيانات، فتُسبق بلقطة تتيح العودة السريعة:

qm snapshot 101 before-upgrade --description "قبل ترقية التطبيق"
qm rollback 101 before-upgrade   # عند الحاجة فقط
تبويب اللقطات لجهاز افتراضي في Proxmox ويظهر زر Take Snapshot وعنصر NOW
تبويب Snapshots في مختبر Proxmox: زر Take Snapshot قبل التغيير، وزر Rollback للعودة، وNOW تمثل الحالة الحالية

اللقطة ليست نسخة احتياطية. هي تعيش على التخزين نفسه، فإن تعطل التخزين ضاعت معه. استعملها لتغيير قصير ثم احذفها، واعتمد على نسخ احتياطي مستقل. وتراكم اللقطات القديمة يستهلك المساحة ويثقل القرص.

مسار نشر من ثلاث محطات

الفصل يكتمل حين يكون انتقال الكود إلى الإنتاج طريقاً واحداً معروفاً، لا نسخ ملفات باليد:

مسار نشر من بيئة التطوير إلى بيئة التجهيز ثم الإنتاج مع مسار عودة عند الفشل
الكود يتحرك في اتجاه واحد، وفي كل انتقال فحص. ولاحظ مسار العودة: يجب أن يكون جاهزاً قبل بدء النشر

بيئة التجهيز (staging) يجب أن تشبه الإنتاج في الإصدارات والإعدادات. قياس السرعة على جهاز ضعيف يعطيك صورة مضللة، لأن زمن الشبكة في العراق بين 70 و150ms بينما توليد الصفحة يتراوح بين 150ms وأكثر من ثانيتين حسب العتاد. المسافة تكلّف عشرات الملّي ثانية والعتاد الضعيف يكلّف آلافاً، فاسأل عن المعالج والتخزين لا عن المدينة وحدها، واختبر على عتاد قريب مما ستنشر عليه.

لمن تناسب هذه الخدمة؟

  • شركة تقدم خدمة لا تتحمل التوقف أثناء ساعات العمل.
  • فريق مطوّرين ينشر تحديثات متكررة على منتج يعمل فعلاً.
  • مزوّد خدمات يختبر إعدادات جديدة قبل تطبيقها على الشبكة الحية.

أما المشروع التجريبي بلا مستخدمين حقيقيين فيكفيه الانضباط في الملفات والنسخ، إلى أن يصبح لتوقفه كلفة فعلية.

أخطاء شائعة

  • مشاركة قاعدة البيانات بين البيئتين «مؤقتاً»، ثم بقاء الوضع المؤقت سنوات.
  • استعمال المفاتيح نفسها في الاختبار والإنتاج.
  • ترك بيئة التطوير مفتوحة للعموم بلا كلمة مرور، لأنها «تجريبية».
  • اعتبار اللقطة نسخة احتياطية وتركها تتراكم.
  • التعديل المباشر على الإنتاج ثم نسيان نقله إلى الكود، فيضيع مع النشر التالي.

أسئلة شائعة

هل أحتاج سيرفرين من البداية؟

ليس دائماً. جهازان افتراضيان منفصلان بحدود موارد واضحة يكفيان كثيراً من الفرق الصغيرة. تنتقل إلى سيرفر منفصل حين تصبح كلفة توقف الإنتاج أعلى من كلفة السيرفر الثاني.

هل تكفي حاويات Docker للفصل؟

تكفي لفصل الملفات والمكتبات، لكنها تتشارك النواة والقرص. ضع حدوداً للموارد على الأقل، ولا تجرّب فيها ترقيات النظام نفسه.

متى أعيد بناء بيئة الاختبار؟

كلما أمكن. البيئة التي تُبنى من قالب أو سكربت تبقى قريبة من الإنتاج، أما اليدوية فتبتعد عنه مع كل تعديل غير موثّق.

ابنِ بيئتيك على أساس واضح

إن أردت تشغيل الإنتاج والتجارب في أجهزة منفصلة تحت إدارتك، فراجع سيرفرات Proxmox. وإن كنت تفضّل بيئة إنتاج مستقلة وأبسط إدارة، فاطّلع على السيرفرات السحابية. وأخبر فريق المبيعات بحجم فريقك وخدمتك ليساعدك في اختيار البداية المناسبة.

Powered by WHMCompleteSolution