Update codebase

This commit is contained in:
Hamza-Ayed
2026-08-09 16:56:13 +03:00
parent 95e2e4f35d
commit b64debaa88
1058 changed files with 164327 additions and 113928 deletions
+40 -50
View File
@@ -1,20 +1,24 @@
# سيرو في حاويات — دليل التشغيل والفحص
# تربز في حاويات — دليل التشغيل والفحص
> الهدف: نسخة سيرو كاملة على سيرفر واحد داخل compose واحدة، والتطبيق لا يتغير فيه
> شيء سوى الـ base URLs (تُبنى مرة واحدة بـ `.env` الجديد — envied وقت الترجمة).
> القرارات والأسباب في `Tripz/docs/30-siro-port-plan.md` §5.
> الهدف: نسخة تربز كاملة على سيرفر واحد داخل compose واحدة، والتطبيق لا يتغير
> فيه شيء سوى الـ base URLs (تُبنى مرة واحدة بـ `.env` الجديد).
>
> البورتات مخصصة لتربز ولا تتصادم مع نسخ سيرو/intaleq على السيرفر نفسه:
> HTTP 8183 · driver 12022 · passenger 13033 · food 14042 · mysql 33063 · pma 8084 · TURN 3479
## 0) قبل أي شيء — على السيرفر
```bash
df -h / # ⚠️ الصندوق المشترك مزمنياً ~90% ممتلئ — الصور والقواعد تحتاج ~4-6GB
df -h / # التأكد من المساحة — الصور والقواعد تحتاج ~4-6GB
docker image prune -f # نظّف أولاً، وإن لم تكفِ المساحة فالفحص على صندوق آخر
ss -tlnp | grep -E ':(1202|1303|1404|3306|3478|808)[0-9]' # تأكد الفارغة
```
## 1) الإعداد (مرة واحدة)
```bash
cd /path/to/Siro/docker
cp .env.example .env && nano .env # املأ الأسرار من قيم اللايف — خاصة JWT_SECRET وكلمات MySQL
# ⚠️ طابق أسماء القواعد في mysql/init/00-databases.sql مع ما يتوقعه الكود
cd /path/to/Tripz/docker
cp .env.example .env && nano .env # املأ الأسرار — خاصة JWT_SECRET وكلمات MySQL
# ⚠️ طابق أسماء القواعد في mysql/init/ مع ما يتوقعه الكود
# ⚠️ توجد قاعدة طعام منفصلة tripz_food (06-foodDB.sql) — اضبط DB_FOOD_PASS
docker compose build
# تبعيات composer للخدمات التي لا تحمل vendor/ داخلها:
docker compose run --rm socket_driver composer install
@@ -26,54 +30,40 @@ docker compose run --rm --workdir /var/www/backend php composer install
```bash
docker compose up -d
# استيراد السكيمات (أول مرة فقط):
docker compose exec -T mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" siro_primary < ../backend/schema_primary.sql
docker compose exec -T mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" siro_ride < ../backend/schema_ride.sql
docker compose exec -T mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" siro_tracking < ../backend/schema_tracking.sql
docker compose exec -T mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" siro_wallet < ../payment_server/WalletDB.sql
docker compose exec -T mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" siro_location < ../loction_server/locationDB.sql
docker compose exec -T mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" mainDB < ../backend/schema_primary.sql
docker compose exec -T mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" ridesDB < ../backend/schema_ride.sql
docker compose exec -T mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" locationDB < ../backend/schema_tracking.sql
docker compose exec -T mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" paymentDB < ../payment_server/WalletDB.sql
docker compose exec -T mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" locationDB < ../loction_server/locationDB.sql
```
## 3) التحقق
```bash
docker compose ps # الست خدمات up
curl -s http://localhost:8080/backend/index.html # nginx→ملفات
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8080/backend/connect.php # يرد (401/400 طبيعي بلا JWT)
curl -s http://localhost:8080/fpm-status # حالة حوض fpm
docker compose ps # كل الخدمات up
curl -s http://localhost:8183/backend/index.html # nginx→ملفات
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8183/backend/connect.php # يرد (401/400 طبيعي بلا JWT)
curl -s http://localhost:8183/fpm-status # حالة حوض fpm
docker compose logs socket_driver | tail # Workerman أقلع على 2020/2021
docker compose logs socket_food | tail # سوكيت الطعام على 4040
```
اتصال التطبيق للتجربة: `http://IP:8080/backend` + سوكيت `http://IP:2020` — فقط بدّل
الـ base URLs في `.env` تبع التطبيق وأعد البناء. `APP_DOMAIN` فارغ = حارس
REGION_MISMATCH متعطل أثناء التجربة.
اتصال التطبيق للتجربة: `https://api.tripz-egypt.com/backend` + سوكيتات
`https://api.tripz-egypt.com:2020` / `:3030` / `:4040` (منفذة TLS عبر
`/etc/nginx/sites-enabled/tripz-sockets-tls.conf` على المضيف).
## 4) اختبار الضغط (الهدف: 10-20 ألف رحلة/ساعة)
```bash
cd ../stress_test && npm install
# دخان أولاً (الأداة القديمة، دفعة صغيرة):
node load_test.js --trips=10 -b http://localhost:8080/backend -s http://localhost:2020
# ثم المعدل المستمر:
node rate_test.js --rate 10000 --duration 10 -b http://localhost:8080/backend -s http://localhost:2020
node rate_test.js --rate 20000 --duration 10 -b http://localhost:8080/backend -s http://localhost:2020
node rate_test.js --rate 30000 --duration 5 ... # حد الانهيار — أين تبدأ p95 بالقفز؟
```
**أثناء التشغيل راقب من طرفية ثانية:**
```bash
docker stats # cpu/ذاكرة كل حاوية
docker compose exec mysql sh -c 'tail -f /var/lib/mysql/slow.log' # استعلامات >200ms
watch -n2 'curl -s http://localhost:8080/fpm-status' # طابور fpm (listen queue)
```
## 4) الخدمات المنفصلة (transit / food / TURN)
- **php_transit** — حوض fpm معزول (16 عاملاً) يخدم `/backend/transit/*` فقط.
- **php_food** — حوض fpm معزول (24 عاملاً) يخدم `/backend/food/*` فقط،
وقاعدة `tripz_food` منفصلة.
- **socket_food** — سوكيت الطعام على 127.0.0.1:14042 (يفسد من المضيف على 4040).
- **coturn** — مكالمات الصوت على TCP/UDP 3479 + نطاق 49301–49400 UDP
(افتحهما على جدار الحماية؛ النطاق 49160–49300 محجوز لنسخة سيرو).
### قواعد قراءة النتيجة بصدق
1. **سيناريو الاختبار أخف من الرحلة الحقيقية بـ 3-5×** (4 نداءات API + 6 نبضات موقع؛
الحقيقية فيها تسعير وبحث وقرب ودردشة). لتبنّي رقم "10k رحلة حقيقية بالذروة"
يجب أن يعبر الاختبار **30k** بنجاح >99% و p95<500ms.
2. الصندوق مشغول ~40% بغيرنا — **افحص خارج الذروة وبجولات قصيرة (5-10 د)**،
وأعد الجولة مرتين للتأكد من ثبات الرقم.
3. مولّد الحمل على نفس الصندوق يسرق ~5% CPU عند هذه المعدلات — مقبول؛ الأدق
تشغيله من جهاز آخر نحو `http://IP:8080`.
4. المُلتزم به للعملاء = الرقم الذي عبر الاختبار، لا أكثر.
## 5) أدوات الإدارة
- phpMyAdmin: `ssh -L 8084:127.0.0.1:8084 user@server` ثم `http://127.0.0.1:8084`
- MySQL من السيرفر: `mysql -h127.0.0.1 -P33063 -uroot -p`
- المهام المجدولة: انسخ `crontab.production` (ضمنف داخل حاوية php).
## 5) ملاحظات أداء محسومة (لماذا الحاويات لا تبطئنا)
- الحاوية على لينكس = عمليات عادية بنفس النواة (namespaces/cgroups) — **لا محاكاة ولا آلة افتراضية**. حمل CPU/ذاكرة ≈ صفر.
- المكان الوحيد الذي يُخسر فيه أداء فعلاً: كتابة قاعدة البيانات فوق overlayfs — **محلول** بـ volume مسمّى (`mysql-data`).
- أداء PHP الحقيقي يصنعه opcache + مقاس حوض fpm + فهارس MySQL — كلها مضبوطة في `php/` وليست متعلقة بالدوكر أصلاً.
- التقسيم إلى 6 حاويات لا يكلف أداءً (نفس العمليات) ويعطي: إعادة تشغيل خدمة وحدها، حدود ذاكرة لكل خدمة، لوغات منفصلة، واستنساخ عميل = `clone + .env + up`.
## 6) ملاحظات أداء محسوسة
- الحاوية على لينكس = عمليات عادية بنفس النواة — لا محاكاة، حمل CPU/ذاكرة ≈ صفر.
- المكان الوحيد الذي يُخسر فيه أداء فعلاً: كتابة MySQL فوق overlayfs — محلول بـ volume.
- أداء PHP الحقيقي = opcache + مقاس حوض fpm + فهارس MySQL — مضبوطة في `php/`.