عربي، من اليمين إلى اليسار، والأخبار العاجلة لا تتوقف.
يغطي كل العرب الأخبار المحلية بلدة بلدة، والسياسة والرياضة والثقافة لقرّاء يتحدثون العربية. تعمل غرفة الأخبار على موقع PHP قديم وجدول أخبار كبير لدرجة أن تغيير بنيته مكلف.
جدول أكبر من أن يُغيَّر
سنوات من الأخبار في جدول MySQL واحد. الأفكار الجديدة مثل علامات الحالة والكتّاب ومواقع الصفحة الرئيسية لم يكن ممكنًا أن تعني تعديله.
صفحات مخزّنة وأخبار عاجلة
تُقدَّم الصفحات من حافة CDN من أجل السرعة، لذا يجب أن يفرّغ الخبر العاجل أو تغيير الصفحة الرئيسية الصفحات الصحيحة دون تفريغ الموقع كله.
خبر واحد وقنوات كثيرة
يصل الخبر نفسه إلى الموقع، وإلى هواتف القرّاء كإشعار، وإلى Facebook وInstagram وTikTok وTelegram وWhatsApp، كلٌّ بصيغته.
صفحة رئيسية تُحرَّر موقعًا موقعًا
يضع المحررون الأخبار الرئيسية يدويًا في مواقع مرقّمة، ويجب أن يصل أي تغيير إلى القرّاء فورًا.
فيديو بكميات كبيرة
كان على الرفع الكبير أن يتجاوز حدود حجم الطلبات، واحتاج كل فيديو إلى نسخ تعمل على أي اتصال.
الانتخابات كبيانات
تحتاج تغطية الانتخابات إلى القوائم والمرشحين وتقديرات المقاعد لدى مستطلعي الرأي كبيانات منظَّمة، لا كأخبار.
واجهة API واحدة بين غرفة الأخبار وكل مكان يصل إليه الخبر.
يتحدث نظام إدارة المحتوى مع واجهة API فقط. تكتب الواجهة في القاعدة القائمة، وتحتفظ بذاكرة Redis خاصة بها، وتحرّك ذاكرة الموقع والإشعارات إلى التطبيقات وشبكات التواصل.
نظام إدارة المحتوى · React · عربي · من اليمين إلى اليسار
رفع الفيديو · أجزاء بحجم 8 MB · سُلّم ffmpeg
إدارة الانتخابات · القوائم · المرشحون · تقديرات المقاعد
واجهة API للنظام · NestJS وTypeORM، مع ذاكرة Redis بإصدارات.
قاعدة أخبار MySQL · قائمة · مشتركة مع موقع PHP
خادم المصدر وBunny CDN · تحديث في المصدر ثم تفريغ دقيق
Pushwoosh · إشعارات لتطبيقَي iOS وAndroid
شبكات التواصل · Facebook · Instagram · TikTok · Telegram · WhatsApp
الفيديو: نسخ من 240p حتى 1080p تُقدَّم عبر HLS من nginx-vod · التعليقات والتفاعلات والمشاهدات وأصوات الاستطلاعات: Supabase
أربعة قرارات شكّلت النظام.
ترك جدول الأخبار كما هو
يعمل نظام إدارة المحتوى وواجهة API الجديدان على القاعدة القائمة دون ترحيلها. علامات الحالة والكتّاب ومواقع الصفحة الرئيسية في جداول جانبية، فلا يتغيّر جدول الأخبار الكبير جدًا.
تفريغ ما يمسّه الخبر بالضبط
التفريغ جزء من النشر. تطلب الواجهة من خادم مصدر الموقع أن يتحدّث، وتستلم قائمة العناوين، وتفرّغ كل عنوان في Bunny CDN: الخبر وصفحته وصفحة البلدة وصفحات القسم. وتغيير موقع في الصفحة الرئيسية يحدّث الصفحة الرئيسية تلقائيًا.
النشر في كل مكان من شاشة واحدة
إشعار عبر Pushwoosh مع معاينة على الهاتف، ومنشورات لكل شبكة من قوالب بهوية الموقع، وصور ستوري بمقاس 1080×1920 تُولَّد من بيانات الخبر نفسه، وكل ذلك من شاشة الخبر.
الفيديو بعدة نسخ
يُرفع الفيديو على أجزاء بحجم 8 MB يُنصَّف حجمها حين يرفض الخادم الحجم. يصنع سُلّم ffmpeg نسخًا من 1080p حتى 240p، ويقدّمها nginx-vod عبر HLS، ويفحص نظام إدارة المحتوى حالة كل فيديو كل دقيقتين.
ماذا يحصل المحررون أيضًا، بالعربية ومن اليمين إلى اليسار.
تحرير الصفحة الرئيسية
مواقع مرقّمة بالسحب والإفلات ومنتقي أخبار. يحصل الموقع الفارغ على تنبيه هادئ، ويُسجَّل كل تغيير في الترتيب.
محرر الأخبار
مسودات، وقائمة مباشرة، وحذف قابل للاستعادة، ووسوم، ومعارض صور تُرتَّب بالسحب، وقصّ للصورة الرئيسية بنسبة 15:10، وسجل لكل تغيير.
بيانات الانتخابات
ثمانية جداول لسنوات الانتخابات وقوائم المرشحين وسجل أشخاص مشترك وتقديرات المقاعد لدى مستطلعي الرأي وخط زمني وأسئلة شائعة، تغذّي العدّ التنازلي والرسوم في الموقع.
البحث في النظام
برقم الخبر أو بكلمات من العنوان. كل كلمة مطلوبة وتُطابَق ببدايتها في فهرس النص الكامل في MySQL، وهذا يساعد مع الكلمات العربية واللاتينية القصيرة.
قوائم سريعة على جدول كبير
يخزّن Redis قوائم المحررين وأرقام لوحة التحكم مؤقتًا. يرتفع إصدار المحتوى مع كل تعديل، فتسقط القوائم القديمة فورًا.
الأدوار وجلسات الدخول
محررون ومشرفون ومسؤولون ومسؤولون أعلى مع صلاحية لكل إجراء، ورموز تحديث تتبدّل وتكشف إعادة الاستخدام.