कैसे हमने एक ही कोडबेस से मल्टी-ऐप प्लेटफ़ॉर्म बनाया
Alphazed एक ही बैकेंड कोडबेस और साझा Flutter मोबाइल फ्रेमवर्क से 7+ शैक्षिक ऐप्स (Amal, Thurayya, Qais, KidElite, Alphazed School, Alphazed Montessori, और कई) चलाता है। हर ऐप को अपनी अलग डेटाबेस टेबल्स (प्रिफिक्स्ड), कॉन्फ़िगरेशन, पुश नोटिफिकेशन, ईमेल टेम्प्लेट्स और कंटेंट मिलता है — लेकिन प्रमाणीकरण (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 गेटवे रूट, और मॉनिटरिंग बनाता है — लेकिन सभी एक ही बैकेंड कोडबेस से जुड़ते हैं।
तीन-स्तरीय कॉन्फ़िग प्राथमिकता
# 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 (Juz Amma संरचना)
│ │ │ ├── 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 Framework कॉन्फ़िगरेशन
# 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 पाइपलाइन
- साझा लर्निंग एल्गोरिदम: spaced repetition और कंटेंट मिक्सिंग सभी ऐप्स को लाभ पहुंचाते हैं
- ऑपरेशनल दक्षता: एक टीम सभी इन्फ्रास्ट्रक्चर का प्रबंधन करती है
लागत के लिए:
- साझा 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 पूल मतलब वे कंकरेंसी के लिए प्रतिस्पर्धा करते हैं
- समाधान: प्रत्येक ऐप के लिए CloudWatch स्केलिंग नीतियां। अगर
amal-*Lambdas कंकरेंसी लिमिट पर पहुंचते हैं, तो स्वतः स्केल करें।
सामान्य प्रश्न
प्रश्न: क्या एक कोडबेस साझा करने से ऐप्स में तालमेल (कपलिंग) बढ़ता है?
उत्तर: नहीं। हर ऐप का कोड अलग डायरेक्ट्रीज (apps/amal, apps/thurayya) में है। साझा कोड packages/alphazed_common में है और स्पष्ट रूप से वर्शन नियंत्रित है। टाइट कपलिंग डिज़ाइन में खराबी होती है — इसे कोड समीक्षा में पकड़ा जाता है।
प्रश्न: अगर किसी ऐप को ब्रेकिंग API बदलाव चाहिए तो क्या होगा?
उत्तर: API वर्शनिंग प्रति ऐप दी जाती है: /amal/v1/*, /thurayya/v1/*। ऐप्स स्वतंत्र रूप से अपग्रेड कर सकते हैं। पुराने वर्शन 12 महीने तक चलते हैं, ताकि टीम अपडेट कर सके।
प्रश्न: क्या ऐप्स यूज़र्स साझा कर सकते हैं?
उत्तर: डिफ़ॉल्ट रूप से नहीं। हर ऐप की अलग यूज़र टेबल होती है (प्रिफिक्स्ड)। अगर कोई अभिभावक Amal और Thurayya दोनों सब्सक्राइब करना चाहता है, तो वे अलग खाते बनाते हैं (या भविष्य में "परिवार" लिंक फीचर दिया जा सकता है)।



