محرّك Django واحد… ثلاث منصات معتمدة
1 سبتمبر 2026 · قراءة 9 دقائق · بلال ناجي
إنجاز وHC Holding ومدى للتعليم تبدو ثلاث منتجات لا علاقة بينها: نطاقات مختلفة، ألوان مختلفة، شعارات مختلفة، وكتالوجات دورات مختلفة. لكن تحت السطح، هي المحرّك نفسه — Django وPostgreSQL — منشورًا ثلاث مرات. هذه المقالة عن كيفية بناء هذا المحرّك، ولماذا سأتخذ القرار نفسه لو عاد بي الزمن.
الفخ يظهر مع العميل الثاني: أول منصة تُطلق، ثم يأتي عميل يريد "نفس المنتج لكن بهويتنا"، وأسرع أسبوع في حياتك هو الأسبوع الذي تنسخ فيه المستودع. بعد ستة أشهر يصبح كل خطأ موجودًا ثلاث مرات، وكل ميزة تُبنى ثلاث مرات، وتتباعد النسخ حتى تصبح رقعة أمنية واحدة يومًا كاملًا من المقارنات الحذرة لكل عميل. رأيت هذا الفيلم من قبل، لذلك بُنيت المنظومة منذ البداية بعقلية المحرّك أولًا.
كود واحد، ثلاث عمليات نشر
المحرّك مشروع Django واحد. كل علامة تجارية تعمل كنشر مستقل بقاعدة بيانات PostgreSQL خاصة بها، ونطاق خاص، وتخزين وسائط خاص، وإعدادات بيئة خاصة. لا شيء مشترك وقت التشغيل: لا قاعدة بيانات مشتركة بعمود tenant، ولا استعلامات عابرة للعملاء يمكن أن تُخطئ، ولا احتمال أن تمسّ ذروة زيارات عميلٍ أو خطأ في بياناته عميلًا آخر.
كل ما يخص العلامة التجارية إعدادات لا كود: رموز الألوان، ومجموعة الشعارات، وبيانات اعتماد الدفع، ومعرّفات الاعتماد الأكاديمي، وعنوان البريد المرسِل. المنصة الجديدة ملف بيئة ومدخل ثيم، لا نسخة جديدة من المستودع. وحين أُصلح خطأً أو أُحصّن نقطة نهاية، تصل الإصلاحات لكل المنصات مع أول نشر تالٍ: رقعة واحدة، ثلاث منتجات.
الهوية البصرية كبيانات
القوالب لا تذكر أي علامة تجارية أبدًا. هي تعرض خصائص CSS ومواضع شعارات وكتل نصوص تملؤها إعدادات الثيم الخاصة بكل نشر. والانضباط المهم يوميًا: كلما أوشك اسم علامة أو لون على أن يُكتب داخل قالب، يتحول إلى مفتاح ثيم بدلًا من ذلك. هذه القاعدة هي كل نظام تعدد العلامات؛ والباقي مجرد الالتزام بها.
ويظهر مردودها في أماكن غير متوقعة: الشهادات والفواتير ورسائل الإشعارات كلها مستندات مولّدة، وكلها تحمل هوية العلامة. ولأن الهوية بيانات، فإن مولّد الشهادات نفسه ينتج شهادة إنجاز وشهادة مدى — وعلامة رابعة لن تكلّف سوى الأصول البصرية.
الاعتماد الأكاديمي وحدة مستقلة، لا مجرد ميزة
المتطلبات الصعبة في هذا المجال ليست عمليات CRUD — بل الجهات التنظيمية. المنصات السعودية تتكامل مع المركز الوطني للتعليم الإلكتروني NELC، وللتدريب الطبي مع مسارات اعتماد هيئة التخصصات الصحية SCFHS: تقارير التسجيل، وأدلة الحضور، وسجلات الإتمام، وإصدار الشهادات بالشكل الذي تتوقعه الجهة المنظِّمة.
هذه التكاملات تعيش خلف حدود وحدة مستقلة داخل المحرّك، وتُفعَّل بالإعدادات. العلامة التي تحتاج SCFHS تُشغّله، والتي لا تحتاجه لا يُحمَّل عندها أصلًا. وحين تغيّر الجهة المنظمة حقلًا أو نقطة نهاية — وهذا يحدث — يهبط التغيير مرة واحدة في وحدة واحدة، وتبقى كل المنصات المعتمدة متوافقة معًا. هذا هو الجزء من البنية الذي سدّد ثمن نفسه مباشرة.
المدفوعات والمهام الخلفية والتفاصيل المملة
المدفوعات تمر عبر MyFatoorah ببيانات تاجر خاصة بكل علامة، فتصل الأموال لكل عميل مباشرة وتبقى الاستردادات والتسويات منفصلة. أما الحمل الخلفي فيحمله Celery وRedis: تأكيدات التسجيل، وتوليد الشهادات، ومهام التقارير التنظيمية، والتذكيرات المجدولة. كل نشر يشغّل عمّاله الخاصين، فلا يؤخر طابورٌ متعطل في منصةٍ منصةً أخرى.
ترحيلات قاعدة البيانات هي الكلفة التشغيلية لنموذج المحرّك: كل تغيير في المخطط يعمل على ثلاث قواعد بيانات إنتاجية. الروتين صارم وغير لامع — ترحيلات متوافقة مع الإصدارات السابقة، نشر المحرّك أولًا، ثم ترحيل كل علامة بالتسلسل والتحقق. ينفق هذا الانضباط دقائق في كل إصدار، وقد أبقى ثلاث منصات إنتاجية على مخطط واحد دون حادثة واحدة.
التكلفة بصراحة
نموذج المحرّك ليس مجانيًا. كل طلب ميزة يحمل الآن سؤالًا ثانيًا: هل هذا لعلامة واحدة أم للمحرّك؟ توجد مفاتيح ميزات لكل علامة ويجب اختبارها في الحالتين. والتغيير الذي كان سيكون حلًا سريعًا في كود عميلٍ واحد يُصمَّم هنا بعناية أكبر قليلًا لأنه سيعمل في ثلاثة أماكن. ومساحة الاختبار حقيقية: على CI أن يثبت صحة المحرّك بأكثر من إعداد.
وما يشتريه هذا الثمن هو الرافعة: ثلاث منصات معتمدة تُصان بجهد منصة ونصف تقريبًا. وتغيير الامتثال يصل للجميع دفعة واحدة. وبيع المنصة الرابعة حديثٌ عن هوية ومحتوى، لا عن شهور من البناء.
الخلاصة
إن طلب منك عميل ثانٍ يومًا "نفس المنتج لكن باسمنا": لا تنسخ المستودع. استخرج المحرّك وما زال له مستهلكان فقط، واجعل الهوية إعدادات لا كودًا، وضع تكاملات الجهات التنظيمية خلف حدود وحدات من اليوم الأول. عقلية المحرّك عادة أكثر منها بنية — وتبنّيها عند المنصة الثانية أرخص كثيرًا من تبنّيها عند الثالثة.
المقالة التالية
استلام مشروع قديم بدون إعادة كتابته من الصفر