feat: استيراد كود سيرو إلى تريبز (سيرو @ecfe7568) — بلا تعديل

قرار المالك 2026-07-27: باك إند سيرو PHP هو المعتمد، وتطبيقاته المجرّبة
ميدانياً تحل محل إعادة البناء المؤرشفة. سيرو نفسه لم يُمسّ.

الخريطة:
  backend · payment_server · loction_server · ride_server ·
  passenger_server · docker · dashboard · stress_test  → الجذر
  siro_rider  → apps/rider          siro_driver  → apps/driver
  siro_admin  → dashboards/admin    siro_service → dashboards/service
  android_bot → apps/android_bot    socialBot    → apps/socialBot

نُسخ المتعقَّب في git سيرو فقط عبر `git archive` (3,198 ملفاً / ~169 م.ب)
لا `cp -r` — فاستُثنيت مخلفات البناء تلقائياً. بلا أي تعديل محتوى عمداً:
كل ما يلي يصير فرقاً مقروءاً مقابل المصدر.

لم يُستورد وسببه: siromove.com (الموقع التسويقي يبقى marketing/ في تريبز،
سيرو فيه 8 ملفات) · docs و planning (تريبز له docs/ الخاص) · deploy.sh
(ليس نشراً على سيرفر بل `git add . && git push origin --all` — فخّ في
مستودع آخر) · transit_dashboard (بانتظار قرار مصير backend-transit و
dashboards/transit-web).

⚠️ لا يبني بعد — ثلاثة نواقص متوقعة ومقصودة:
1. `.env` و `lib/env/env.g.dart` غير متعقَّبين في سيرو (أسرار لكل مستأجر):
   كل تطبيق فلاتر يحتاج .env خاصاً ثم توليد env.g.dart بـ build_runner.
2. إعدادات Firebase (9 ملفات google-services.json و GoogleService-Info.plist)
   يستبعدها .gitignore تريبز — ولكل مستأجر مشروع Firebase خاص أصلاً.
3. apps/driver في سيرو يشير إلى `../../Intaleq/packages/get` خارج المستودع →
   يجب ضمّ الحزم داخله أسوة بـ apps/rider.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hamza-Ayed
2026-07-27 05:14:13 +03:00
co-authored by Claude Opus 5
parent 9909d9b4c1
commit 4d8414c96b
3198 changed files with 766859 additions and 0 deletions
+149
View File
@@ -0,0 +1,149 @@
# ============================================================
# سيرو في حاويات — نسخة واحدة كاملة على سيرفر واحد
# ============================================================
# المبدأ: التقسيم بالدور (nginx / fpm / سوكيتات / mysql / redis)
# لا حاوية-واحدة-فيها-كل-شيء، ولا تفتيت microservices.
# الأداء = نفس العمليات على نفس النواة؛ الفرق تشغيلي فقط.
#
# التشغيل: docker compose up -d --build (انظر README.md)
# ============================================================
name: siro
services:
nginx:
image: nginx:1.27-alpine
ports:
- "${HTTP_PORT:-8080}:80"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
- ../backend:/var/www/backend:ro
- ../payment_server/v2:/var/www/v2:ro
- ../loction_server:/var/www/loction_server:ro
- ../dashboard:/var/www/dashboard:ro
depends_on:
- php
mem_limit: 256m
restart: unless-stopped
# php-fpm واحدة تخدم كل الخدمات الطلبية (backend + payment v2)
# التقسيم لأبعد من هذا لا يضيف أداءً — نفس الصورة، نفس النواة.
php:
build:
context: ./php
dockerfile: Dockerfile.fpm
args:
PHP_VERSION: "${PHP_VERSION:-8.2}"
volumes:
- ../backend:/var/www/backend
- ../payment_server/v2:/var/www/v2
- ../loction_server:/var/www/loction_server
- ./php/opcache.ini:/usr/local/etc/php/conf.d/zz-opcache.ini:ro
- ./php/www-pool.conf:/usr/local/etc/php-fpm.d/zz-pool.conf:ro
- ./keys:/keys:ro
env_file: .env
depends_on:
- mysql
- redis
mem_limit: 2g
restart: unless-stopped
# سوكيت السائقين (Workerman + PHPSocketIO) — WS بورت 2020 + HTTP داخلي 2021
# عملية دائمة، لا علاقة لها بـ fpm — حاوية مستقلة إجبارياً.
socket_driver:
build:
context: ./php
dockerfile: Dockerfile.socket
args:
PHP_VERSION: "${PHP_VERSION:-8.2}"
command: ["php", "driver_socket.php", "start"]
working_dir: /app
volumes:
- ../loction_server:/app
- ./keys:/keys:ro
env_file: .env
ports:
# ‏لا نفتح 2020 للعالم مباشرة: Workerman يتكلم نصاً صريحاً، والتطبيق يطلب
# ‏TLS على هذا المنفذ (‎https://…:2020‎) فتتجمّد المصافحة وينتهي بـ timeout.
# ‏nginx على المضيف يستمع على 2020 بالشهادة ويمرّر إلى 12020 هنا.
# ‏انظر nginx/siro-sockets-tls.conf
- "127.0.0.1:12020:2020"
# ‏و2021 داخلي فقط: الباك إند يناديه عبر http://socket_driver:2021
depends_on:
- redis
mem_limit: 768m
restart: unless-stopped
# سوكيت الركاب (ride_server) — WS بورت 3030 + HTTP داخلي 3031
socket_passenger:
build:
context: ./php
dockerfile: Dockerfile.socket
args:
PHP_VERSION: "${PHP_VERSION:-8.2}"
command: ["php", "passenger_socket.php", "start"]
working_dir: /app
volumes:
- ../ride_server:/app
- ./keys:/keys:ro
env_file: .env
ports:
# ‏نفس منطق سوكيت السائقين: nginx على المضيف يستمع على 3030 بالشهادة
# ‏ويمرّر إلى 13030 هنا. و3031 داخلي فقط (http://socket_passenger:3031).
- "127.0.0.1:13030:3030"
depends_on:
- redis
mem_limit: 512m
restart: unless-stopped
mysql:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD:?set in .env}"
# بيانات القاعدة على volume مسمّى — يتجاوز overlayfs = أداء قرص شبه أصلي.
volumes:
- mysql-data:/var/lib/mysql
- ./mysql/init:/docker-entrypoint-initdb.d:ro
command:
- --innodb-buffer-pool-size=1G
- --max-connections=300
- --innodb-flush-log-at-trx-commit=1
- --slow-query-log=1
- --long-query-time=0.2
- --slow-query-log-file=/var/lib/mysql/slow.log
ports:
- "127.0.0.1:33061:3306" # للإدارة من السيرفر نفسه فقط — ليس للعامة
mem_limit: 2560m
restart: unless-stopped
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
PMA_HOST: mysql
PMA_PORT: 3306
UPLOAD_LIMIT: 300M
ports:
- "8082:80" # ادخل عليه عبر http://your-domain:8082 أو افتح بورت 8082 في CloudPanel
depends_on:
- mysql
mem_limit: 256m
restart: unless-stopped
redis:
image: redis:7-alpine
command:
- redis-server
- --maxmemory
- 400mb
- --maxmemory-policy
- noeviction
- --appendonly
- "yes"
volumes:
- redis-data:/data
mem_limit: 512m
restart: unless-stopped
volumes:
mysql-data:
redis-data: