تدير Alphazed أكثر من 7 تطبيقات تعليمية (Amal، Thurayya، Qais، KidElite، Alphazed School، Alphazed Montessori، وأكثر) من قاعدة شفرة خلفية واحدة وإطار عمل Flutter المحمول المشترك. يحصل كل تطبيق على جداول قاعدة البيانات الخاصة به (مسبوقة)، الإعدادات، إشعارات الدفع، قوالب البريد الإلكتروني، والمحتوى — ولكن يشارك في المصادقة (AWS Cognito)، بنية التحليلات، والخوارزميات التعليمية الأساسية.
الخلفية: اختيار التطبيق عند التشغيل
كيف يعمل
عند النشر، تختار متغير البيئة التطبيق:
# نشر Amal
export APP_NAME=amal
serverless deploy
نشر Thurayya
export APP_NAME=thurayya
serverless deploy
نشر Qais
export APP_NAME=qais
serverless deploy
ينشئ كل نشر وظائف Lambda مستقلة، طرق API Gateway، والمراقبة — ولكنها جميعًا تربط بقاعدة الشفرة الخلفية نفسها.
أولوية إعداد من ثلاثة مستويات
# src/config.py
import os
app_name = os.getenv('APP_NAME', 'amal')
المستوى 1: مطابقة تطبيق دقيقة
config = load_json(f'config/{app_name}.json')
المستوى 2: مطابقة عائلة التطبيق (إذا لم يكن هناك إعداد دقيق)
if not config:
family = app_name.split('_')[0] # 'amal_beta' → 'amal'
config = load_json(f'config/{family}.json')
المستوى 3: الافتراضي
if not config:
config = load_json('config/default.json')
إعداد لكل تطبيق (config/amal.json)
{
"app_name": "amal",
"app_id": "com.alphazed.amal",
"database": {
"table_prefix": "amal_"
},
"email": {
"template_dir": "templates/amal",
"from_address": "amal@alphazed.com",
"from_name": "Amal Team"
},
"push_notifications": {
"firebase_project": "alphazed-amal",
"apns_certificate": "certs/amal.pem"
},
"content": {
"s3_bucket": "amal-content-production",
"curriculum_id": "amal_v3_arabic"
},
"feature_flags": {
"enable_tajweed_feedback": false,
"enable_noorani_qaida": false,
"enable_juz_amma": false,
"enable_creature_building": true,
"enable_physics_games": true
},
"pricing": {
"monthly_usd": 6.99,
"yearly_usd": 67.99,
"trial_days": 14
}
}
الموارد المشتركة مقابل الموارد الخاصة بالتطبيق
| المورد | مشترك | خاص بالتطبيق | السبب |
|---|---|---|---|
| شفرة Lambda | ✓ نعم | ✗ لا | قاعدة شفرة واحدة، التفريع بواسطة APP_NAME |
| مثيل RDS | ✓ نعم | ✗ لا (جداول مسبوقة) | تخفيض التكاليف، نسخة احتياطية واحدة |
| محتوى S3 | ✗ لا | ✓ نعم | كل تطبيق لديه منهجه الخاص |
| AWS Cognito | ✓ نعم | ✗ لا (عبر app_id) |
مصادقة مركزية، التمييز بواسطة app_id |
| بحيرة التحليلات | ✓ نعم | ✗ لا (مقسمة بالتطبيق) | أنبوب موحد، بيانات منفصلة |
| رسائل Firebase | ✗ لا | ✓ نعم | APNs + FCM خاصة بالتطبيق |
الواجهة الأمامية: بنية تطبيقات متعددة لـ Flutter
النواة المشتركة (packages/alphazed_common)
- إدارة الحالة (Riverpod)
- التعامل مع الصوت
- مكتبة الرسوم المتحركة (تكامل Rive)
- نظام التصميم (الألوان، النصوص، الواجهات)
- تدفقات المصادقة
- عميل التحليلات
طبقات خاصة بالتطبيق (apps/amal، apps/thurayya، إلخ)
apps/
├── amal/
│ ├── lib/
│ │ ├── main.dart (نقطة دخول التطبيق)
│ │ ├── config/
│ │ │ ├── curriculum.json (بنية دروس Amal)
│ │ │ ├── colors.dart (موضوع Amal)
│ │ │ └── characters.json (تخصيص الأفاتار)
│ │ └── screens/ (شاشات خاصة بـ Amal)
│ └── pubspec.yaml (اعتماديات Amal)
│
├── thurayya/
│ ├── lib/
│ │ ├── main.dart (نقطة دخول مختلفة)
│ │ ├── config/
│ │ │ ├── curriculum.json (بنية جزء عم)
│ │ │ ├── colors.dart (موضوع Thurayya)
│ │ │ └── characters.json (تخصيص الأفاتار)
│ │ └── screens/ (شاشات خاصة بـ Thurayya)
│ └── pubspec.yaml (اعتماديات Thurayya)
│
└── packages/
└── alphazed_common/ (شفرة مشتركة)
الإعداد في وقت الإنشاء
# بناء Amal
flutter build apk --dart-define=APP_NAME=amal --dart-define=CURRICULUM=amal_v3
بناء Thurayya
flutter build apk --dart-define=APP_NAME=thurayya --dart-define=CURRICULUM=thurayya_juzamma
في وقت الإنشاء، يحصل كل تطبيق على بيانات منهجه، ألوانه، وإعداده الخاصة المدمجة. مستودع شفرة واحد، ملفات متعددة مدمجة.
النشر: مجموعات مستقلة
إعداد إطار العمل بدون خادم
# serverless.yml
service: alphazed-backend
custom:
pythonRequirements:
dockerizePip: true
app_name: ${env:APP_NAME}
functions:
يتم نشر هذه الوظائف لكل قيمة APP_NAME
get_user:
handler: src/handlers/user.get_user
events:
- http:
path: app/{app_name}/user/{user_id}
method: get
content_duo:
handler: src/handlers/content.generate_content_duo
timeout: 20
events:
- http:
path: app/{app_name}/content_duo
method: post
resources:
Resources:
# يحصل كل تطبيق على مجموعة سجلات CloudWatch الخاصة به
${self:custom.app_name}LogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: /aws/lambda/alphazed-${self:custom.app_name}
RetentionInDays: 30
عند النشر مع APP_NAME=amal، ينشئ CloudFormation:
- وظائف Lambda مسبوقة بـ
alphazed-amal-* - طرق API Gateway تحت
/amal/* - سجلات CloudWatch تحت
/aws/lambda/alphazed-amal - توسع ومراقبة مستقلة
لماذا هذا مهم
لفرق المنتجات
- إطلاق تطبيق جديد: أسابيع بدلًا من شهور (مشاركة البنية التحتية)
- تحقيق التكافؤ في الميزات: تطبيق إصلاح الأخطاء وتحسين الخوارزميات على جميع التطبيقات فورًا
- اختبار A/B: تجربة الميزات بسهولة على تطبيق واحد قبل التوسع إلى الآخرين
للهندسة
- قاعدة شفرة واحدة: مجموعة اختبارات واحدة، خط واحد للدمج والنشر المستمر (CI/CD)
- الخوارزميات التعليمية المشتركة: التكرار المتباعد وخلط المحتوى يفيد جميع التطبيقات
- كفاءة التشغيل: فريق واحد يدير كل البنية التحتية
للتكلفة
- RDS مشتركة: جزء من تكلفة 7 قواعد بيانات مستقلة
- Cognito مشتركة: موفر هوية واحد لجميع التطبيقات
- التحليلات المشتركة: أنبوب واحد يخدم 7 تطبيقات
- تقدير توفير التكاليف: 40,000 - 60,000 دولار/سنة مقارنة بالخلفيات المستقلة
التحديات والحلول
التحدي 1: تعارض في مخطط قاعدة البيانات
- Amal يحتاج إلى جدول
amal_user_memory - Thurayya يحتاج إلى جدول
thurayya_user_memory(حقول مختلفة لحفظ القرآن) - الحل: الترحيل مدرك للتطبيق. ملف
migrations/001_amal_user_memory.sqlيعمل فقط عندماAPP_NAME=amal
التحدي 2: مجموعات ميزات مختلفة
- Thurayya لديه ملاحظات التجويد؛ Amal لا يحتوي عليها
- Amal لديه ألعاب الفيزياء؛ Thurayya لا يحتوي عليها
- الحل: أعلام الميزات في الإعدادات (
enable_tajweed_feedback،enable_physics_games)
التحدي 3: التوسع المستقل
- Amal يشهد زيادة في الزيارات؛ Thurayya في هدوء
- مشترك Lambda pool يعني التنافس على الإنتاجية المتزامنة
- الحل: سياسات توسيع CloudWatch لكل تطبيق. إذا وصلت Lambdas الخاصة بـ
amal-*إلى الحد المحدد، يتم التوسع تلقائيًا بشكل مستقل
الأسئلة الشائعة
س: ألا يؤدي مشاركة قاعدة شفرة واحدة إلى إنشاء ترابط بين التطبيقات؟
ج: لا. شفرة كل تطبيق موجودة في أدلة منفصلة (apps/amal، apps/thurayya). الشفرة المشتركة في packages/alphazed_common وتتم مراجعتها بشكل صريح. الترابط الوثيق يعد علامة تصميم غير حسنة — نكتشفه في مراجعة الشفرة.
س: ماذا لو كان أحد التطبيقات يحتاج إلى تغيير API كبير؟
ج: نحن ننشر واجهات برمجة التطبيقات (API) لكل تطبيق: /amal/v1/*، /thurayya/v1/*. يمكن للتطبيقات التحديث بشكل مستقل. الإصدارات القديمة تعمل لمدة تصل إلى 12 شهرًا، مما يمنح فرق التطبيقات الوقت لتحديثها.
س: هل يمكن للتطبيقات مشاركة المستخدمين؟
ج: ليس افتراضيًا. كل تطبيق لديه جدول مستخدم خاص به (مسبوق). إذا أراد الوالد الاشتراك في كل من Amal وThurayya، يقوم بإنشاء حسابات منفصلة (أو يمكننا إضافة ميزة "ربط العائلة" لاحقًا).



