Files
tripz-llc/docker/docker-compose.yml
T
Hamza-AyedandClaude Opus 5 4d8414c96b 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>
2026-07-27 05:14:13 +03:00

150 lines
5.0 KiB
YAML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================
# سيرو في حاويات — نسخة واحدة كاملة على سيرفر واحد
# ============================================================
# المبدأ: التقسيم بالدور (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: