# ============================================================ # سيرو في حاويات — نسخة واحدة كاملة على سيرفر واحد # ============================================================ # المبدأ: التقسيم بالدور (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 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 - ./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:2020" # WS للسائقين — عام # 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: - "3030: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:33060: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: