chore: استيراد أولي من سيرو (ecfe7568) — بلا أي تعديل
نسخة كاملة من مستودع سيرو عند ecfe7568 لتكون أساس تطبيق «انطلق». نُسخ المتعقَّب في git فقط (12,509 ملفاً / 302 م.ب) بـ git archive، لا `cp -r` — فاستُثنيت تلقائياً مخلفات البناء (build · node_modules · .dart_tool · .gradle · Pods ≈ 10.7 غ.ب) وكل ما يستثنيه .gitignore. هذا الكوميت **بلا أي تعديل عمداً** حتى يكون كل ما يليه فرقاً مقروءاً مقابل سيرو الأصلي. سيرو نفسه لم يُمسّ. ⚠️ لا يبني بعد: `.env` و`lib/env/env.g.dart` غير متعقَّبين في سيرو (وهذا صحيح — أسرار لكل مستأجر). كل تطبيق فلاتر هنا يحتاج .env خاصاً بانطلق ثم توليد env.g.dart عبر build_runner. لا تُنسخ أسرار سيرو. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,258 @@
|
||||
# 📘 دليل المعمارية الفنية، التوسع، والنشر المخصص (White-Label Guide) — نظام سيرو Siro
|
||||
|
||||
---
|
||||
|
||||
## 1. 📊 قدرة السيرفر وتحليل الأداء (Server Capacity & Performance Audit)
|
||||
|
||||
### أ. مواصفات السيرفر الحالي وقراءات اختبار الضغط (Real-world Benchmarks)
|
||||
تم تقييم أداء سيرفر سيرو بنجاح عبر محاكاة واقعية شاملة لـ **1,000 رحلة حية متزامنة** (تضمنت: الطلب، البث الفوري، القبول، التتبع اللحظي للـ GPS أثناء القيادة عبر الـ WebSockets، وإنهاء الرحلة مع حساب التكلفة):
|
||||
|
||||
| المعيار | القراءة الفعلية |
|
||||
| :--- | :--- |
|
||||
| 💻 **مواصفات المعالج (CPU)** | 6 أنوية افتراضية (Cores 0-5) |
|
||||
| 🧠 **الذاكرة العشوائية (RAM)** | 12.0 Gigabytes (استغلال 6.8 GB فقط متبقي > 4.9 GB) |
|
||||
| ⏱️ **زمن معالجة الـ 1,000 رحلة** | `388.31` ثانية |
|
||||
| ⚡ **معدل المعالجة (Throughput)** | **`27.77` رحلة متكاملة / ثانية** |
|
||||
| ✅ **إجمالي العمليات الناجحة** | **`10,785` عملية حية بدون أي خطأ** |
|
||||
| ❌ **نسبة الفشل (Failed Trips)** | **`0 / 1000` (صفر % أخطاء)** |
|
||||
|
||||
---
|
||||
|
||||
### ب. الحسبة الرياضية لسعة التحمل في أوقات الذروة (Peak Capacity Calculations)
|
||||
|
||||
1. **القدرة اللحظية القصوى (Theoretical Max):**
|
||||
- المعالجة بالثانية = $27.77 \text{ رحلة/ثانية}$
|
||||
- المعالجة بالدقيقة = $27.77 \times 60 = 1,666 \text{ رحلة/دقيقة}$
|
||||
- المعالجة بالساعة = $1,666 \times 60 = 99,972 \text{ رحلة/ساعة}$
|
||||
|
||||
2. **القدرة التشغيلية الآمنة مع تطبيق معامل أمان 50% (Production Safe Capacity):**
|
||||
- مع احتساب تباين شبكات الهاتف المحمول (4G/5G) والاستجابات اللحظية للعملاء، يستطيع **السيرفر الحالي الفردي** معالجة:
|
||||
- **من 40,000 إلى 50,000 رحلة نشطة ومكتملة في الساعة الواحدة!**
|
||||
- *(هذه السعة تغطي احتياج أسطول تكاسي عاصمة كاملة في أوقات الذروة بامتياز).*
|
||||
|
||||
---
|
||||
|
||||
### ج. كفاءة الموارد وبوابة الـ Nginx
|
||||
- **Nginx Reverse Proxy:** استهلك أقل من **8MB RAM** وأقل من **0.7% CPU** أثناء معالجة الـ 1,000 رحلة، بفضل معماريته غير الحاجبة (`epoll`).
|
||||
- **Workerman Socket Servers:** معالجة فائقة السرعة لاتصالات السائقين والركاب بواسطة الـ Redis Batching.
|
||||
- **MySQL & Redis:** دمج الاستعلامات التجميعية ومنع الاختناقات (Deadlocks).
|
||||
|
||||
---
|
||||
|
||||
## 2. 📐 المعمارية الرسمية للنظام (System Architecture & Mermaid Diagram)
|
||||
|
||||
يتكون نظام سيرو الحالي من بنية متكاملة عالية الأداء تعيش على سيرفر فيزيائي موحد، ومقسمة إلى حاويات دكر متخصصة مترابطة عبر شبكة دكر الداخلية:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph Clients["📱 تطبيقات الهواتف المحمولة (Clients)"]
|
||||
RiderApp["تطبيق الراكب (Rider App)"]
|
||||
DriverApp["تطبيق السائق (Driver App)"]
|
||||
end
|
||||
|
||||
subgraph Server["🖥️ السيرفر الموحد (Docker Compose Infrastructure - siro)"]
|
||||
subgraph NginxEntry["🌐 بوابة Nginx المركزية (Port 80 / 8080)"]
|
||||
Nginx["Nginx Reverse Proxy"]
|
||||
end
|
||||
|
||||
subgraph FPMContainer["⚡ حاوية المعالجة الرئيسية (PHP-FPM: php:9000)"]
|
||||
BackendAPI["الباك إند الرئيسي (/var/www/backend)"]
|
||||
PaymentAPI["سيرفر المدفوعات (/var/www/v2)"]
|
||||
LocationAPI["سيرفر المواقع (/var/www/loction_server)"]
|
||||
end
|
||||
|
||||
subgraph SocketDriver["🔌 حاوية سوكيت السائقين (socket_driver)"]
|
||||
DriverWS["Workerman WS Server (Port 2020)"]
|
||||
DriverInternalHTTP["مستقبل الإشعارات الداخلي (Port 2021)"]
|
||||
end
|
||||
|
||||
subgraph SocketPassenger["🔌 حاوية سوكيت الركاب (socket_passenger)"]
|
||||
PassengerWS["Workerman WS Server (Port 3030)"]
|
||||
PassengerInternalHTTP["مستقبل الإشعارات الداخلي (Port 3031)"]
|
||||
end
|
||||
|
||||
subgraph DataStorage["💾 قواعد البيانات والكاش المحلي"]
|
||||
MySQL[("MySQL 8.4 Database")]
|
||||
Redis[("Redis 7.2 GEO & Pub/Sub")]
|
||||
end
|
||||
end
|
||||
|
||||
%% اتصالات العملاء
|
||||
RiderApp -- "HTTPS REST API" --> Nginx
|
||||
DriverApp -- "HTTPS REST API" --> Nginx
|
||||
DriverApp -- "WebSocket (Port 2020)" --> DriverWS
|
||||
RiderApp -- "WebSocket (Port 3030)" --> PassengerWS
|
||||
|
||||
%% توجيه Nginx الداخلي (FastCGI)
|
||||
Nginx -- "FastCGI /backend/..." --> BackendAPI
|
||||
Nginx -- "FastCGI /v2/main/..." --> PaymentAPI
|
||||
Nginx -- "FastCGI /loction_server/..." --> LocationAPI
|
||||
|
||||
%% الاتصالات الداخلية السريعة (Server-to-Server)
|
||||
BackendAPI -- "cURL (http://nginx/v2/main/...)" --> PaymentAPI
|
||||
BackendAPI -- "cURL (http://nginx/loction_server/driver_socket.php)" --> DriverInternalHTTP
|
||||
LocationAPI -- "cURL (http://nginx/loction_server/passenger_socket.php)" --> PassengerInternalHTTP
|
||||
|
||||
%% قواعد البيانات والـ Redis
|
||||
BackendAPI --> MySQL
|
||||
PaymentAPI --> MySQL
|
||||
BackendAPI --> Redis
|
||||
LocationAPI --> Redis
|
||||
DriverWS --> Redis
|
||||
PassengerWS --> Redis
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### أ. التوسع الأفقي وفصل السيرفرات عند الحاجة (Horizontal Scaling)
|
||||
|
||||
عند الحاجة للتوسع الضخم (أكثر من 50,000 رحلة في الساعة)، تم تصميم نظام سيرو ليدعم الفصل الفوري إلى **سيرفرين أو أكثر** عبر حاويات الدوكر المستقلة:
|
||||
|
||||
```text
|
||||
[ SERVER 1: API & DB ] [ SERVER 2: SOCKETS & REDIS ]
|
||||
┌──────────────────────────────────┐ ┌──────────────────────────────────┐
|
||||
│ • Nginx Reverse Proxy │ │ • Socket Driver (Port 2020/2021)│
|
||||
│ • PHP-FPM Backend Engine │ ───────► │ • Socket Passenger (Port 3030) │
|
||||
│ • MySQL Primary Database │ (cURL/IP) │ • Redis GEO Engine (Port 6379) │
|
||||
└──────────────────────────────────┘ └──────────────────────────────────┘
|
||||
```
|
||||
|
||||
### خطوات الفصل لـ 2 سيرفر بـ 10 دقائق:
|
||||
|
||||
1. **إعداد سيرفر السوكت والـ Redis (Server 2):**
|
||||
- تشغيل حاويات `socket_driver` و `socket_passenger` و `redis` عبر `docker-compose.yml`.
|
||||
- فتح البورتات: `2020` (Driver WS), `2021` (Driver HTTP), `3030` (Passenger WS), `6379` (Redis).
|
||||
|
||||
2. **ربط سيرفر الباك إند (Server 1):**
|
||||
- تعديل المتغيرات في ملف `docker/.env`:
|
||||
```env
|
||||
REDIS_HOST=IP_SERVER_2
|
||||
LOCATION_SOCKET_URL=http://IP_SERVER_2:2021
|
||||
PASSENGER_SOCKET_INTERNAL_URL=http://IP_SERVER_2:3031
|
||||
```
|
||||
3. **إعادة تشغيل الباك إند:** `docker compose restart php` وسيبدأ الاتصال المباشر فوراً!
|
||||
|
||||
---
|
||||
|
||||
## 3. 🚀 دليل إعادة النشر لمشتري جديد / عميل مخصص (White-Label Deployment Guide)
|
||||
|
||||
عند بيع النظام أو تشغيله لعميل جديد/شركة جديدة، اتبع هذا الدليل لإكمال النشر في **15 دقيقة فقط**:
|
||||
|
||||
---
|
||||
|
||||
### أ. متطلبات السيرفر (Server Requirements)
|
||||
- **نظام التشغيل:** Ubuntu 22.04 LTS / Debian 12.
|
||||
- **المواصفات الأدنى:** 4 CPU Cores, 8GB RAM, 50GB NVMe Storage.
|
||||
- **البرامج:** Docker & Docker-Compose (v2+), Git.
|
||||
|
||||
---
|
||||
|
||||
### ب. توليد مفاتيح الأمان والتوثيق (Security & Key Generation)
|
||||
في السيرفر الجديد، أنشئ مجلد المفاتيح ووّلد المفاتيح التالية:
|
||||
|
||||
```bash
|
||||
mkdir -p /home/location /home/intaleq-rides/env
|
||||
|
||||
# 1. مفتاح التواصل الداخلي للـ Sockets (Internal Key)
|
||||
openssl rand -hex 32 > /home/location/.internal_socket_key
|
||||
cp /home/location/.internal_socket_key /home/intaleq-rides/.internal_socket_key
|
||||
|
||||
# 2. مفتاح تشفير التوكنات JWT Secret Key
|
||||
openssl rand -hex 32 > /home/location/.jwt_secret_key
|
||||
|
||||
# 3. مفتاح تشفير أسعار الرحلات (AES-256-GCM Key)
|
||||
openssl rand -hex 16 > /home/location/.aes_price_key
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### ج. ضبط ملف البيئة (`docker/.env`)
|
||||
|
||||
قم بإنشاء وتعديل ملف `docker/.env` بالبيانات الخاصة بالعميل الجديد:
|
||||
|
||||
```env
|
||||
APP_NAME=SiroClientApp
|
||||
APP_ENV=production
|
||||
APP_URL=https://client-domain.com
|
||||
|
||||
# الداتا بيز
|
||||
DB_HOST=mysql
|
||||
DB_PORT=3306
|
||||
DB_DATABASE=siro_db
|
||||
DB_USERNAME=siro_user
|
||||
DB_PASSWORD=YOUR_STRONG_PASSWORD
|
||||
|
||||
# الـ Redis والسوكتات
|
||||
REDIS_HOST=redis
|
||||
REDIS_PORT=6379
|
||||
REDIS_PASSWORD=YOUR_REDIS_PASSWORD
|
||||
|
||||
LOCATION_SOCKET_URL=http://socket_driver:2021
|
||||
PASSENGER_SOCKET_INTERNAL_URL=http://socket_passenger:3031
|
||||
|
||||
# حماية الأمان
|
||||
DISABLE_RATE_LIMITER=false
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### د. تشغيل الحاويات واستيراد الجداول الإبتدائية
|
||||
|
||||
```bash
|
||||
# 1. سحب المشروع
|
||||
git clone https://git.intaleqapp.com/Hamza/Siro.git /home/siro-app
|
||||
cd /home/siro-app/docker
|
||||
|
||||
# 2. تشغيل الحاويات بالدوكر
|
||||
docker compose up -d --build
|
||||
|
||||
# 3. استيراد الجداول الابتدائية لقاعدة البيانات
|
||||
docker compose exec -T mysql mysql -usiro_user -pYOUR_STRONG_PASSWORD siro_db < ../backend/database_schema.sql
|
||||
docker compose exec -T mysql mysql -usiro_user -pYOUR_STRONG_PASSWORD siro_location < ../loction_server/locationDB.sql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### هـ. ربط النطاق الجديد وشهادة الأمان SSL (Nginx Setup)
|
||||
|
||||
أنشئ ملف تهيئة النطاق الجديد في Nginx (`/etc/nginx/sites-available/client-domain.com`):
|
||||
|
||||
```nginx
|
||||
server {
|
||||
server_name client-domain.com;
|
||||
|
||||
# Backend API Proxy
|
||||
location /backend/ {
|
||||
proxy_pass http://127.0.0.1:8080/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
# Driver WebSocket Proxy
|
||||
location /driver-socket/ {
|
||||
proxy_pass http://127.0.0.1:2020/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
}
|
||||
|
||||
# Passenger WebSocket Proxy
|
||||
location /passenger-socket/ {
|
||||
proxy_pass http://127.0.0.1:3030/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
اصدار شهادة الأمان SSL بضغطة واحدة:
|
||||
```bash
|
||||
certbot --nginx -d client-domain.com
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 🏆 ملخص النشر الفوري (Instant Re-deployment)
|
||||
بذلك يصبح تطبيق سيرو يعمل للعميل الجديد بنسبة جاهزية 100%، وبحماية مشددة وأداء يتسع لعشرات الآلاف من الرحلات اليومية! 🚀
|
||||
Reference in New Issue
Block a user