# النشر على الاستضافة المشتركة

## قبل الرفع

- اختر خطة توفر PHP 8.3 أو أحدث وامتدادات Laravel المذكورة في README، بما فيها `pdo_mysql` و`sodium`.
- تحقق من MySQL/MariaDB، وHTTPS، وإمكانية إعداد Cron كل دقيقة، ومساحة كتابة لـ`storage/` و`bootstrap/cache/`.
- على جهاز تطوير يملك PHP 8.3 وComposer وNode 20.19+ شغّل `bash scripts/build-release.sh`. السكربت يشغّل الاختبارات ثم يبني حزمة فيها `vendor/` وأصول الواجهة.

## رفع آمن

1. أنشئ قاعدة بيانات ومستخدمًا محدود الصلاحيات، ثم ارفع Release إلى مجلد خارج `public_html`، مثل `/home/ACCOUNT/sms-hub`.
2. انسخ `.env.example` إلى `.env` وعدّل `APP_ENV=production`, `APP_DEBUG=false`, `APP_URL`, بيانات DB، `SESSION_SECURE_COOKIE=true`, و`MAIL_*`.
3. أنشئ مفتاح التطبيق من مجلد المشروع: `php artisan key:generate`. لا تغيّره بعد تشغيل النظام؛ تغيير المفتاح يجعل البيانات المشفرة الحالية غير قابلة للفك.
4. نفّذ `php scripts/check-platform.php` و`php artisan migrate --force` ثم `php artisan sms:make-super-admin`. أدخل كلمة مرور قوية عند الطلب.
5. اجعل المجلدات التالية قابلة للكتابة من مستخدم PHP: `storage/`, `bootstrap/cache/`. لا تجعل `.env`, `vendor/`, `storage/`, أو جذر المشروع قابلًا للوصول العام.
6. وجّه Document Root إلى مجلد `public/` داخل التطبيق. لا توجهه إلى جذر المستودع.
7. فعّل HTTPS، واختبر `https://DOMAIN/up`، ثم سجّل الدخول وأكمل TOTP، وأنشئ Admin ومرسلًا وجهازًا تجريبيًا.

## إذا لم تسمح لوحة الاستضافة بتغيير Document Root

ابقِ التطبيق كاملًا خارج `public_html`. انسخ **محتويات** مجلد `public/` إلى `public_html/`، ثم عدّل `public_html/index.php` فقط ليشير إلى المسارات المطلقة للتطبيق:

```php
require '/home/ACCOUNT/sms-hub/vendor/autoload.php';
(require '/home/ACCOUNT/sms-hub/bootstrap/app.php')->handleRequest(\Illuminate\Http\Request::capture());
```

احتفظ بملف `.htaccess` من مجلد `public/` في `public_html/`. لا تنقل `.env` أو `vendor/` أو `storage/` إلى `public_html`، ولا تستخدم ملف PHP عام لتحويل كل الطلبات إلى index.php. إذا لم تسمح الخطة بإبقاء مجلد التطبيق خارج `public_html` فهذه الخطة غير مناسبة لهذا الإصدار.

## Cron الوحيد

أضف مهمة واحدة كل دقيقة. مثال cPanel (استبدل مسارات PHP والحساب):

```cron
* * * * * /usr/local/bin/php /home/ACCOUNT/sms-hub/artisan schedule:run >> /dev/null 2>&1
```

استخدم نسخة PHP نفسها التي اخترتها لموقع الويب. Scheduler يعالج طابور Database بعامل يتوقف تلقائيًا خلال 50 ثانية، ويحاول المهام الفاشلة وفق إعداد كل Job. لا تشغّل `queue:work` كعملية دائمة على استضافة مشتركة.

## بعد النشر

- اختبر استقبال Webhook باستخدام `docs/WEBHOOK_SETUP.md`.
- تحقق من ظهور الرسالة المنقحة، واستلامها، وإحالتها، وتنزيل صوت محمي بعد المصادقة.
- اختبر إعادة تعيين كلمة المرور عبر SMTP فعلي، واتصال Telegram، وتنزيل CSV/XLSX/PDF/Markdown.
- فعّل Backup بعد تحديد قرص ومساحة احتفاظ مناسبة؛ اختبر نسخة واستعادة إلى قاعدة اختبار منفصلة.
- راقب `failed_jobs` وتأخر طابور DB من لوحة قاعدة البيانات. لا تعرض سجلات Laravel أو صفحات stack trace للعامة.

## ترقية التطبيق

خذ نسخة مشفرة واختبر الاستعادة، ثم ارفع Release جديدًا إلى مجلد إصدار منفصل، انسخ `.env` الموجود دون تغيير المفتاح، نفذ `php artisan migrate --force`, وبدّل Document Root بعد التحقق من `/up`. لا تستبدل `.env` بقيم المثال ولا تحذف التخزين الخاص.
