# دليل تركيب لوحة تحكم waomcoo على cPanel

هذا الدليل موجّه للشخص الذي سيقوم بالتركيب على الاستضافة.
لا يحتاج خبرة برمجية — فقط اتباع الخطوات بالترتيب.

**الوقت المتوقّع:** من ٢٠ إلى ٤٠ دقيقة.

> **مهم جداً — نسخة PHP:**
> هذا المشروع يعمل على **PHP 8.4** (الموصى بها) أو **PHP 8.5**.
> **لا يعمل على PHP 8.3 أو أقل** — سيتوقّف بخطأ.
> إذا كانت استضافتك لا توفّر 8.4 أو 8.5، توقّف وتواصل مع المطوّر قبل المتابعة.

---

## ما ستحتاجه قبل البدء

| العنصر | الوصف |
|---|---|
| بيانات الدخول إلى cPanel | الرابط واسم المستخدم وكلمة المرور |
| ملف المشروع المضغوط | `waomcoo-backend-deploy.zip` (المرفق مع هذا الدليل) |
| النطاق أو النطاق الفرعي | مثل `admin.waomcoo.com` |
| تطبيق مصادقة على جوّالك | Google Authenticator أو Microsoft Authenticator — **إلزامي** لتسجيل الدخول (اشرح ذلك في الخطوة ٨) |

---

## الخطوة ١ — اختيار نسخة PHP 8.4

1. من الصفحة الرئيسية في cPanel، ابحث عن **MultiPHP Manager**
   (قد تكون تحت قسم `Software`).
2. ستظهر قائمة بالنطاقات. ضع علامة ✓ أمام النطاق الذي ستستخدمه.
3. من القائمة المنسدلة **PHP Version** اختر **8.4**
   (إن لم تجدها اختر **8.5**، وإن لم تجد الاثنين توقّف وتواصل مع المطوّر).
4. اضغط **Apply**.

### التأكد من الإضافات المطلوبة (Extensions)

المشروع يحتاج إضافات PHP معيّنة. معظمها مفعّل افتراضياً، لكن **ثلاثة منها
قد تكون مغلقة** وهي سبب شائع جداً للأخطاء:

1. ابحث في cPanel عن **Select PHP Version** ← تبويب **Extensions**.
2. تأكّد أن هذه مفعّلة (ضع ✓ أمامها):

   `intl` ← **غالباً مغلقة، مهمة جداً**
   `exif` ← **غالباً مغلقة، لازمة لرفع الصور**
   `zip` ← **غالباً مغلقة**
   `gd` ← لازمة لمعالجة الشعارات
   `mbstring` · `openssl` · `pdo_mysql` · `fileinfo` · `dom` · `xml` · `tokenizer` · `ctype` · `filter` · `session` · `iconv` · `phar` · `zlib`

3. إن لم تجد هذه الشاشة، ارسل لمزوّد الاستضافة هذه الرسالة:

   > السلام عليكم، أرجو تفعيل إضافات PHP التالية على حسابي مع نسخة PHP 8.4:
   > intl, exif, zip, gd, mbstring, openssl, pdo_mysql, fileinfo, dom, xml,
   > tokenizer, ctype, filter, session, iconv, phar, zlib
   > وشكراً.

---

## الخطوة ٢ — إنشاء قاعدة البيانات

1. في cPanel ابحث عن **MySQL Databases**.
2. في خانة **New Database** اكتب: `waomcoo` ← اضغط **Create Database**.
3. انزل إلى **MySQL Users** ← **Add New User**:
   - Username: `waomcoo`
   - Password: اضغط **Password Generator** لتوليد كلمة مرور قوية
   - **📋 انسخ كلمة المرور الآن واحتفظ بها** — لن تظهر مرة أخرى
   - اضغط **Create User**
4. انزل إلى **Add User To Database**:
   - User: المستخدم الذي أنشأته
   - Database: القاعدة التي أنشأتها
   - اضغط **Add**
5. في الشاشة التالية ضع ✓ على **ALL PRIVILEGES** ← **Make Changes**.

### ⚠️ انتبه للأسماء الكاملة

cPanel يضيف اسم حسابك تلقائياً في البداية. فلو كان اسم حسابك `mysite`:

| ما كتبته | الاسم الحقيقي الذي ستستخدمه لاحقاً |
|---|---|
| `waomcoo` | `mysite_waomcoo` |

**اكتب هذه الثلاثة في ورقة، ستحتاجها في الخطوة ٥:**

```
اسم قاعدة البيانات : ____________________
اسم المستخدم      : ____________________
كلمة المرور        : ____________________
```

---

## الخطوة ٣ — رفع ملفات المشروع

### اختر أحد الخياريْن

#### 🟢 الخيار (أ) — نطاق فرعي مستقل — **موصى به بشدة**

لوحة التحكم على عنوان مثل `admin.waomcoo.com`، منفصلة عن الموقع العام.
**أكثر أماناً وأسهل تركيباً.**

1. في cPanel ابحث عن **Subdomains** (أو **Domains** ← **Create A New Domain**).
2. Subdomain: `admin` — Domain: `waomcoo.com`
3. **مهم:** في خانة **Document Root** اكتب بالضبط:

   ```
   waomcoo-backend/public
   ```

   لاحظ كلمة `public` في النهاية — **هذه أهم خطوة في الدليل كله**
   (تفسيرها في الخطوة ٤).
4. اضغط **Create**.

#### 🟡 الخيار (ب) — على النطاق الرئيسي

لوحة التحكم على `waomcoo.com` مباشرة. اختر هذا **فقط** إذا لم يكن الموقع
العام على نفس النطاق، وإلا سيتعارض الاثنان.
اتبع الخطوة ٤ــ(ب) لاحقاً.

### رفع الملفات

1. في cPanel ابحث عن **File Manager**.
2. اذهب إلى المجلد الرئيسي `/home/اسم_حسابك` — **وليس** داخل `public_html`.
3. اضغط **+ Folder** وأنشئ مجلداً باسم: `waomcoo-backend`
4. ادخل المجلد الجديد ← اضغط **Upload** ← ارفع ملف
   `waomcoo-backend-deploy.zip`
5. بعد انتهاء الرفع، ارجع إلى File Manager، اضغط **كلك يمين** على الملف
   المضغوط ← **Extract** ← ثم **Extract File(s)**.
6. تأكّد أنك ترى مجلدات مثل `app` و `public` و `vendor` **داخل**
   `waomcoo-backend` مباشرة.
   لو وجدت مجلداً واحداً بداخله كل شيء، ادخله وانقل محتوياته مستوى واحداً للأعلى.
7. احذف الملف المضغوط بعد فك الضغط (لتوفير المساحة).

> **ملاحظة مطمئنة:** مجلد `vendor` (المكتبات) **مرفق جاهزاً** داخل الملف
> المضغوط، فلا حاجة لتشغيل `composer install` إطلاقاً. هذا يوفّر عليك أصعب
> خطوة في تركيب مشاريع Laravel.

---

## الخطوة ٤ — توجيه الموقع إلى مجلد `public`

**لماذا؟** المشروع يحتوي ملفات حسّاسة (كلمات مرور قاعدة البيانات في ملف
`.env`). مجلد `public` هو الجزء الوحيد المسموح للزوار برؤيته. لو وجّهنا
الموقع إلى مجلد المشروع كاملاً، لأصبح بإمكان أي زائر تحميل ملف `.env`
وقراءة كلمات المرور. **لا تتجاوز هذه الخطوة.**

### (أ) إذا اخترت النطاق الفرعي
تمّ الأمر في الخطوة ٣ عند كتابة `waomcoo-backend/public` في Document Root.
للتأكد: **Domains** ← ابحث عن `admin.waomcoo.com` ← تأكّد أن Document Root
ينتهي بـ `/public`. إن لم يكن كذلك، اضغط **Manage** وصحّحه.

### (ب) إذا اخترت النطاق الرئيسي
1. في **File Manager** ادخل `waomcoo-backend/public`.
2. حدّد **كل** الملفات داخله (بما فيها الملفات المخفية مثل `.htaccess` —
   لإظهارها: **Settings** أعلى اليمين ← ✓ **Show Hidden Files**).
3. **Copy** ← والمسار: `public_html`
4. ادخل `public_html` ← اضغط كلك يمين على `index.php` ← **Edit**.
5. ابحث عن هذين السطرين:

   ```php
   require __DIR__.'/../vendor/autoload.php';
   $app = require_once __DIR__.'/../bootstrap/app.php';
   ```

6. بدّلهما بهذين (مع تغيير `اسم_حسابك` لاسم حسابك الحقيقي):

   ```php
   require '/home/اسم_حسابك/waomcoo-backend/vendor/autoload.php';
   $app = require_once '/home/اسم_حسابك/waomcoo-backend/bootstrap/app.php';
   ```

7. اضغط **Save Changes**.

---

## الخطوة ٥ — إعداد ملف `.env`

هذا الملف يحتوي كل الإعدادات (قاعدة البيانات، العناوين، المفاتيح).

1. في **File Manager** ادخل مجلد `waomcoo-backend`.
2. شغّل إظهار الملفات المخفية: **Settings** ← ✓ **Show Hidden Files**.
3. ستجد ملفاً باسم `.env.example`. اضغط عليه كلك يمين ← **Copy**
   ← والمسار: `/home/اسم_حسابك/waomcoo-backend/.env`
   (أو انسخه ثم أعد تسمية النسخة إلى `.env` بالضبط — بنقطة في البداية وبدون
   أي امتداد).
4. اضغط كلك يمين على `.env` ← **Edit**.
5. عدّل القيم التالية فقط، والبقية اتركها كما هي:

| السطر | ماذا تكتب | المعنى بالعربي |
|---|---|---|
| `APP_URL=` | `https://admin.waomcoo.com` | عنوان لوحة التحكم كما يُكتب في المتصفح. بدون `/` في النهاية |
| `DB_DATABASE=` | `mysite_waomcoo` | اسم قاعدة البيانات من الخطوة ٢ (بالاسم الكامل مع البادئة) |
| `DB_USERNAME=` | `mysite_waomcoo` | اسم مستخدم قاعدة البيانات من الخطوة ٢ |
| `DB_PASSWORD=` | كلمة المرور | كلمة مرور قاعدة البيانات التي نسختها |
| `FRONTEND_URL=` | `https://waomcoo.com` | عنوان الموقع العام الذي يراه الزوار |
| `CORS_ALLOWED_ORIGINS=` | `https://waomcoo.com,https://www.waomcoo.com` | العناوين المسموح لها بقراءة البيانات. **لو كانت خاطئة سيظهر الموقع العام فارغاً بدون خدمات** |
| `REVALIDATE_SECRET=` | نص عشوائي طويل | كلمة سر مشتركة مع الموقع العام. **يجب أن تكون نفس القيمة** الموضوعة في إعدادات الموقع العام. استخدم مولّد كلمات مرور واختر ٤٠ حرفاً، أحرف وأرقام إنجليزية فقط بدون رموز أو مسافات |

6. **اترك `APP_KEY=` فارغاً** — سيُملأ تلقائياً في الخطوة ٦.
7. تأكّد أن `APP_ENV=production` و `APP_DEBUG=false` (هكذا هما أصلاً).
   > `APP_DEBUG=true` على السيرفر يعرض كلمة مرور قاعدة البيانات لأي زائر
   > عند حدوث خطأ. لا تفعّلها إطلاقاً.
8. إذا كان موقعك يعمل بـ `http` فقط (بدون شهادة SSL)، غيّر
   `SESSION_SECURE_COOKIE=true` إلى `false`، وإلا لن تستطيع تسجيل الدخول.
   (الوضع الطبيعي أن SSL مفعّلة، فاتركها `true`.)
9. اضغط **Save Changes**.

---

## الخطوة ٦ — تشغيل أوامر التركيب

نحتاج تشغيل ٤ أوامر. **جرّب الطريقة الأولى، وإن لم تتوفّر انتقل للثانية.**

### الأوامر المطلوبة (بالترتيب)

```
php artisan key:generate --force
php artisan migrate --force
php artisan db:seed --force
php artisan storage:link
```

**ماذا يفعل كل أمر؟**

| الأمر | الوظيفة |
|---|---|
| `key:generate` | يولّد مفتاح التشفير ويضعه في `.env` |
| `migrate` | يبني جداول قاعدة البيانات (٢٠ جدولاً) |
| `db:seed` | يضيف البيانات الأولية: ١٢ خدمة، ٨ ميزات، ٩ خطوات عمل، ٥ صفحات، ٢٠ دولة، **٤ إحصائيات** |
| `storage:link` | يتيح ظهور الصور والشعارات المرفوعة |

---

### 🟢 الطريقة الأولى — Terminal (الأسهل إن توفّرت)

1. في cPanel ابحث عن **Terminal** (تحت قسم `Advanced`).
2. إن لم تجدها، انتقل للطريقة الثانية.
3. اكتب هذا السطر أولاً للانتقال إلى مجلد المشروع:

   ```
   cd ~/waomcoo-backend
   ```

4. ثم نفّذ الأوامر الأربعة **واحداً واحداً**، وانتظر انتهاء كل واحد:

   ```
   php artisan key:generate --force
   php artisan migrate --force
   php artisan db:seed --force
   php artisan storage:link
   ```

5. إذا ظهرت رسالة أن `php` غير معروف، أو ظهر خطأ عن نسخة PHP، استخدم
   المسار الكامل لنسخة 8.4 بدلاً من `php`:

   ```
   /opt/cpanel/ea-php84/root/usr/bin/php artisan migrate --force
   ```

6. عند نجاح كل أمر سترى كلمة `DONE` أو `INFO`.

---

### 🟡 الطريقة الثانية — عبر Cron Jobs (إذا لم تتوفّر Terminal)

**معظم خطط الاستضافة الرخيصة لا توفّر Terminal / SSH.**
الحل: نستخدم **Cron Jobs** لتشغيل الأمر مرة واحدة ثم نحذفه.

1. في cPanel ابحث عن **Cron Jobs**.
2. في **Add New Cron Job** اختر من **Common Settings**:
   **Once Per Five Minutes** (`*/5 * * * *`)
3. في خانة **Command** الصق الأمر الأول:

   ```
   cd /home/اسم_حسابك/waomcoo-backend && /opt/cpanel/ea-php84/root/usr/bin/php artisan key:generate --force
   ```

   (بدّل `اسم_حسابك` باسم حسابك الحقيقي)
4. اضغط **Add New Cron Job** وانتظر ٥ دقائق.
5. **تحقّق من نجاحه:** افتح ملف `.env` وتأكّد أن `APP_KEY=` أصبح يحتوي
   نصاً يبدأ بـ `base64:`. إذا كان كذلك فقد نجح الأمر.
6. اضغط **Edit** على المهمة، وبدّل الأمر بالأمر التالي (`migrate`)، وانتظر
   ٥ دقائق، ثم كرّر نفس الشيء لـ `db:seed` ثم `storage:link`.
7. **⚠️ مهم:** بعد الانتهاء من الأوامر الأربعة **احذف المهمة**
   (اضغط **Delete**) حتى لا تتكرّر كل ٥ دقائق.

> **إذا لم ينجح المسار `/opt/cpanel/ea-php84/...`:**
> جرّب `/usr/local/bin/php` بدلاً منه، أو أرسل لمزوّد الاستضافة:
> > أرجو تزويدي بالمسار الكامل لملف PHP 8.4 التنفيذي (CLI path) على حسابي.

---

### 🔴 الطريقة الثالثة — طلب المساعدة من مزوّد الاستضافة

إن تعذّرت الطريقتان، أرسل هذه الرسالة للدعم الفني:

> السلام عليكم،
> رفعت مشروع Laravel في المجلد `/home/اسم_حسابك/waomcoo-backend`
> وأرجو تشغيل الأوامر التالية من داخل هذا المجلد باستخدام PHP 8.4:
>
> php artisan key:generate --force
> php artisan migrate --force
> php artisan db:seed --force
> php artisan storage:link
>
> ملاحظة: مجلد vendor مرفوع مسبقاً فلا حاجة لتشغيل composer.
> وشكراً لتعاونكم.

---

## الخطوة ٧ — ضبط الصلاحيات (Permissions)

مجلدان يحتاجان صلاحية الكتابة، وإلا ستظهر صفحة خطأ بيضاء.

1. في **File Manager** ادخل `waomcoo-backend`.
2. اضغط كلك يمين على مجلد `storage` ← **Change Permissions**.
3. اختر **755**، وضع ✓ على **Recurse into subdirectories**
   ثم ✓ على **Apply to directories only** ← اضغط **Change Permissions**.
4. كرّر نفس الشيء تماماً على مجلد `bootstrap/cache`.

> **إذا ظهرت صفحة خطأ لاحقاً:** جرّب الصلاحية **775** على نفس المجلدين.
> بعض الاستضافات تحتاجها.
> **لا تستخدم 777 إطلاقاً** — تجعل الملفات قابلة للتعديل من أي شخص على
> السيرفر، وبعض الاستضافات ترفض تشغيل الموقع بها أصلاً.

### ملاحظة عن الصور والشعارات (`storage:link`)

أمر `storage:link` ينشئ اختصاراً (symlink) يجعل الصور المرفوعة مرئية.

- **إن نجح الأمر:** ستجد داخل `public` عنصراً باسم `storage`. ممتاز، تخطَّ الباقي.
- **إن فشل** برسالة عن `symlink` غير مدعوم (بعض الاستضافات تمنعه):
  1. ادخل `waomcoo-backend/public`.
  2. أنشئ مجلداً عادياً باسم `storage`.
  3. ادخل `waomcoo-backend/storage/app/public` وانسخ محتوياته إلى
     `public/storage`.
  4. **أبلغ المطوّر** — هذا حل مؤقّت: الصور الجديدة التي تُرفع من لوحة
     التحكم لن تظهر تلقائياً وتحتاج نسخاً يدوياً كل مرة، والحل الدائم
     يتطلّب تعديلاً بسيطاً في الإعدادات.

---

## الخطوة ٨ — التحقق النهائي ✅

نفّذ هذه الفحوصات بالترتيب. **الفحصان ١ و ٢ هما الأهم.**

### ١) واجهة البيانات (API) تعمل

افتح في المتصفح:

```
https://admin.waomcoo.com/api/stats
```

**المتوقّع:** نص برمجي (JSON) يحتوي ٤ إحصائيات فيها كلمات مثل
`سنة التأسيس` و `جنسية`.

جرّب أيضاً:
```
https://admin.waomcoo.com/api/services   ← يجب أن يعرض ١٢ خدمة
https://admin.waomcoo.com/up             ← يجب أن يعرض صفحة تقول إن التطبيق يعمل
```

### ٢) صفحة الدخول للوحة التحكم تعمل

افتح:

```
https://admin.waomcoo.com/admin
```

**المتوقّع:** صفحة تسجيل دخول بخلفية كحلية داكنة وتصميم مرتّب.

> ⚠️ **إذا ظهرت الصفحة بدون تنسيق (نص أبيض على خلفية بيضاء)** فهذا يعني أن
> ملفات التصميم لم تُقرأ. تأكّد أن `APP_URL` في `.env` مكتوب بـ `https`
> وبدون `/` في النهاية، ثم شغّل: `php artisan optimize:clear`

### ٣) إنشاء حساب المدير

لا يوجد حساب مسبقاً (لأسباب أمنية). أنشئه بأحد الطريقتين السابقتين
(Terminal أو Cron) بهذا الأمر:

```
php artisan make:filament-user
```

سيسألك عن الاسم والبريد وكلمة المرور.

> **عبر Cron:** الأمر التفاعلي لا يعمل مع Cron. استخدم هذه الصيغة بدلاً منه
> (بدّل القيم الثلاث):
>
> ```
> cd /home/اسم_حسابك/waomcoo-backend && /opt/cpanel/ea-php84/root/usr/bin/php artisan tinker --execute="\App\Models\User::create(['name'=>'المدير','email'=>'admin@waomcoo.com','password'=>bcrypt('اكتب-كلمة-مرور-قوية-هنا')]);"
> ```
>
> ثم **احذف المهمة فوراً** بعد نجاحها، لأن كلمة المرور مكتوبة داخلها.

### ٤) تسجيل الدخول والتحقق بخطوتين (مهم!)

1. افتح `/admin` وسجّل الدخول بالبريد وكلمة المرور.
2. **سيطلب منك النظام إعداد التحقق بخطوتين — هذا إلزامي ولا يمكن تجاوزه.**
3. سيظهر رمز QR. افتح تطبيق **Google Authenticator** على جوّالك ← امسح الرمز.
4. اكتب الرقم المكوّن من ٦ أرقام الظاهر في التطبيق.
5. **📋 ستظهر رموز احتياطية (recovery codes) — انسخها واحفظها في مكان آمن.**
   إذا فقدت جوّالك فهي الطريقة الوحيدة للدخول.

### ٥) رفع الشعارات

بعد الدخول: **الإعدادات (Settings)** ← قسم **Branding** ← ارفع:
- الشعار الأبيض (`logo_white`) — يظهر في لوحة التحكم والموقع
- الشعار الملوّن (`logo_mark`)
- أيقونة الموقع (`favicon`)

> الشعارات **غير مرفقة** في ملف التركيب لأنها تُحفظ في قاعدة البيانات
> عند رفعها، ولا بد من رفعها من لوحة التحكم. اطلبها من المطوّر إن لم تكن لديك.

### ٦) القائمة النهائية

- [ ] `/api/stats` يعرض ٤ إحصائيات
- [ ] `/api/services` يعرض ١٢ خدمة
- [ ] `/admin` يعرض صفحة دخول منسّقة (بخلفية كحلية)
- [ ] تمّ إنشاء حساب المدير وتسجيل الدخول بنجاح
- [ ] تمّ إعداد التحقق بخطوتين وحفظ الرموز الاحتياطية
- [ ] تمّ رفع الشعارات
- [ ] الموقع العام يعرض الخدمات والإحصائيات (يؤكّد صحة `CORS_ALLOWED_ORIGINS`)
- [ ] تجربة إرسال رسالة من صفحة "تواصل معنا" في الموقع العام، وظهورها في
      لوحة التحكم تحت **رسائل التواصل**

---

## حلول المشاكل الشائعة

| ما تراه | السبب المرجّح | الحل |
|---|---|---|
| صفحة بيضاء فارغة | صلاحيات `storage` | الخطوة ٧ — جرّب 775 |
| `500 Server Error` | `.env` غير موجود أو `APP_KEY` فارغ | راجع الخطوة ٥ ثم أعد `key:generate` |
| `No application encryption key has been specified` | `APP_KEY` فارغ | نفّذ `php artisan key:generate --force` |
| `SQLSTATE[HY000] [1045] Access denied` | بيانات قاعدة البيانات خاطئة | راجع الخطوة ٥ — تذكّر بادئة اسم الحساب |
| `SQLSTATE[HY000] [2002]` | `DB_HOST` خاطئ | يجب أن يكون `127.0.0.1` |
| يظهر كود المشروع أو قائمة ملفات | Document Root لا ينتهي بـ `/public` | الخطوة ٤ |
| صفحة الدخول بدون تنسيق | `APP_URL` خاطئ | صحّحه ثم `php artisan optimize:clear` |
| الموقع العام يعمل لكن بدون بيانات | `CORS_ALLOWED_ORIGINS` خاطئ | الخطوة ٥ ثم `php artisan optimize:clear` |
| الصور المرفوعة لا تظهر | `storage:link` لم ينفّذ | الخطوة ٧ |
| `PHP Parse error` أو `syntax error` | نسخة PHP أقل من 8.4 | الخطوة ١ |
| `Class "IntlDateFormatter" not found` | إضافة `intl` مغلقة | الخطوة ١ |
| لا أستطيع تسجيل الدخول (تعود للصفحة نفسها) | `SESSION_SECURE_COOKIE=true` بينما الموقع `http` | اجعلها `false` |

> **بعد أي تعديل على ملف `.env`** نفّذ هذا الأمر ليقرأ النظام التعديل:
> ```
> php artisan optimize:clear
> ```

---

## معلومات للمطوّر (ليست مطلوبة من المدير)

### ما تمّ التحقّق منه فعلياً قبل التسليم
- **نسخة PHP:** المدى الحقيقي هو **8.4.1 حتى 8.5.x**.
  PHP 8.3 **لا يعمل**: مكوّنات Symfony 8.1 المثبّتة (console, http-kernel,
  routing و١٤ غيرها) تفرض `php >=8.4.1`. تمّ التأكيد بأمر
  `composer why-not php 8.3.20`.
  PHP 8.6 سيتعطّل أيضاً (حِزم `nette/*` و `openspout` تتوقّف عند 8.5).
  لذلك `require.php` في `composer.json` صار `>=8.4.1 <8.6` بدلاً من `^8.3`
  ليفشل التركيب برسالة واضحة على النسخة الخطأ.
- **الترحيلات:** ١٥ ملف ترحيل نُفّذت على قاعدة MySQL 8.0.46 فارغة تماماً
  ← ٢٠ جدولاً، بدون أخطاء.
- **البيانات الأولية:** `db:seed` أنتج stats=4, services=12, features=8,
  process_steps=9, pages=5, source_countries=20, site_settings=1.
  أُعيد تشغيله مرة ثانية فبقيت الأعداد كما هي (idempotent، لا تكرار).
- **حساب التجربة:** `DatabaseSeeder` كان يُنشئ `test@example.com` بكلمة
  مرور `password` المعروفة. صار مقيّداً بـ `local`/`testing` فقط، وتمّ
  التأكيد أن `users=0` بعد `db:seed` على `APP_ENV=production`.
- **الأصول المبنية:** `public/build` مرفقة داخل الحزمة (مطلوبة لثيم Filament
  عبر `viteTheme`)، لأن استضافة cPanel لا توفّر Node.js.

### تعديلات أُجريت لأجل الاستضافة
- `config/cors.php`: كانت أصول `localhost` مكتوبة داخل الكود؛ صارت تُقرأ من
  `CORS_ALLOWED_ORIGINS` مع الرجوع إلى `FRONTEND_URL`.
- `AppServiceProvider`: `URL::forceScheme('https')` عند كون `APP_URL` بـ
  https — يحلّ مشكلة mixed-content عندما تُفكّ الـ SSL على وسيط
  (LiteSpeed/Cloudflare) فيرى PHP الطلب كـ http.
- `public/.htaccess`: منع تحميل الملفات المخفية والحسّاسة (`.env`,
  `composer.json`, `*.log` ...)، ترويسات أمان، ضغط وتخزين مؤقت.
  لم تُضَف قاعدة إجبار https عن قصد (تعارضها مع خيار cPanel يُنتج
  redirect loop) — موضّح داخل الملف.

### ما لا يمكن أتمتته (يتطلّب تدخّلاً بشرياً)
1. **إنشاء قاعدة البيانات والمستخدم** — من واجهة cPanel فقط.
2. **تشغيل الأوامر الأربعة** — لا توجد طريقة لتشغيلها من متصفّح بأمان.
   على الخطط بدون Terminal يُستخدم Cron (موضّح في الخطوة ٦).
3. **`APP_KEY`** — لم يُوَلَّد مسبقاً عن قصد: مفتاح مرفق في حزمة تُنقل
   بالبريد يعني أن كل من يملك الحزمة يستطيع فكّ تشفير بيانات الموقع.
4. **حساب المدير + التحقق بخطوتين** — يتطلّب تطبيق مصادقة على جوّال المدير.
5. **رفع الشعارات** — تُحفظ في قاعدة البيانات عبر لوحة التحكم.
6. **`REVALIDATE_SECRET`** — يجب أن يُطابق قيمة الموقع العام؛ يحدّده من يملك
   إعدادات الموقعين.
