Update: 2026-06-16 22:44:11

This commit is contained in:
Hamza-Ayed
2026-06-16 22:44:11 +03:00
parent b516fbc4ed
commit 2c3816badb
97 changed files with 10137 additions and 116 deletions

460
INFRASTRUCTURE_REPORT.md Normal file
View File

@@ -0,0 +1,460 @@
# تقرير البنية التحتية لنظام سيرو (Siro) - النشر في سوريا
**التاريخ:** 16 يونيو 2026
**المشروع:** Siro - تطبيق نقل الركاب
**الموقع:** سوريا
---
## 📊 ملخص الخدمات المطلوبة
| الخدمة | الدور | بروتوكول | بوابات |
|--------|-------|-----------|--------|
| **Load Balancer** | توزيع الأحمال على API | HTTP/HTTPS | 80, 443 |
| **API Server x2** | المعالجة الرئيسية | HTTP/HTTPS | 8080 (داخلي) |
| **MySQL Server** | قاعدة البيانات الرئيسية | MySQL | 3306 (داخلي) |
| **Redis Server** | كاش + مواقع السائقين | Redis | 6379 (داخلي) |
| **Driver Socket** | WebSocket للسائقين | WS/WSS + HTTP | 2020, 2021 |
| **Passenger Socket** | WebSocket للركاب | WS/WSS + HTTP | 3030, 3031 |
| **Wallet Server** | نظام المحفظة والمدفوعات | HTTP/HTTPS | 8081 (داخلي) |
| **OSRM Server (1-2)** | محرك التوجيه والخرائط | HTTP | 5000 (داخلي) |
| **Map SaaS** | خدمات الخرائط المخصصة | HTTP/HTTPS | 8082 |
---
## 🖥️ 1. Load Balancer (موازن الأحمال)
**الجهاز/السيرفر: جهاز واحد - عقدة أمامية**
| المواصفة | المطلوب | السبب |
|----------|---------|-------|
| **المعالج** | 2 Core (Xeon / AMD EPYC) | لا يحتاج طاقة معالجة، فقط توجيه الطلبات |
| **الرام** | 4 GB | HAProxy/Nginx يستهلك القليل |
| **التخزين** | 50 GB SSD | نظام تشغيل + سجلات |
| **الشبكة** | 1 Gbps | استيعاب حجم الطلبات |
| **نظام التشغيل** | Ubuntu 22.04 LTS أو Rocky Linux 9 | |
**البرامج المطلوبة:**
- Nginx ( reverse proxy + SSL termination + load balancing upstream للـ API servers )
- HAProxy (اختياري للـ TCP load balancing للسوكتات)
- Keepalived (لـ High Availability إذا أردت أكثر من موازن)
- Certbot / Let's Encrypt (لشهادات SSL)
**نظام التوزيع المقترح:**
```
Nginx upstream → API Server 1 (weight=5) + API Server 2 (weight=5)
└── Round Robin أو Least Connections
```
---
## 🖥️ 2. API Backend Server (سيرفر الباك إند الرئيسي)
**العدد: 2 سيرفرات خلف الـ Load Balancer**
| المواصفة | المطلوب | السبب |
|----------|---------|-------|
| **المعالج** | 8 Core (Xeon / AMD EPYC) | PHP-FPM يحتاج عدة عمال لكل نواة؛ 8cores = 16-24 worker |
| **الرام** | 16 GB | PHP worker ~50MB/worker + نظام + كاش |
| **التخزين** | 100 GB NVMe SSD | كود المصدر + صور السائقين + سجلات |
| **الشبكة** | 1 Gbps | اتصال مع الـ DB والخدمات الأخرى |
| **نظام التشغيل** | Ubuntu 22.04 LTS | |
**البرامج المطلوبة:**
- PHP 8.2/8.3 (مع extensions: pdo_mysql, redis, openssl, mbstring, gd)
- PHP-FPM (مع pm.max_children = 40-50 لكل سيرفر)
- Nginx للمحتوى الثابت
- Supervisor (لإدارة العمليات)
**توجيه الطلبات من كل سيرفر:**
- `api-syria.siromove.com/siro_v3` → Main API
- `ride-syria.siromove.com/siro` → Ride API
- `location-syria.siromove.com/siro/ride/location` → Location API
- كل هذه على نفس السيرفر، نفس قاعدة البيانات الرئيسية
**PHP-FPM Configuration:**
```ini
pm = dynamic
pm.max_children = 50
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 12
pm.max_requests = 1000
```
---
## 🗄️ 3. MySQL Database Server (سيرفر قاعدة البيانات الرئيسية)
**العدد: 1 + 1 Replica (اختياري للنسخ الاحتياطي)**
| المواصفة | المطلوب | السبب |
|----------|---------|-------|
| **المعالج** | 16 Core (Xeon / AMD EPYC) | MySQL يتوسع أفقياً مع عدد النوى |
| **الرام** | 64 GB | InnoDB Buffer Pool يحتاج ذاكرة كبيرة للأداء |
| **التخزين** | 1 TB NVMe SSD | 3 قواعد بيانات (intaleqDB1, ridesDB, locationDB) ~ 100-300 GB + سجلات |
| **الشبكة** | 10 Gbps | عمليات كتابة/قراءة مكثفة من سيرفرين API + سوكتات |
| **نظام التشغيل** | Ubuntu 22.04 LTS | |
**ضبط MySQL المقترح:**
```ini
innodb_buffer_pool_size = 40G # 60-70% من الرام
innodb_log_file_size = 2G
innodb_flush_log_at_trx_commit = 2 # أداء أفضل للتحديثات
innodb_flush_method = O_DIRECT
max_connections = 300 # 150 لكل API server + 50 للسوكتات
tmp_table_size = 256M
max_heap_table_size = 256M
query_cache_type = 0 # OFF (MySQL 8.0 ألغاه)
```
**الجداول الحساسة للأداء:**
- `car_locations` - يستخدم SPATIAL indexes + GEOMETRY - تأكد من `SRID=4326`
- `car_tracks` - 2.5M+ سجل - يحتاج أرشفة دورية أو partitioning
- `ride` + `waitingRides` - استعلامات متكررة مع SPATIAL
- `palces11` - FULLTEXT search
**ملاحظة: قاعدة بيانات الخرائط والتتبع (locationDB) هي الأكبر من حيث حجم الكتابة، يمكن وضعها على NVMe منفصل.**
---
## ⚡ 4. Redis Server (سيرفر الكاش والمواقع اللحظية)
**العدد: 1 (أو 1 + 1 Sentinel للتبديل التلقائي)**
| المواصفة | المطلوب | السبب |
|----------|---------|-------|
| **المعالج** | 8 Core | Redis single-threaded للعمليات الأساسية لكن له عمليات خلفية |
| **الرام** | 32 GB | بيانات GEO (مواقع السائقين) + كاش الجلسات + rate limiting |
| **التخزين** | 100 GB NVMe | RDB/AOF persistence |
| **الشبكة** | 10 Gbps | زمن استجابة منخفض جداً مطلوب |
| **نظام التشغيل** | Ubuntu 22.04 LTS | |
**ملاحظات هامة:**
- يجب أن يكون Redis على نفس الشبكة الداخلية (Latency < 1ms)
- الـ Socket servers (driver + passenger) يعتمدان على Redis بشكل كبير (GEOADD/GEORADIUS كل 500ms)
- حجم الذاكرة المطلوب يعتمد على عدد السائقين النشطين: كل موقع سائق ~ 200 bytes → 1M سجل = 200MB فقط
- لكن الكاش الإضافي (driver:profile:*، الجلسات) يحتاج مساحة إضافية
**نظام الكاش:**
```
driver_socket → Redis GEO (GEOADD)
passenger_socket → Redis GEORADIUS
API servers → Redis GET/SET (profile cache)
Rate Limiting → Redis INCR + EXPIRE
Session Store → Redis SETEX
```
---
## 🔌 5. WebSocket Servers (سيرفرات السوكت)
### 5.1 Driver Socket Server
| المواصفة | المطلوب | السبب |
|----------|---------|-------|
| **المعالج** | 8 Core | Workerman PHP event loop مع 500ms batch |
| **الرام** | 16 GB | كل اتصال WebSocket يستهلك ذاكرة + buffer |
| **التخزين** | 50 GB SSD | سجلات فقط |
| **الشبكة** | 1 Gbps | |
**البوابات:** `2020` (WebSocket للسائقين)، `2021` (Internal HTTP بين السوكتات)
### 5.2 Passenger Socket Server
| المواصفة | المطلوب | السبب |
|----------|---------|-------|
| **المعالج** | 4-8 Core | أقل تحميلاً من driver socket |
| **الرام** | 8 GB | |
| **التخزين** | 50 GB SSD | |
| **الشبكة** | 1 Gbps | |
**البوابات:** `3030` (WebSocket للركاب)، `3031` (Internal HTTP)
**ملاحظة:** يمكن دمج السوكتين في سيرفر واحد (Driver + Passenger على نفس الجهاز) لتوفير التكاليف إذا كان عدد المستخدمين متوسطاً. أما إذا توقعتم نمواً كبيراً، فالأفضل فصلهما.
**نظام التشغيل للسوكتات:** يفضل Ubuntu 22.04 LTS ويحتاج PHP-CLI وليس PHP-FPM
---
## 💳 6. Wallet / Payment Server (سيرفر المحفظة والمدفوعات)
| المواصفة | المطلوب | السبب |
|----------|---------|-------|
| **المعالج** | 4 Core | طلبات أقل تواتراً لكنها حسّاسة |
| **الرام** | 8 GB | |
| **التخزين** | 50 GB SSD | كود + سجلات |
| **الشبكة** | 1 Gbps | |
**ملاحظات:**
- يمكن فصله كخدمة مستقلة أو وضعه على أحد API servers
- يحتاج اتصال مع بوابات الدفع (PayMob، MTN، Syriatel Cash)
- **هام:** يحتاج HTTPS إلزامي (ضروري لأمان المدفوعات)
- إذا كانت المدفوعات محليّة في سوريا فقط، قد تحتاج بوابات دفع سورية (MTN Cash, Syriatel Cash)
---
## 🗺️ 7. OSRM Routing Server (محرك التوجيه)
**العدد: 1-2 سيرفر (حسب عدد المسارات المطلوبة)**
| المواصفة | المطلوب | السبب |
|----------|---------|-------|
| **المعالج** | 16 Core | OSRM routing requests تستهلك CPU عالٍ |
| **الرام** | 32 GB | OSRM يحمل خريطة كاملة في الذاكرة |
| **التخزين** | 200 GB NVMe | بيانات OSM لسوريا + ملفات OSRM processed |
| **الشبكة** | 1 Gbps | |
**حجم OSM لسوريا:**
- ملف الخريطة (syria-latest.osm.pbf) ~ 100-200 MB
- بعد معالجة OSRM (contracted graph) ~ 500 MB - 1 GB
- الذاكرة المطلوبة للتشغيل ~ 8-16 GB للخريطة نفسها
**يمكنك تشغيله على Docker:**
```bash
docker run -t -v "${PWD}:/data" osrm/osrm-backend osrm-extract -p /opt/car.lua /data/syria-latest.osm.pbf
docker run -t -v "${PWD}:/data" osrm/osrm-backend osrm-contract /data/syria-latest.osrm
docker run -t -i -p 5000:5000 -v "${PWD}:/data" osrm/osrm-backend osrm-routed --algorithm mld /data/syria-latest.osrm
```
---
## 🗺️ 8. Map SaaS Server (سيرفر الخرائط المخصص)
| المواصفة | المطلوب | السبب |
|----------|---------|-------|
| **المعالج** | 4-8 Core | |
| **الرام** | 16 GB | للـ tile caching والـ geocoding |
| **التخزين** | 200 GB SSD | Tile cache + بيانات جغرافية |
| **الشبكة** | 1 Gbps | |
هذا السيرفر يقوم بـ:
- Reverse Geocoding (تحويل إحداثيات إلى عنوان)
- Place Search (البحث عن الأماكن)
- Route calculation (قد يمرر طلبات إلى OSRM)
- يمكن استخدام Nominatim + PostgreSQL/PostGIS للتجيكودينغ
---
## 🌐 9. الشبكة (Network Topology)
### 9.1 الشبكة الداخلية (Internal Network)
**مفضّلة**: شبكة داخلية خاصة (VLAN / Private Subnet)
```
┌─────────────┐
│ Internet │
└──────┬──────┘
┌──────┴──────┐
│ Firewall │
│ (iptables/ │
│ nftables) │
└──────┬──────┘
┌──────┴──────┐
│Load Balancer │
│(Nginx/HAProxy)│
│ Public IP │
└──────┬──────┘
┌────────────────┼────────────────┐
│ │ │
┌──────┴──────┐ ┌─────┴──────┐ ┌─────┴──────┐
│ API SRV 1 │ │ API SRV 2 │ │ Socket SV │
│ 10.0.1.10 │ │ 10.0.1.11 │ │10.0.1.20-21 │
└──────┬──────┘ └─────┬──────┘ └──────┬──────┘
│ │ │
└────────────────┼────────────────┘
┌────────────────┼────────────────┐
│ │ │
┌──────┴──────┐ ┌─────┴──────┐ ┌─────┴──────┐
│ MySQL DB │ │ Redis │ │ OSRM │
│ 10.0.1.30 │ │ 10.0.1.31 │ │ 10.0.1.40 │
└─────────────┘ └────────────┘ └────────────┘
┌─────────────┐ ┌────────────┐
│ Wallet SV │ │ Map SaaS │
│ 10.0.1.50 │ │ 10.0.1.60 │
└─────────────┘ └────────────┘
```
**نطاق الشبكة الداخلية:** `10.0.1.0/24` (أي نطاق خاص)
### 9.2 الشبكة الخارجية
- السيرفرات التي تحتاج IP عام: **Load Balancer فقط**
- Socket Servers: يمكن تشغيل WebSocket على نفس Load Balancer (رفع بروتوكول WS إلى WSS)
- OSRM و Map SaaS: داخليان فقط (API servers تتصل بهم داخلياً)
- قاعدة البيانات: **ليست عامة أبداً** - فقط وصلات داخلية
### 9.3 الإجراءات الأمنية
- **Firewall**: فتح المنافذ التالية فقط من الخارج:
- 80 (HTTP → redirect to 443)
- 443 (HTTPS)
- 2020 (WebSocket driver - اختياري إذا прямо WS)
- 3030 (WebSocket passenger - اختياري)
- 22 (SSH - فقط من IPs محددة)
- **Fail2ban**: على Load Balancer لحماية SSH و API
- **UFW/iptables**: على كل سيرفر لحجب المنافذ غير المستخدمة
- **VPN**: للوصول إلى الإدارة (Tailscale أو WireGuard)
- **SSL/TLS**: جميع الاتصالات الخارجية مشفرة
### 9.4 هل شبكة داخلية أم خارجية؟
| الخدمة | المفضل |
|--------|--------|
| API ↔ Database | **داخلي** (VLAN 10.0.1.x) |
| API ↔ Redis | **داخلي** |
| Socket ↔ Database | **داخلي** |
| API ↔ Wallet | **داخلي** (أو خارجي إذا wallet على سيرفر مختلف كلياً) |
| API ↔ OSRM | **داخلي** |
| API ↔ Map SaaS | **داخلي** |
| Internet ↔ Load Balancer | **خارجي** |
| Driver App ↔ Socket | **خارجي** (لكن عبر Load Balancer أيضاً) |
---
## 📍 10. اعتبارات خاصة لسوريا
### 10.1 استضافة السيرفرات
**الخيارات الموصى بها (بالترتيب):**
1. **مراكز البيانات السورية:**
- **شركة الاتصالات السورية (STE)** - خدمات hosting واستضافة
- **Ayaa Cloud** - مزود خدمات سحابية سوري
- **SNS (Syrian Network Systems)** - colocation واستضافة
2. **السيرفرات في دول مجاورة (للأداء):**
- **لبنان** (IDM، Ogero) - أقرب وأقل زمن استجابة (< 30ms)
- **الأردن** - خيار ممتاز (زمن استجابة ~ 30-50ms)
- **تركيا** - أقرب لشمال سوريا
- **الإمارات / السعودية** - استقرار أكبر لكن زمن استجابة أعلى (~ 80-100ms)
3. **سيرفرات عالمية:**
- **Hetzner (ألمانيا/فنلندا)** - أفضل قيمة مقابل سعر (~ 150-200ms latency)
- **OVH (فرنسا)** - جيد
- **DigitalOcean / Linode** - للاستضافة السحابية
### 10.2 مشاكل الإنترنت في سوريا
| المشكلة | الحل |
|---------|------|
| **انقطاع الكهرباء** | UPS لكل سيرفر + مولد كهربائي للمركز |
| **ضعف سرعة الإنترنت** | استخدام Content Delivery (CDN) للملفات الثابتة |
| **الحجب (بعض الخدمات)** | استخدام VPN أو proxy للاتصال بخدمات خارجية (PayMob، Firebase) إذا لزم الأمر |
| **تكاليف النطاق العالي** | ضغط البيانات (gzip) + تحجيم الصور + lazy loading |
| **تذبذب الاتصال (Packet Loss)** | TCP tuning, BBR congestion control على السيرفرات |
### 10.3 سرعة الإنترنت في سوريا
| الخدمة | السرعة المتوقعة | ملاحظة |
|--------|-----------------|--------|
| ADSL | 4-16 Mbps | الأكثر انتشاراً |
| Fiber (FTTH) | 20-100 Mbps | متوفرة في المدن الكبرى |
| 4G/LTE | 10-50 Mbps | جيد للمستخدمين النهائيين |
| Business Line | 50-200 Mbps | المطلوب للسيرفرات |
**لتطبيق مثالي في سوريا:**
- حجم API response يجب أن يكون < 50 KB
- حجم الصور مضغوط (WebP)
- استخدام Lazy loading للخرائط
- تفعيل HTTP/2 على الـ Load Balancer
### 10.4 استهلاك النطاق الترددي المقدر
| الخدمة | الاستهلاك التقريبي (شهرياً) |
|--------|---------------------------|
| API Requests (REST) | 200-500 GB |
| WebSocket Data | 500 GB - 2 TB |
| Map Tiles & Routing | 200-500 GB |
| Uploads (صور، وثائق) | 100-200 GB |
| **المجموع التقريبي** | **1-3 TB شهرياً** |
---
## 📐 11. الترتيب المقترح للتنفيذ
```
المرحلة 1: البنية الأساسية
├── تجهيز Load Balancer (Nginx + SSL)
├── تجهيز MySQL Server (تركيب + ضبط + تحميل البيانات)
└── تجهيز Redis Server
المرحلة 2: السيرفرات الأساسية
├── تجهيز API Server 1 (PHP + Nginx + FPM)
├── تجهيز API Server 2 (clone من 1)
└── ربط API Servers مع Load Balancer
المرحلة 3: السيرفرات المساعدة
├── تجهيز Socket Server (Driver Socket + Passenger Socket)
├── تجهيز Wallet Server
└── ربط الكل مع قاعدة البيانات و Redis
المرحلة 4: الخرائط
├── تجهيز OSRM Server (تحميل OSM سوريا + معالجة)
├── تجهيز Map SaaS Server
└── اختبار التوجيه والتجيكودينغ
المرحلة 5: الاختبار والإطلاق
├── اختبار تحميل (Load Testing) - استخدام K6 أو Locust
├── اختبار WebSocket مع 1000+ مستخدم وهمي
├── مراقبة (Prometheus + Grafana)
└── الإطلاق التدريجي
```
---
## 💰 12. التكلفة التقديرية الشهرية (للسيرفرات)
| السيرفر | المواصفات | التكلفة التقريبية (شهرياً) |
|---------|-----------|--------------------------|
| Load Balancer | 2 Core, 4GB | $20 - $40 |
| API Server x2 | 8 Core, 16GB (لكل) | $100 - $200 (لكل) |
| MySQL Server | 16 Core, 64GB, 1TB NVMe | $300 - $600 |
| Redis Server | 8 Core, 32GB | $100 - $200 |
| Socket Server(s) | 8 Core, 16GB | $80 - $150 |
| Wallet Server | 4 Core, 8GB | $40 - $80 |
| OSRM Server | 16 Core, 32GB | $200 - $400 |
| Map SaaS | 4 Core, 16GB | $60 - $120 |
| **المجموع التقريبي** | | **$900 - $1,890 شهرياً** |
**ملاحظة:** الأسعار تقديرية وقد تختلف حسب المزود. السيرفرات داخل سوريا قد تكون أرخص ولكن بجودة شبكة أقل.
---
## ✅ 13. الخلاصة والتوصيات
1. **أفضل نموذج لنشر سيرفرات سوريا هو:**
- استضافة السيرفرات في **مركز بيانات سوري** أو **لبناني/أردني**
- استخدام **شبكة داخلية (VLAN)** لكل الاتصالات بين السيرفرات
- وضع **Load Balancer** واحد أمام API Servers (2)
- قاعدة البيانات الرئيسية + Redis على نفس الشبكة الداخلية مع اتصال 10 Gbps
2. **توزيع الأدوار:**
- API Servers: 8 Cores + 16 GB RAM ✅ (كافٍ)
- Database: 16 Cores + 64 GB RAM ✅ (ضروري)
- Redis: 8 Cores + 32 GB RAM ✅ (ضروري للأداء اللحظي)
- Socket: 8 Cores + 16 GB RAM ✅ (كحد أدنى)
3. **توفير التكاليف:**
- يمكن دمج Socket Servers في جهاز واحد (Driver + Passenger) لتوفير سيرفر
- يمكن دمج Wallet مع أحد API Servers
- يمكن استخدام OSRM Server واحد لسوريا (الخريطة صغيرة نسبياً)
4. **أولوية الأداء في سوريا:**
- **Redis** هو أهم عنصر لأداء التطبيق (مواقع السائقين + كاش)
- **MySQL Buffer Pool** يحدد سرعة الاستعلامات
- **الـ Load Balancer** يوزع الضغط عن API servers
5. **الأمان:**
- API Servers → قاعدة البيانات عبر مستخدم MySQL مخصص بصلاحيات محدودة
- Redis محمي بكلمة مرور (requirepass + rename-command FLUSHALL)
- جميع المفاتيح السرية في `.env` مع صلاحيات 600
- JWT + HMAC للمدفوعات
---