دليل عمليات SMS-C
← العودة إلى فهرس الوثائق | الملف README الرئيسي
إجراءات التشغيل اليومية، والمراقبة، ومهام الصيانة لفرق عمليات SMS-C.
جدول المحتويات
- العمليات اليومية
- المراقبة
- تتبع الرسائل
- إدارة المسارات
- إدارة الواجهة الأمامية
- إدارة ترجمة الأرقام
- صيانة النظام
- النسخ الاحتياطي والاسترداد
- تخطيط السعة
- استجابة الحوادث
العمليات اليومية
فحص الصحة الصباحية
قم بإجراء هذه الفحوصات في بداية كل يوم:
1. تحقق من حالة النظام
# فحص صحة API
curl https://api.example.com:8443/api/status
# الاستجابة المتوقعة:
# {"status":"ok","application":"OmniMessage","timestamp":"2025-10-30T08:00:00Z"}
2. مراجعة مقاييس Prometheus
الوصول إلى لوحة معلومات Prometheus والتحقق من:
- معدل مرور الرسائل (آخر 24 ساعة)
- معدل فشل التوجيه (يجب أن يكون < 1%)
- تراكم الطوابير (يجب أن يكون < 1000 معلق)
- معدل نجاح التسليم (يجب أن يكون > 95%)
- حالة اتصال الواجهة الأمامية (جميع الواجهات الأمامية المتوقعة نشطة)
3. تحقق من قائمة الرسائل
الوصول إلى واجهة الويب: https://sms-admin.example.com/message_queue
مراجعة:
- إجمالي الرسائل المعلقة (يجب أن يكون منخفضًا)
- عمر أقدم رسالة (يجب أن يكون < 5 دقائق)
- الرسائل ذات محاولات التسليم العالية (تحقق إذا كانت > 3)
- الرسائل الميتة (تحقق من أي موجودة)
4. مراجعة حالة الواجهة الأمامية
الوصول إلى واجهة الويب: https://sms-admin.example.com/frontend_status
التحقق من:
- جميع الواجهات الأمامية المتوقعة نشطة
- لا توجد انقطاعات غير منتهية
- لا توجد أخطاء في الواجهة الأمامية خلال آخر 24 ساعة
5. تحقق من سجلات التطبيق
الوصول إلى واجهة الويب: https://sms-admin.example.com/logs أو تحقق من ملفات السجل
ابحث عن:
- رسائل بمستوى خطأ
- فشل التوجيه
- فشل الشحن
- مشاكل في اتصال قاعدة البيانات
- مشاكل في عقدة الكتلة
مراقبة حجم الرسائل
تحقق من عدد الرسائل بالساعة:
استخدم استعلام Prometheus:
# الرسائل المستلمة في الساعة
increase(sms_c_message_received_count[1h])
# الرسائل المرسلة في الساعة
increase(sms_c_delivery_succeeded_count[1h])
# حساب معدل التسليم
rate(sms_c_delivery_succeeded_count[1h]) / rate(sms_c_message_received_count[1h])
الأنماط المتوقعة:
- ساعات العمل: حجم أعلى
- ليالي/عطلات نهاية الأسبوع: حجم أقل
- معدل التسليم: يجب أن يكون > 95%
شروط التنبيه:
- انخفاض مفاجئ في الرسائل ( > 50% انخفاض)
- ارتفا�� مفاجئ في الرسائل ( > 200% زيادة)
- انخفاض معدل التسليم تحت 90%
المراقبة
المقاييس الرئيسية للمراقبة
مقاييس معالجة الرسائل
عدد الرسائل المستلمة (sms_c_message_received_count):
- ما هو: إجمالي الرسائل التي تدخل النظام
- تنبيه: انخفاض أو ارتفاع مفاجئ
- استعلام:
rate(sms_c_message_received_count[5m])
مدة معالجة الرسائل (sms_c_message_processing_stop_duration):
- ما هو: الوقت المستغرق في المعالجة من البداية إلى النهاية
- تنبيه: p95 > 1000ms
- استعلام:
histogram_quantile(0.95, sms_c_message_processing_stop_duration)
مقاييس التوجيه
فشل التوجيه (sms_c_routing_failed_count):
- ما هو: الرسائل التي لم يمكن توجيهها
- تنبيه: أي فشل ( > 0)
- استعلام:
increase(sms_c_routing_failed_count[5m])
المسار المتطابق (sms_c_routing_route_matched_count):
- ما هو: أي المسارات يتم استخدامها
- تنبيه: المسارات ذات الأولوية العالية لا تتطابق
- استعلام:
sms_c_routing_route_matched_count
مقاييس التسليم
معدل نجاح التسليم:
- ما هو: نسبة التسليم الناجح
- تنبيه: معدل < 95%
- استعلام:
rate(sms_c_delivery_succeeded_count[5m]) / rate(sms_c_delivery_queued_count[5m])
محاولات التسليم (sms_c_delivery_succeeded_attempt_count):
- ما هو: إعادة المحاولات اللازمة للتسليم
- تنبيه: p95 > 2 (الكثير من إعادة المحاولات)
- استعلام:
histogram_quantile(0.95, sms_c_delivery_succeeded_attempt_count)
مقاييس الطوابير
حجم الطابور (sms_c_queue_size_size):
- ما هو: إجمالي الرسائل في الطابور
- تنبيه: الحجم > 10,000
- استعلام:
sms_c_queue_size_size
عمر أقدم رسالة (sms_c_queue_oldest_message_age_seconds):
- ما هو: عمر أقدم رسالة معلقة
- تنبيه: العمر > 300 ثانية
- استعلام:
sms_c_queue_oldest_message_age_seconds
إعداد لوحة المعلومات
لوحات معلومات العمليات:
-
معدل مرور الرسائل (رسم بياني)
- الرسائل المستلمة (معدل 5 دقائق)
- الرسائل ال��رسلة (معدل 5 دقائق)
- نطاق الوقت: آخر 24 ساعة
-
حالة الطابور (إحصائيات فردية)
- الرسائل المعلقة الحالية
- عمر أقدم رسالة
- عدد الرسائل الفاشلة
-
أداء التسليم (رسم بياني)
- معدل النجاح على مر الزمن
- معدل الفشل على مر الزمن
- نطاق الوقت: آخر 24 ساعة
-
حالة التوجيه (جدول)
- معرف المسار
- عدد المطابقات (الساعة الأخيرة)
- وجهة SMSC
- الأولوية
-
حالة الواجهة الأمامية (جدول)
- اسم الواجهة الأمامية
- الحالة (نشطة/منتهية)
- آخر ظهور
- عدد الرسائل (الساعة الأخيرة)
-
صحة النظام (إحصائيات فردية)
- زمن استجابة API (p95)
- زمن استعلام قاعدة البيانات (p95)
- زمن بحث ENUM (p95)
إعداد التنبيهات
التنبيهات الحرجة (استجابة فورية مطلوبة):
# لم يتم العثور على مسار - لا يمكن تسليم الرسائل
- alert: RoutingFailures
expr: increase(sms_c_routing_failed_count[5m]) > 0
severity: critical
description: "{{ $value }} messages failed routing in last 5 minutes"
# تراكم الطابور - المعالجة تتأخر
- alert: QueueBacklog
expr: sms_c_queue_size_pending > 10000
severity: critical
description: "Queue has {{ $value }} pending messages"
# الرسائل تتقدم في العمر - التسليم عالق
- alert: OldMessagesInQueue
expr: sms_c_queue_oldest_message_age_seconds > 300
severity: critical
description: "Oldest message is {{ $value }} seconds old"
# الواجهة الأمامية مفصولة - لا يوجد مسار تسليم
- alert: FrontendDisconnected
expr: sms_c_frontend_status_count{status="disconnected"} > 0
severity: critical
description: "{{ $value }} frontends disconnected"
تنبيهات التحذير (تحتاج إلى تحقيق):
# معدل نجاح التسليم يتناقص
- alert: LowDeliveryRate
expr: rate(sms_c_delivery_succeeded_count[10m]) / rate(sms_c_delivery_queued_count[10m]) < 0.90
severity: warning
description: "Delivery success rate is {{ $value }}"
# الكثير من إعادة المحاولات للتسليم
- alert: HighRetryRate
expr: histogram_quantile(0.95, sms_c_delivery_succeeded_attempt_count) > 2
severity: warning
description: "95th percentile delivery attempts: {{ $value }}"
# بحث ENUM بطيء أو فاشل
- alert: SlowEnumLookups
expr: histogram_quantile(0.95, sms_c_enum_lookup_stop_duration) > 5000
severity: warning
description: "ENUM lookups taking > 5 seconds"
# معدل نجاح ذاكرة التخزين المؤقت ENUM منخفض
- alert: LowEnumCacheHitRate
expr: rate(sms_c_enum_cache_hit_count[10m]) / (rate(sms_c_enum_cache_hit_count[10m]) + rate(sms_c_enum_cache_miss_count[10m])) < 0.70
severity: warning
description: "ENUM cache hit rate: {{ $value }}"
تتبع الرسائل
العثور على رسالة معينة
حسب معرف الرسالة:
- واجهة الويب: انتقل إلى
/message_queue - أدخل معرف الرسالة في مربع البحث
- عرض التفاصيل الكاملة وسجل الأحداث
عبر API:
curl https://api.example.com:8443/api/messages/12345
حسب رقم الهاتف:
- واجهة الويب: انتقل إلى
/message_queue - أدخل رقم الهاتف في مربع البحث
- عرض جميع الرسائل لذلك الرقم
تتبع دورة حياة الرسالة
عرض سجل الأحداث:
- واجهة الويب: انقر على الرسالة في الطابور، عرض ق��م "الأحداث"
- API:
GET /api/events/12345
تسلسل الأحداث الشائع:
1. message_inserted - تم إنشاء الرسالة
↓
2. number_translated - تم تطبيع الأرقام (إذا تم تكوينه)
↓
3. message_routed - تم اتخاذ قرار التوجيه
↓
4. charging_attempted - فحص الشحن (إذا تم تمكينه)
↓
5. message_delivered - تم التسليم بنجاح
تسلسل التسليم الفاشل:
1. message_inserted
↓
2. message_routed
↓
3. delivery_attempt_1 - المحاولة الأولى فشلت
↓
4. delivery_attempt_2 - المحاولة الثانية فشلت (تأخير 2 دقيقة)
↓
5. delivery_attempt_3 - المحاولة الثالثة فشلت (تأخير 4 دقائق)
↓
6. message_dead_letter - تجاوز حد إعادة المحاولة
تحقق من حالة التسليم
الرسائل المعلقة:
- الحالة: "معلقة"
- deliver_after: طابع زمني مستقبلي
- delivery_attempts: 0 أو عدد منخفض
الرسائل المرسلة:
- الحالة: "تم التسليم"
- deliver_time: طابع زمني للتسليم
- dest_smsc: الواجهة الأمامية التي قامت بالتسليم
الرسا��ل الفاشلة:
- الحالة: "معلقة" مع عدد محاولات تسليم مرتفع
- deadletter: true (إذا انتهت)
- تحقق من سجل الأحداث لأسباب الفشل
توجيه الرسائل بناءً على الموقع
يدعم SMS-C استرجاع الرسائل بناءً على الموقع، مما يسمح للواجهات الأمامية باستلام الرسائل الموجهة تلقائيًا للمشتركين المسجلين في موقعهم.
كيف يعمل:
عند استعلام واجهة أمامية عن الرسائل المعلقة باستخدام get_messages_for_smsc(smsc_name)، يعيد النظام الرسائل بطريقتين:
- التوجيه الصريح - الرسائل التي يتطابق فيها
dest_smscصراحة مع اسم الواجهة الأمامية - التوجيه بناءً على الموقع - الرسائل حيث:
dest_smscهوnull(غير موجه صراحة)destination_msisdnلديه سجل موقع نشط- يتطابق حقل
locationللموقع مع اسم الواجهة الأمامية - لم تنته صلاحية الموقع
سيناريو المثال:
مشترك برقم MSISDN +447700900123 يسجل في الواجهة الأمامية uk_gateway:
# يسجل المشترك (ينشئ سجل موقع)
POST /api/locations
{
"msisdn": "+447700900123",
"imsi": "234150123456789",
"location": "uk_gateway",
"expires": "2025-11-01T12:00:00Z"
}
عندما تصل رسالة لهذا المشترك بدون توجيه صريح:
# تم تقديم الرسالة بدون dest_smsc
POST /api/messages
{
"source_msisdn": "+15551234567",
"destination_msisdn": "+447700900123",
"message_body": "Hello",
"source_smsc": "api"
# ملاحظة: dest_smsc هو null
}
ستستقبل الواجهة الأمامية uk_gateway هذه الرسالة تلقائيًا عندما تستعلم:
# الواجهة الأمامية تستعلم عن الرسائل
GET /api/messages/queue?smsc=uk_gateway
# تعيد الرسالة على الرغم من أن dest_smsc هو null
# لأن المشترك الوجهة مسجل في uk_gateway
متطلبات الموقع:
لكي يعمل التوجيه بناءً على الموقع:
- يجب أن تحتوي جدول
locationsعلى إدخال لـdestination_msisdn - يجب أن يتطابق حقل
locationمع اسم SMSC الذي يستعلم - يجب أن يكون طابع
expiresفي المستقبل
مراقبة التوجي�� بناءً على الموقع:
تحقق من سجلات المواقع:
# عبر API
GET /api/locations/{msisdn}
# تحقق مما إذا كانت الموقع قد انتهت
# يجب أن يكون حقل expires > الوقت الحالي
المشاكل الشائعة:
- لم يتم تسليم الرسالة: تحقق مما إذا كانت الموقع قد انتهت
- واجهة أمامية خاطئة: تحقق من أن حقل
locationيتطابق مع اسم الواجهة الأمامية المتوقع - لم يتم العثور على الموقع: قد يحتاج المشترك إلى إعادة التسجيل
التدخلات اليدوية
إعادة محاولة الرسالة الفاشلة:
# إعادة تعيين delivery_attempts و deliver_after
curl -X PATCH https://api.example.com:8443/api/messages/12345 \
-H "Content-Type: application/json" \
-d '{
"delivery_attempts": 0,
"deliver_after": "2025-10-30T12:00:00Z"
}'
تغيير الوجهة:
# توجيه إلى SMSC مختلف
curl -X PATCH https://api.example.com:8443/api/messages/12345 \
-H "Content-Type: application/json" \
-d '{
"dest_smsc": "backup_gateway"
}'
حذف الرسالة العالقة:
curl -X DELETE https://api.example.com:8443/api/messages/12345
إدارة المسارات
عرض المسارات الحالية
واجهة الويب: انتقل إلى /sms_routing
عبر API:
# قائمة بجميع المسارات
curl https://api.example.com:8443/api/routes
تحقق من استخدام المسار:
استعلام Prometheus:
# الرسائل الموجهة بواسطة كل مسار (الساعة الأخيرة)
increase(sms_c_routing_route_matched_count[1h])
إضافة مسار جديد
واجهة الويب:
- انتقل إلى
/sms_routing - انقر على "إضافة مسار جديد"
- املأ الحقول:
- بادئة الاتصال: بادئة رقم المصدر (اختياري)
- بادئة الاتصال: بادئة رقم الوجهة (مطلوبة للتوجيه الجغرافي)
- مصدر SMSC: فلتر النظام المصدر (اختياري)
- وجهة SMSC: بوابة الوجهة (مطلوبة ما لم يكن رد تلقائي/إسقاط)
- الأولوية: أولوية المسار (1-255، أقل = أولوية أعلى)
- الوزن: وزن التوازن (1-100)
- الوصف: وصف قابل للقراءة البشرية
- مفعل: تحقق للتفعيل الفوري
- انقر على "حفظ المسار"
مثال: مسار جغرافي:
- بادئة الاتصال:
+44 - وجهة SMSC:
uk_gateway - الأولوية: 50
- الوزن: 100
- الوصف: "توجيه المملكة المتحدة"
مثال: مسار موزع:
إنشاء مسارين بنفس المعايير ولكن بأوزان مختلفة:
المسار 1:
- بادئة الاتصال:
+44 - وجهة SMSC:
uk_primary - الأولوية: 50
- الوزن: 70
- الوصف: "المملكة المتحدة الرئيسية (70%)"
المسار 2:
- بادئة الاتصال:
+44 - وجهة SMSC:
uk_backup - الأولوية: 50
- الوزن: 30
- الوصف: "المملكة المتحدة الاحتياطية (30%)"
اختبار المسارات
محاكي التوجيه:
- انتقل إلى
/simulator - أدخل معلمات الاختبار:
- رقم الاتصال:
+15551234567 - رقم الاتصال:
+447700900000 - مصدر SMSC: (اختياري)
- نوع المصدر: (اختياري)
- رقم الاتصال:
- انقر على "محاكاة التوجيه"
- مراجعة النتائج:
- المسار المحدد: أي مسار تم اختياره
- جميع المطابقات: أي المسارات تطابقت مع المعايير
- التقييم: لماذا تطابق كل مسار أو لم يتطابق
اختبار قبل الإنتاج:
- اختبار جميع المسارات الجديدة في المحاكي
- التحقق من اختيار المسار الصحيح
- التحقق من ترتيب الأولويات
- التحقق من توزيع الوزن
تعديل المسار الحالي
واجهة الويب:
- انتقل إلى
/sms_routing - ابحث عن المسار في القائمة
- انقر على "تعديل"
- تعديل الحقول
- انقر على "حفظ المسار"
التعديلات الشائعة:
- تعطيل المسار: إلغاء تحديد "مفعل" (إزالة مؤقتة)
- تعديل الوزن: تغيير توزيع التوازن
- تغيير الأولوية: إعادة ترتيب تقييم المسار
- تحديث الوجهة: التبديل إلى SMSC مختلف
حذف المسار
واجهة الويب:
- انتقل إلى
/sms_routing - ابحث عن المسار في القائمة
- انقر على "حذف"
- تأكيد الحذف
تحذير: حذف المسارات دائم. اعتبر تعطيلها بدلاً من ذلك.
تصدير/استيراد المسارات
تصدير المسارات (نسخة احتياطية):
- انتقل إلى
/sms_routing - انقر على "تصدير المسارات"
- حفظ ملف JSON
استيراد المسارات:
- انتقل إلى
/sms_routing - انقر على "استيراد المسارات"
- اختر ملف JSON
- اختر وضع الاستيراد:
- دمج: إضافة إلى المسارات الحالية
- استبدال: حذف جميع المسارات واستيراد
حالات الاستخدام:
- النسخ الاحتياطي قبل التغييرات الكبيرة
- نسخ المسارات بين البيئات
- استرداد الكوارث
- إصدار التكوين
إدارة الواجهة الأمامية
مراقبة اتصالات الواجهة الأمامية
واجهة الويب: انتقل إلى /frontend_status
تحقق من:
- جميع الواجهات الأمامية المتوقعة "نشطة"
- أوقات آخر ظهور حديثة ( < 90 ثانية)
- لا توجد واجهات أمامية منتهية غير متوقعة
عبر API:
# الحصول على الواجهات الأمامية النشطة
curl https://api.example.com:8443/api/frontends/active
# الحصول على الإحصائيات
curl https://api.example.com:8443/api/frontends/stats
التحقيق في الانقطاعات
الواجهة الأمامية منتهية:
- تحقق من سجلات الواجهة الأمامية للأخطاء
- تحقق من الاتصال الشبكي بـ SMS-C
- تأكد من أن الواجهة الأمامية تعمل
- تحقق من منطق تسجيل الواجهة الأمامية (يجب أن تعيد التسجيل كل 60 ثانية)
التسجيل غير ظاهر:
- تحقق من أن الواجهة الأمامية تستدعي POST
/api/frontends/register - تحقق من سجلات API لأخطاء التسجيل
- تحقق من تنسيق حمولة JSON
- اختبر التسجيل يدويًا باستخدام curl
مثال على التسجيل اليدوي:
curl -X POST https://api.example.com:8443/api/frontends/register \
-H "Content-Type: application/json" \
-d '{
"frontend_name": "test_gateway",
"frontend_type": "smpp",
"ip_address": "10.0.1.50",
"hostname": "gateway.example.com"
}'
عرض تاريخ الواجهة الأمامية
واجهة الويب:
- انتقل إلى
/frontend_status - ابحث عن الواجهة الأمامية في القائمة
- انقر على "التاريخ"
- مراجعة التسجيلات السابقة
عبر API:
curl https://api.example.com:8443/api/frontends/history/uk_gateway
حالات الاستخدام:
- التحقيق في موثوقية الاتصال
- تتبع أنماط وقت تشغيل الواجهة الأمامية
- تحديد التغييرات في التكوين
إدارة ترجمة الأرقام
تتم إدارة قواعد ترجمة الأرقام عبر config/runtime.exs. تتطلب التغييرات إعادة تشغيل التطبيق.
عرض قواعد الترجمة النشطة
تحقق من ملف التكوين:
cat config/runtime.exs | grep -A 20 "translation_rules:"
المهام الشائعة لترجمة الأرقام
إضافة رمز الدولة إلى الأرقام المحلية:
تحرير config/runtime.exs:
%{
calling_prefix: nil,
called_prefix: nil,
source_smsc: nil,
calling_match: "^(\d{10})$",
calling_replace: "+1\1",
called_match: "^(\d{10})$",
called_replace: "+1\1",
priority: 100,
description: "إضافة +1 إلى الأرقام الأمريكية المكونة من 10 أرقام",
enabled: true
}
تطبيع التنسيق الدولي:
%{
calling_prefix: nil,
called_prefix: nil,
source_smsc: nil,
calling_match: "^00(\d+)$",
calling_replace: "+\1",
called_match: "^00(\d+)$",
called_replace: "+\1",
priority: 10,
description: "تحويل بادئة 00 إلى +",
enabled: true
}
إزالة رمز محدد من الناقل:
%{
calling_prefix: nil,
called_prefix: "101",
source_smsc: "carrier_a",
calling_match: nil,
calling_replace: nil,
called_match: "^101(\d+)$",
called_replace: "\1",
priority: 5,
description: "إزالة رمز الناقل من الناقل A",
enabled: true
}
اختبار قواعد الترجمة
بعد تغييرات التكوين:
- أعد تشغيل التطبيق لتحميل القواعد الجديدة
- قدم رسالة اختبار مع المصدر/الوجهة التي يجب أن تتطابق
- تحقق من سجل الأحداث لحدث
number_translated - تحقق من أن الأرقام تم تحويلها بشكل صحيح
تعطيل قاعدة الترجمة
قم بتعيين enabled: false في القاعدة:
%{
...
enabled: false
}
أعد تشغيل التطبيق.
صيانة النظام
صيانة قاعدة البيانات
تحقق من حجم قاعدة ��لبيانات:
استخدم أدوات إدارة قاعدة البيانات الخاصة بك لمراقبة حجم تخزين CDR:
- MySQL/MariaDB: استعلام
information_schema.tablesللحصول على حجم قاعدة البيانات - PostgreSQL: استخدم دالة
pg_database_size()أو الأمر\l+في psql
تنظيف سجلات CDR القديمة:
يجب أرشفة سجلات CDR وحذفها دوريًا بناءً على سياسة الاحتفاظ الخاصة بك:
- تكوين الأرشفة التلقائية بناءً على متطلبات العمل (عادةً 30-90 يومًا في قاعدة البيانات التشغيلية)
- أرشفة السجلات القديمة إلى مستودع البيانات أو التخزين البارد
- حذف السجلات المؤرشفة من قاعدة البيانات التشغيلية في دفعات لتجنب التنافس على القفل
تحسين الجداول:
قم بتحسين جداول قاعدة البيانات دوريًا للحفاظ على الأداء:
- MySQL/MariaDB: نفذ الأمر
OPTIMIZE TABLEخلال فترات انخفاض الحركة - PostgreSQL: نفذ
VACUUM ANALYZEبانتظام (أو قم بتمكين autovacuum)
قم بتشغيله أسبوعيًا خلال فترة انخفاض الحركة للحفاظ على الأداء الأمثل.
صيانة قاعدة بيانات Mnesia
تحقق من حجم جدول Mnesia:
# في وحدة التحكم IEx
:mnesia.table_info(:sms_route, :size)
:mnesia.table_info(:translation_rule, :size)
نسخ احتياطي لجداول Mnesia:
# تصدير المسارات (واجهة الويب)
# انتقل إلى /sms_routing
# انقر على "تصدير المسارات"
# أو عبر نسخ احتياطي Mnesia
:mnesia.backup("/var/backups/sms_c/mnesia_backup.bup")
استعادة Mnesia:
# عبر استيراد واجهة الويب
# أو استعادة النسخة الاحتياطية:
:mnesia.restore("/var/backups/sms_c/mnesia_backup.bup", [])
تدوير السجلات
قم بتكوين logrotate لسجلات التطبيق:
# /etc/logrotate.d/sms_c
/var/log/sms_c/*.log {
daily
rotate 30
compress
delaycompress
notifempty
create 0644 sms_user sms_group
sharedscripts
postrotate
systemctl reload sms_c || true
endscript
}
إعادة تشغيل التطبيق
إعادة التشغيل بشكل سلس (عدم وجود توقف في الكتلة):
# أعد تشغيل عقدة واحدة في كل مرة
systemctl restart sms_c
# انتظر حتى تنضم العقدة إلى الكتلة
# كرر لكل عقدة
إعادة التشغيل الطارئة (جميع العقد):
systemctl restart sms_c
بعد إعادة التشغيل:
- تحقق من إعادة اتصال جميع الواجهات الأمامية
- تحقق من Prometheus لاستمرارية المقاييس
- راقب السجلات بحثًا عن الأخطاء
- تحقق من استئناف معالجة الرسائل
النسخ الاحتياطي والاسترداد
ما يجب نسخه احتياطيًا
-
ملفات التكوين:
config/runtime.exsconfig/config.exsconfig/prod.exs(إذا كان موجودًا)
-
جداول التوجيه (Mnesia):
- تصدير عبر واجهة الويب
- أو أمر نسخ احتياطي Mnesia
-
قاعدة بيانات SQL CDR:
- نسخة احتياطية كاملة يوميًا
- نسخ احتياطية لسجل المعاملات (مستمرة)
-
شهادات TLS:
priv/cert/*.crtpriv/cert/*.key
إجراءات النسخ الاحتياطي
نسخة احتياطية يومية للتكوين:
#!/bin/bash
# /opt/sms_c/scripts/backup_config.sh
BACKUP_DIR="/var/backups/sms_c/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# النسخ الاحتياطي للتكوين
cp -r /opt/sms_c/config $BACKUP_DIR/
# النسخ الاحتياطي للشهادات
cp -r /opt/sms_c/priv/cert $BACKUP_DIR/
# تعيين الأذونات
chmod 600 $BACKUP_DIR/cert/*
echo "اكتمل النسخ الاحتياطي للتكوين: $BACKUP_DIR"
نسخة احتياطية لقاعدة البيانات:
#!/bin/bash
# /opt/sms_c/scripts/backup_database.sh
BACKUP_DIR="/var/backups/sms_c/database"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# النسخ الاحتياطي لقاعدة بيانات SQL CDR
# MySQL/MariaDB: استخدم mysqldump مع --single-transaction لضمان التناسق
# PostgreSQL: استخدم pg_dump -F c للتنسيق المخصص
# هيكل المثال (تكييفه مع قاعدة البيانات الخاصة بك):
# - استخدم أداة النسخ الاحتياطي المناسبة (mysqldump، pg_dump)
# - تمكين النسخ الاحتياطي الآمن للتعامل مع التناسق
# - ضغط المخرجات لتوفير المساحة
# - تكوين فترة الاحتفاظ (مثل 30 يومًا)
# إزالة النسخ الاحتياطية القديمة
find $BACKUP_DIR -name "sms_c_*.gz" -mtime +30 -delete
echo "اكتمل النسخ الاحتياطي لقاعدة البيانات: sms_c_${DATE}"
نسخة احتياطية لجدول التوجيه:
#!/bin/bash
# /opt/sms_c/scripts/backup_routes.sh
BACKUP_DIR="/var/backups/sms_c/routes"
DATE=$(date +%Y%m%d)
mkdir -p $BACKUP_DIR
# تصدير عبر API
curl https://api.example.com:8443/api/routes/export \
> $BACKUP_DIR/routes_${DATE}.json
echo "اكتمل النسخ الاحتياطي للمسارات: routes_${DATE}.json"
جدولة النسخ الاحتياطية (crontab):
# يوميًا في الساعة 2 صباحًا
0 2 * * * /opt/sms_c/scripts/backup_config.sh
0 2 * * * /opt/sms_c/scripts/backup_database.sh
0 2 * * * /opt/sms_c/scripts/backup_routes.sh
إجراءات الاسترداد
استعادة التكوين:
# إيقاف التطبيق
systemctl stop sms_c
# استعادة ملفات التكوين
cp -r /var/backups/sms_c/20251030/config/* /opt/sms_c/config/
# استعادة الشهادات
cp -r /var/backups/sms_c/20251030/cert/* /opt/sms_c/priv/cert/
# بدء التطبيق
systemctl start sms_c
استعادة قاعدة بيانات SQL CDR:
استخدم أدوات الاستعادة المناسبة لقاع��ة البيانات الخاصة بك:
- MySQL/MariaDB: فك الضغط وتوجيه إلى عميل mysql
- PostgreSQL: استخدم pg_restore مع النسخ الاحتياطية بالتنسيق المخصص
مهم: أوقف تطبيق SMS-C قبل استعادة قاعدة البيانات لتجنب تعارض البيانات.
استعادة جداول التوجيه:
- انتقل إلى واجهة الويب
/sms_routing - انقر على "استيراد المسارات"
- اختر ملف JSON الاحتياطي
- اختر وضع "استبدال"
- أكد الاستيراد
تخطيط السعة
مراقبة اتجاهات النمو
اتجاه حجم الرسائل:
استعلام Prometheus (متوسط 30 يومًا):
avg_over_time(sms_c_message_received_count[30d])
معدل نمو قاعدة البيانات:
-- نمو البيانات الشهري
SELECT
DATE_FORMAT(inserted_at, '%Y-%m') AS month,
COUNT(*) AS message_count,
ROUND(SUM(LENGTH(message_body)) / 1024 / 1024, 2) AS data_mb
FROM message_queues
GROUP BY month
ORDER BY month DESC
LIMIT 12;
مؤشرات السعة
استخدام وحدة المعالجة المركزية:
- طبيعي: < 50% متوسط
- مرتفع: > 70% مستمر
- حرج: > 90%
استخدام الذاكرة:
- طبيعي: < 70% من المتاح
- مرتفع: > 80%
- حرج: > 90%
استخدام القرص:
- طبيعي: < 60% ممتلئ
- مرتفع: > 75%
- حرج: > 85%
عمق الطابور:
- طبيعي: < 1000 معلق
- مرتفع: > 5000 معلق
- حرج: > 10,000 معلق
توصيات التوسع
متى يجب التوسع عموديًا (ترقية الموارد):
- وحدة المعالجة المركزية باستمرار > 70%
- الذاكرة باستمرار > 80%
- اختناق في عقدة واحدة
متى يجب التوسع أفقيًا (إضافة عقد):
- وحدة المعالجة المركزية > 50% في جميع العقد
- حجم الرسائل > 5,000 رسالة/ثانية
- الحاجة إلى توزيع جغرافي
- الحاجة إلى توفر عالي
توسيع قاعدة البيانات:
- نسخ قراءة للاستعلامات التقارير
- تحسين تجميع الاتصالات
- تحسين الفهارس
- تقسيم الجداول الكبيرة حسب التاريخ
استجابة الحوادث
مستويات الخطورة
حرج (استجابة فورية):
- لا يتم تسليم الرسائل
- جميع الوا��هات الأمامية مفصولة
- قاعدة البيانات غير متاحة
- API معطلة تمامًا
مرتفع (استجابة خلال ساعة واحدة):
- معدل نجاح التسليم < 80%
- عدة واجهات أمامية مفصولة
- فشل التوجيه > 10%
- تراكم الطوابير في تزايد
متوسط (استجابة خلال 4 ساعات):
- واجهة أمامية واحدة مفصولة
- معدل نجاح التسليم 80-95%
- معالجة الرسائل بطيئة
- بحث ENUM فاشل
منخفض (استجابة خلال 24 ساعة):
- تدهور طفيف في الأداء
- مشكلة في مسار واحد
- تنبيهات تحذيرية غير حرجة
قائمة التحقق من الحوادث
1. تقييم الخطورة:
- تحقق من تنبيهات Prometheus
- مراجعة مقاييس لوحة المعلومات
- تحقق من حالة قائمة الرسائل
- تحقق من اتصالات الواجهة الأمامية
2. جمع المعلومات:
- هل كانت هناك تغييرات تكوين حديثة؟
- هل كانت هناك نشرات حديثة؟
- حالة الاعتماديات الخارجية (OCS، DNS)؟
- رسائل الخطأ في السجلات؟
3. الإجراءات الفورية:
- إيقاف التغييرات الجارية
- التراجع عن النشرات الأخيرة إذا كانت السبب المشتبه به
- تمكين السجلات التفصيلية إذا لزم الأمر
- إبلاغ المعنيين
4. التحقيق:
- مراجعة سجلات التطبيق
- تحقق من استخدام موارد النظام
- فحص أداء قاعدة البيانات
- اختبار الاعتماديات الخارجية
5. الحل:
- تطبيق الإصلاح
- اختبار في المحاكي
- نشر في الإنتاج
- مراقبة التحسين
6. بعد الحادث:
- توثيق السبب الجذري
- تحديث المراقبة/التنبيهات
- تنفيذ تدابير وقائية
- تحديث كتيبات التشغيل
الحوادث الشائعة
تراكم الطوابير العالي:
- تحقق من معدل نجاح التسليم
- تحقق من أن الواجهات الأمامية متصلة وتستعلم
- تحقق من أداء قاعدة البيانات
- مراجعة Prometheus للزجاجات
- النظر في زيادة حجم الدفعة/الفترة
فشل التوجيه:
- مراجعة تكوين التوجيه
- اختبار في محاكي التوجيه
- تحقق من وجود مسارات مفقودة
- تحقق من وجود مسار catch-all
- تحقق من سجلات الأحداث لأسباب الفشل
انقطاعات الواجهة الأمامية:
- تحقق من حالة نظام الواجهة الأمامية
- تحقق من الاتصال الشبكي
- مراجعة سجلات الواجهة الأمامية
- اختبار التسجيل اليدوي لـ API
- تحقق من قواعد جدار الحماية
معالجة الرسائل البطيئة:
- تحقق من أداء استعلام قاعدة البيانات
- مراجعة تكوين عامل الدفعات
- تحقق من الموارد الكافية (CPU/الذاكرة)
- تحقق من تأخيرات بحث ENUM
- مراجعة أداء نظام الشحن
لإجراءات استكشاف الأخطاء التفصيلية، راجع دليل استكشاف الأخطاء.