52 lines
4.6 KiB
Markdown
52 lines
4.6 KiB
Markdown
# النشر إلى CloudPanel
|
|
|
|
هذا إعداد أولي للنشر من Git عبر SSH. لا ينشئ موقع CloudPanel أو DNS أو شهادة TLS أو قاعدة MySQL؛ تلك خطوات تجهيز أولي تُنفذ لحساب Site User. يستخدم المنفذ `2101` افتراضيًا حسب إعداد المستخدم.
|
|
|
|
## إعداد الخادم مرة واحدة
|
|
|
|
1. أنشئ PHP Site في CloudPanel باسم النطاق المطلوب ومستخدم موقع مستقل. اضبط document root بعد أول نسخة ليشير إلى `<DEPLOY_ROOT>/current/public`.
|
|
2. أنشئ قاعدة MySQL ومستخدمًا خاصًا بالموقع من CloudPanel، بصلاحيات قاعدة التطبيق فقط.
|
|
3. أنشئ مجلد موقع النشر الذي يملكه Site User، على سبيل المثال `/home/siteuser/htdocs/fitness.example.com`.
|
|
4. أضف مفتاح Git Deploy Key للقراءة فقط إلى حساب Git، واختبر أن Site User يستطيع `git ls-remote` على origin.
|
|
5. أضف بصمة مفتاح SSH الخاص بالخادم إلى `known_hosts` على جهاز النشر. يعمل السكربت مع `StrictHostKeyChecking=yes` ولا يتجاوز التحقق.
|
|
6. أنشئ `<DEPLOY_ROOT>/shared/.env` يدويًا على الخادم، مع إعداد DB ومفاتيح الخدمة. لا ترفع الملف إلى Git. السكربت يوقف النشر إذا كان الملف غير موجود.
|
|
7. جهز التطبيق بحيث يحتوي جذر الإصدار `public/index.php`، ويحمّل إعداداته من `shared/.env`. ملفات الرفع الخاصة تحفظ في shared خارج `public/`.
|
|
8. ثبّت شهادة TLS ووجّه DNS إلى الخادم من CloudPanel، ثم أضف health endpoint قبل أول نشر إنتاجي.
|
|
|
|
CloudPanel ينشئ PHP site ومستخدمه، ويمكن تغيير document root إلى مجلد `public` وفق [دليل CloudPanel](https://www.cloudpanel.io/docs/v2/php/applications/other/). ملفات PHP الحالية موضوعة مباشرة داخل `backend/` ولا يوجد `public/` بعد؛ لذلك السكربت سيرفض إصدارها حتى تُنشأ نقطة دخول عامة آمنة.
|
|
|
|
## إعداد جهاز النشر
|
|
|
|
أضف remote باسم `origin` إلى repository بعد إنشائه، وادفع الفرع المقصود قبل النشر. عيّن المتغيرات في جلسة طرفية خاصة:
|
|
|
|
```bash
|
|
export DEPLOY_HOST='server.example.com'
|
|
export DEPLOY_USER='cloudpanel-site-user'
|
|
export DEPLOY_ROOT='/home/cloudpanel-site-user/htdocs/fitness.example.com'
|
|
export DEPLOY_DOMAIN='fitness.example.com'
|
|
export DEPLOY_PORT='2101'
|
|
export DEPLOY_REF='main'
|
|
```
|
|
|
|
تحقق من الإعداد المحلي دون اتصال SSH:
|
|
|
|
```bash
|
|
DEPLOY_DRY_RUN=1 bash deploy/sync-to-server.sh
|
|
```
|
|
|
|
بعد إنشاء public web root وضبط الخادم، نفّذ النشر من جذر المستودع:
|
|
|
|
```bash
|
|
bash deploy/sync-to-server.sh
|
|
```
|
|
|
|
السكريبت يرفض شجرة عمل غير نظيفة، ويتأكد أن `HEAD` يطابق آخر commit منشور للفرع نفسه في Git. يستخدم SSH بتهيئة غير تفاعلية، ثم يجلب ذلك الفرع على الخادم، يستخرج commit إلى مجلد مؤقت، ويفحص بناء PHP نحويًا إن كان PHP CLI متوفرًا. عند نجاح التحقق ينقل النسخة إلى مجلد الإصدار ويحوّل رابط `current` إليها. الفشل قبل ذلك يزيل مجلد الاستخراج المؤقت ويترك النسخة الحالية كما هي.
|
|
|
|
أول تشغيل يحتاج مفتاح SSH صالحًا للوصول إلى Site User عبر المنفذ 2101 ومفتاح Git صالحًا على الخادم. مفاتيح SSH لا تمرر كمتغير ولا تحفظ في هذا المستودع.
|
|
|
|
## الاسترجاع
|
|
|
|
كل إصدار محفوظ تحت `<DEPLOY_ROOT>/releases/<commit-sha>`. إعادة نشر commit محفوظ تعيد تفعيل نفس الإصدار، ما يسمح بالاسترجاع إلى نسخة سابقة. لا تحذف مجلدات الإصدارات أثناء فترة المراجعة. استرجاع ملفات التطبيق لا يسترجع قاعدة البيانات؛ migrations تحتاج سياسة رجوع منفصلة ونسخة احتياطية مختبرة.
|
|
|
|
لا ينفذ السكربت أوامر SQL أو يغيّر صلاحيات قاعدة البيانات أو ينشئ مستخدمين. بعد إضافة migrations، تُدار كخطوة إصدار مراجعة ومختبرة، ولا تُنفّذ تلقائيًا من آلية النشر قبل تحديد سياسة التراجع.
|