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
+67 -17
View File
@@ -1,7 +1,21 @@
# نقطة واحدة لكل الخدمات الطلبية — التطبيق يغيّر الدومين فقط:
# /backend/... → الباك إند الرئيسي (نفس شكل مسارات jordan-siro)
# /backend/... → الباك إند الرئيسي
# /v2/main/... → خادم المدفوعات
# السوكيتات تُنشر مباشرة من حاوياتها (2020 / 3030) — لا تمر من هنا.
# السوكيتات تُنشر مباشرة من حاوياتها (2020 / 3030 / 4040) — لا تمر من هنا.
# مُحلِّل أسماء دوكر المدمج. سببه عطل حقيقي دام أياماً:
#
# nginx يترجم اسم الـ upstream المكتوب حرفياً في fastcgi_pass **مرة واحدة**
# عند تحميل الإعدادات ثم يحتفظ بالعنوان إلى الأبد. وحين أُعيد إنشاء حاوية
# php_food انتقلت من 172.24.0.9 إلى 172.24.0.10، بينما بقي nginx يطرق
# العنوان القديم — فكل طلبات الطعام تردّ 502 «Connection refused»
# والحاوية سليمة تماماً. تشخيصٌ مضلِّل إلى أبعد حدّ.
#
# العلاج: تمرير الوجهة عبر متغيّر. عندها يؤجّل nginx الترجمة إلى وقت
# الطلب ويستعملُ هذا الـ resolver، فيلتقط أي عنوان جديد خلال 10 ثوانٍ.
# فائدة ثانية: بالمتغيّر لا يسقط إقلاع nginx إذا كانت الحاوية الهدف
# متوقّفة.
resolver 127.0.0.11 valid=10s ipv6=off;
server {
listen 80;
@@ -10,17 +24,52 @@ server {
index index.php index.html;
client_max_body_size 25m;
# ‏كان access_log off من اختبار ضغط قديم ونُسي مُطفأً، فصار تشخيص أي عطل
# ‏مستحيلاً: البحث في سجلّ الوصول يرجع صفراً دائماً فيبدو أن التطبيق لا
# ‏يستدعي المسار أصلاً، والحقيقة أن السجلّ فارغ لا الطلبات. أعِده مطفأً
# ‏مؤقتاً وقت اختبارات الضغط فقط، ولا تتركه هكذا.
# ‏وجهات fpm كمتغيّرات — انظر تعليق الـ resolver.
set $upstream_php php:9000;
set $upstream_php_food php_food:9000;
set $upstream_php_transit php_transit:9000;
# ‏عنوان العميل الحقيقي:
# ‏العميل ← nginx المضيف (CloudPanel) ← nginx الحاوية ← php-fpm،
# ‏فكان REMOTE_ADDR يصل إلى PHP كعنوان الوسيط (172.24.0.1). نمرّر
# ‏السلسلة إلى PHP ليقرأها عبر clientIp() في core/helpers.php.
set $tripz_fwd $http_x_forwarded_for;
if ($tripz_fwd = "") {
set $tripz_fwd $remote_addr;
}
fastcgi_param HTTP_X_FORWARDED_FOR $tripz_fwd;
fastcgi_param HTTP_X_REAL_IP $remote_addr;
access_log /dev/stdout;
error_log /dev/stderr warn;
# المواصلات (transit) — حاوية php-fpm معزولة عن الباك إند الرئيسي.
# يجب أن يسبقه location ~ \.php$ العام حتى لا يلتقطه أولاً.
location ~ ^/backend/transit/.*\.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass $upstream_php_transit;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 60s;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}
# طلبات الطعام — حاوية php-fpm معزولة عن الباك إند الرئيسي.
location ~ ^/backend/food/.*\.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass $upstream_php_food;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 60s;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_pass $upstream_php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 60s;
fastcgi_buffers 16 16k;
@@ -33,31 +82,32 @@ server {
allow 127.0.0.1;
deny all;
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_pass $upstream_php;
fastcgi_param SCRIPT_NAME /status;
fastcgi_param SCRIPT_FILENAME /status;
}
location /dashboard/siro-admin {
alias /var/www/dashboard/siro-admin;
# لوحات التحكم — الجديدة للتسمية المعتمدة، والقديمة للتوافق خلفها.
location /dashboard/tripz-admin {
alias /var/www/dashboard/tripz-admin;
index index.html;
try_files $uri $uri/ /dashboard/siro-admin/index.html;
try_files $uri $uri/ /dashboard/tripz-admin/index.html;
}
location /dashboard/admin {
alias /var/www/dashboard/siro-admin;
alias /var/www/dashboard/tripz-admin;
index index.html;
try_files $uri $uri/ /dashboard/admin/index.html;
}
location /dashboard/siro-service {
alias /var/www/dashboard/siro-service;
location /dashboard/tripz-service {
alias /var/www/dashboard/tripz-service;
index index.html;
try_files $uri $uri/ /dashboard/siro-service/index.html;
try_files $uri $uri/ /dashboard/tripz-service/index.html;
}
location /dashboard/service {
alias /var/www/dashboard/siro-service;
alias /var/www/dashboard/tripz-service;
index index.html;
try_files $uri $uri/ /dashboard/service/index.html;
}
@@ -65,4 +115,4 @@ server {
location / {
try_files $uri $uri/ =404;
}
}
}
+60 -15
View File
@@ -4,24 +4,25 @@
# ‏يُنسَخ على **المضيف** لا داخل الحاويات:
# /etc/nginx/sites-enabled/tripz-sockets-tls.conf
#
# ‏المشكلة التي يحلّها: حاويتا السوكيت تفتحان المنفذين نصاً صريحاً
# (‏new SocketIO(2020)‎ و ‎new SocketIO(3030)‎ بلا سياق SSL)، بينما
# ‏التطبيقان يطلبان ‎https://api.tripz-egypt.com:2020‎ و ‎:3030‎.
# ‏المشكلة التي يحلّها: حاويات السوكيت تفتح منافذها نصاً صريحاً
# (‏new SocketIO(2020) / (3030) / (4040) بلا سياق SSL)، بينما
# ‏التطبيقات تطلب https://api.tripz-egypt.com:2020 و:3030 و:4040.
# ‏مصافحة TLS ضد منفذ لا يتكلم TLS تتجمّد حتى المهلة، فيظهر في اللوج:
# Socket Connect Error: timeout
#
# ‏الحل: الحاويتان تُنشران على 127.0.0.1 فقط (12020 / 13030 — انظر
# ‏docker-compose.yml)، و nginx هنا يستمع على 2020 / 3030 بشهادة الدومين
# ‏ويمرّر إليهما مع ترقية WebSocket. النتيجة: روابط التطبيقين تبقى كما هي
# ‏بلا أي بناء جديد، والـ JWT في الـ query string يبقى داخل نفق TLS.
# ‏الحل: الحاويات تُنشر على 127.0.0.1 فقط (12022 / 13033 / 14042)،
# ‏و nginx هنا يستمع على 2020 / 3030 / 4040 بشهادة الدومين ويمرّر
# ‏إليها مع ترقية WebSocket. النتيجة: روابط التطبيقات تبقى كما هي
# ‏وبلا أي بناء جديد، والـ JWT في الـ query string يبقى داخل نفق TLS.
#
# ⚠️ هذه الملفات الثلاثة تعيش على نفس السيرفر مع نسخ أخرى بمنافذ
# خارجية مطابقة (2020/3030/4040) وبـ server_name مختلف — يفصل nginx
# بينها حسب SNI، فلا يتعارض. إذا ظهر تعارض listen فتأكد كأن كل ملف
# يُخصَّص server_name واحد فقط.
# ══════════════════════════════════════════════════════════════════
# ‏ملاحظة: لا نضع ‎http2‎ إطلاقاً هنا. أولاً لأن ترقية WebSocket تعتمد على
# ‏ترويسة ‎Upgrade‎ في HTTP/1.1 ولا معنى لها في HTTP/2، وثانياً لأن ‎http2 on;‎
# ‏لم يُضَف إلا في nginx 1.25.1 وnginx المضيف أقدم فيرفضه بـ:
# nginx: [emerg] unknown directive "http2"
# ‏اسم مميّز يتفادى التضارب مع أي map باسم ‎$connection_upgrade‎ قد يكون
# ‏CloudPanel معرِّفه أصلاً في سياق http.
# ‏لا نضع ‎http2‎ إطلاقاً هنا: ترقية WebSocket تعتمد على ترقدية
# ‏Upgrade‎ في HTTP/1.1 ولا معنى لها في HTTP/2، وقد يرفضها nginx قديم.
map $http_upgrade $tripz_connection_upgrade {
default upgrade;
'' close;
@@ -34,7 +35,7 @@ server {
server_name api.tripz-egypt.com;
# ‏عدّل المسارين إن كانت شهادتك في مكان آخر — تحقّق بالأمر:
# ‏عدّل المسارين إن كانت شهادتك في مكان آخر:
# grep -rh ssl_certificate /etc/nginx/sites-enabled/ | sort -u
ssl_certificate /etc/nginx/ssl-certificates/api.tripz-egypt.com.crt;
ssl_certificate_key /etc/nginx/ssl-certificates/api.tripz-egypt.com.key;
@@ -88,7 +89,9 @@ server {
error_log /var/log/nginx/tripz-socket-passenger-error.log warn;
location / {
proxy_pass http://127.0.0.1:13032;
# ⚠️ 13033 وليس 13032: 13032 محجوزة من نسخة intaleq على
# السيرفر نفسه وكان سوكيت الركاب في تربز متوفّقاً بها.
proxy_pass http://127.0.0.1:13033;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
@@ -106,3 +109,45 @@ server {
proxy_buffering off;
}
}
# ── سوكيت الطعام — طلبات التوصيل ─────────────────────────────────
# ‏الحاوية على 14042 (بورت مخصص لتربز؛ 14040 لنسخة سيرو).
# ‏الحاوية نفسها قد تكون سليمة بينما لا مستمع خارجياً على 4040 —
# ‏النتيجة `Socket Connect Error: timeout` في تطبيق السائق.
server {
listen 4040 ssl;
listen [::]:4040 ssl;
server_name api.tripz-egypt.com;
ssl_certificate /etc/nginx/ssl-certificates/api.tripz-egypt.com.crt;
ssl_certificate_key /etc/nginx/ssl-certificates/api.tripz-egypt.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_cache shared:TripzSock:10m;
ssl_session_timeout 1d;
access_log off;
error_log /var/log/nginx/tripz-socket-food-error.log warn;
location / {
# FOOD_SOCKET_PORT في docker/.env — الافتراضي 14042.
proxy_pass http://127.0.0.1:14042;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $tripz_connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# ‏وضع التوصيل يبقى مفتوحاً طوال مناوبة الكابتن — نفس مهل 2020.
proxy_connect_timeout 10s;
proxy_send_timeout 3600s;
proxy_read_timeout 3600s;
proxy_buffering off;
}
}