Files
Siro/docker/crontab.production
T

131 lines
9.1 KiB
Plaintext

# ============================================================
# جدول المهام المجدولة — سيرو الأردن (بعد الانتقال إلى دوكر)
# ============================================================
# المشكلة التي يعالجها هذا الملف:
#
# الجدول القديم كان يشغّل كل السكربتات على المضيف مباشرة:
# /usr/bin/php8.4 /home/intaleqapp-jordan-siro/htdocs/.../backend/...
#
# بعد الانتقال إلى دوكر لم تعد هذه السكربتات قادرة على العمل:
#
# • Redis لا يَنشر أي بورت إلى المضيف (انظر خدمة redis في
# docker-compose.yml — لا يوجد فيها ports:). أي أن Redis يُرى فقط
# من داخل شبكة دوكر. كل سكربت على المضيف يحصل على $redis = null.
#
# • MySQL منشور على 127.0.0.1:33062 وليس 3306، فأي .env على المضيف
# ما زال يشير إلى 3306 يفشل في الاتصال.
#
# • bootstrap.php يستنتج مسار .env من __DIR__ عبر المطابقة مع
# ^/home/[^/]+ — فسكربتات المضيف تقرأ /home/intaleqapp-jordan-siro/.env
# (ملف ما قبل دوكر)، بينما الحاويات تقرأ متغيّراتها من docker/.env.
# نتيجةً لذلك كان الطرفان يعملان بإعدادات مختلفة تماماً.
#
# الحل: تشغيل كل شيء داخل حاوية php، حيث أسماء الشبكة (mysql / redis)
# والمتغيّرات صحيحة. هذا نفس الدرس المستفاد من عطل السوكيتات سابقاً.
#
# ------------------------------------------------------------
# التركيب:
# crontab -e ثم الصق المحتوى أدناه
#
# ملاحظة: المستخدم الذي يملك الـ crontab يجب أن يكون عضواً في مجموعة
# docker، وإلا فشل كل سطر بخطأ صلاحيات.
# ------------------------------------------------------------
SIRO=/home/intaleqapp-jordan-siro/htdocs/jordan-siro.intaleqapp.com/docker
DEX=/usr/bin/docker compose -f $SIRO/docker-compose.yml exec -T php php
# ============================================================
# مواصلاتي (Transit)
# ============================================================
*/1 * * * * $DEX /var/www/backend/transit/cron_approaching_alerts.php >> /var/log/transit_alerts.log 2>&1
0 3 * * * $DEX /var/www/backend/transit/cron_sync_members.php >> /var/log/transit_sync.log 2>&1
30 3 * * * $DEX /var/www/backend/transit/cron_cleanup.php >> /var/log/transit_cleanup.log 2>&1
# ============================================================
# محرّك التسعير والبوتات
# ============================================================
# تغذية طابور مهام البوت في Redis.
# كان الجدول القديم يشغّل generate_10_tasks_cli.php وهو يكتب إلى
# tasks.json الذي يقرأه standalone_worker.php (نسخة اختبار محلي بلا
# قاعدة بيانات). النتائج لم تكن تصل إلى scraped_competitor_prices إطلاقاً.
*/15 * * * * $DEX /var/www/backend/bot/push_10_tasks.php >> /var/log/bot_tasks.log 2>&1
*/5 * * * * $DEX /var/www/backend/bot/cron_kazan_adjuster.php >> /var/log/bot_kazan.log 2>&1
*/10 * * * * $DEX /var/www/backend/bot/cron_surge_opportunity.php >> /var/log/bot_surge.log 2>&1
*/16 * * * * $DEX /var/www/backend/bot/cron_generate_heatmap_cache.php >> /var/log/bot_heatmap.log 2>&1
0 * * * * $DEX /var/www/backend/bot/cron_seasonal_pricing.php >> /var/log/bot_seasonal.log 2>&1
0 * * * * $DEX /var/www/backend/bot/cron_predictive_demand.php >> /var/log/bot_demand.log 2>&1
0 */3 * * * $DEX /var/www/backend/bot/cron_ai_engine.php >> /var/log/bot_ai.log 2>&1
0 */3 * * * $DEX /var/www/backend/bot/cron_pricing_stability_engine.php >> /var/log/bot_stability.log 2>&1
# لقطة لوحة المعلومات — كانت مسجّلة ثلاث مرات (ساعياً + يومياً 3ص +
# أسبوعياً الاثنين 4ص). التشغيل الساعي يغطي الاثنين الآخرين بالكامل،
# وكانت النسخ الثلاث تتسابق على نفس الجداول عند الساعة 3 صباحاً.
0 * * * * $DEX /var/www/backend/bot/cron_dashboard_snapshot.php >> /var/log/bot_snapshot.log 2>&1
# ============================================================
# الحجز المسبق (Scheduled Rides)
# ============================================================
# يحوّل الحجوزات المستحقة إلى رحلات فعلية عبر add_ride.php، ويذكّر
# الراكب، وينشر التوقّع في Redis. بدون هذا السطر تبقى الحجوزات في
# scheduled_rides بحالة 'scheduled' إلى أن تنتهي صلاحيتها — ولا يصل
# السائق أي طلب إطلاقاً.
*/2 * * * * $DEX /var/www/backend/bot/cron_scheduled_rides.php >> /var/log/scheduled_rides.log 2>&1
# ============================================================
# الطلب بلا إنترنت — SMS
# ============================================================
# المعالجة الأصلية فورية داخل webhook_sms/webhook.php لأن الراكب ينتظر
# رداً. هذا الكرون شبكة أمان فقط: يحرّر الطلبات العالقة، ويعيد محاولة
# ما فشل شبكياً، ويبلّغ من لم يجد سائقاً — راكب الرسائل لا يرى خريطة،
# فصمتنا عنده يساوي عطلاً.
*/1 * * * * $DEX /var/www/backend/bot/cron_sms_requests.php >> /var/log/sms_requests.log 2>&1
# ============================================================
# التزامات السائق (تأمين، وقود، صيانة)
# ============================================================
# مُصدِر الاستحقاق: يقيّد استحقاق كل التزام دوري بلغت دورته في
# obligation_ledger. لا يخصم من رصيد أحد — الرصيد في payment_server.
# مرة يومياً بعد منتصف الليل: القيد اليومي مرتبط بالتاريخ لا بالساعة.
15 0 * * * $DEX /var/www/backend/bot/cron_insurance_premiums.php >> /var/log/insurance.log 2>&1
# محرك التسوية: الجهة الوحيدة التي تخصم فعلياً من محفظة السائق.
#
# لماذا 23:30 لا بعد المُصدِر مباشرة؟
# لأن السقف اليومي نسبة من أرباح *اليوم*، وهي تُقرأ من صفوف محفظة
# السائق المؤرخة بتاريخ اليوم. تشغيله الساعة 00:45 يعني قراءة يومٍ
# عمره خمس وأربعون دقيقة — أرباحه صفر، فالسقف صفر، فلا يُخصم شيء
# أبداً. المحرك كان سيعمل كل ليلة بلا خطأ واحد وبلا تحصيل قرش.
#
# 23:30 تقرأ يوم عمل مكتملاً تقريباً. النصف ساعة المتبقية ليست ضياعاً:
# ما لم يُحصَّل يبقى في الدفتر ويُلاحَق غداً.
30 23 * * * $DEX /var/www/backend/bot/cron_obligation_settlement.php >> /var/log/obligations.log 2>&1
# ============================================================
# الإشعارات والتسويق
# ============================================================
0 * * * * $DEX /var/www/backend/bot/cron_auto_marketing_pusher.php >> /var/log/bot_pusher.log 2>&1
0 10 * * * $DEX /var/www/backend/bot/cron_passenger_reengagement.php >> /var/log/bot_reengage.log 2>&1
0 0 * * 0 $DEX /var/www/backend/bot/cron_weekly_health_report.php >> /var/log/bot_health.log 2>&1
0 */3 * * * $DEX /var/www/backend/marketing_engine/telegram_scraper.php >> /var/log/mkt_telegram.log 2>&1
0 */4 * * * $DEX /var/www/backend/marketing_engine/cron_insert_task.php >> /var/log/mkt_tasks.log 2>&1
0 10 * * 0 $DEX /var/www/backend/marketing_engine/cron_weekly_report.php >> /var/log/mkt_weekly.log 2>&1
# ============================================================
# انتقالي — يُحذف بعد التأكد من مسار worker.php
# ============================================================
# يفرّغ results.json (مخرجات standalone_worker.php القديم) إلى MySQL.
# بعد انتقال البوت إلى worker.php لن يُكتب هذا الملف، وسيطبع السكربت
# "No results file found" ثم يخرج. أبقِه أسبوعاً لاستيعاب أي نتائج
# متبقّية، ثم احذف السطر.
0 * * * * $DEX /var/www/backend/bot/cron_empty_results_to_db.php >> /var/log/bot_drain.log 2>&1
# ============================================================
# سكربتات موجودة في الكود وغير مجدولة — قرار مطلوب
# ============================================================
# backend/bot/cron_gemini_advisor.php
# backend/bot/cron_silent_push_inactive.php
# backend/bot/cron_generate_pricing_cache.php
# لم تكن في الجدول القديم. راجعها وقرّر: تُجدول أم تُحذف من الكود.