Files
intaleq/docs/system_architecture_and_whitelabel_guide.md
T
Hamza-AyedandClaude Opus 5 92dc6b3641 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>
2026-07-27 05:10:29 +03:00

12 KiB

📘 دليل المعمارية الفنية، التوسع، والنشر المخصص (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)

يتكون نظام سيرو الحالي من بنية متكاملة عالية الأداء تعيش على سيرفر فيزيائي موحد، ومقسمة إلى حاويات دكر متخصصة مترابطة عبر شبكة دكر الداخلية:

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 رحلة في الساعة)، تم تصميم نظام سيرو ليدعم الفصل الفوري إلى سيرفرين أو أكثر عبر حاويات الدوكر المستقلة:

       [ 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:
      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)

في السيرفر الجديد، أنشئ مجلد المفاتيح ووّلد المفاتيح التالية:

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 بالبيانات الخاصة بالعميل الجديد:

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

د. تشغيل الحاويات واستيراد الجداول الإبتدائية

# 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):

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 بضغطة واحدة:

certbot --nginx -d client-domain.com

🏆 ملخص النشر الفوري (Instant Re-deployment)

بذلك يصبح تطبيق سيرو يعمل للعميل الجديد بنسبة جاهزية 100%، وبحماية مشددة وأداء يتسع لعشرات الآلاف من الرحلات اليومية! 🚀