لماذا تغادر Ghost(Pro)، وما الذي تتركه خلفك
تسعير Ghost(Pro) مربوط بحجم الجمهور: كل باقة تحدد سقفاً لعدد الأعضاء، ويدعوك Ghost إلى الترقية كلما كبر المنشور. بالنسبة لناشر مستقل، هذه تكلفة واضحة. أما وكالة تدير النشرة البريدية أو الموقع الإعلامي لخمسة عملاء، فهي خمسة اشتراكات يتبع كل منها منحناه الخاص. كما تستثني الباقة الأولى القوالب المخصصة والتكاملات المصممة حسب الطلب.
الاستضافة الذاتية تحل النقطتين: خادم واحد يحمل عدة منشورات، وتثبّت القالب والتكاملات التي تحتاجها.
لكن يجب الصدق بشأن العمود الآخر. يتضمن Ghost(Pro) إرسال النشرات مع إعداد مسبق لقابلية التسليم، والتحديثات، والنسخ الاحتياطية، ودعم الناشر. عند المغادرة تصبح كل هذه المهام مسؤوليتك. ليس ذلك مشروعاً مستحيلاً، لكنه تكلفة حقيقية يجب حسابها قبل القرار لا اكتشافها بعده.
ما تستعيده عند مغادرة Ghost(Pro)
- تكلفة لا تتبع حجم الجمهور — يُحدَّد حجم الخادم حسب الزيارات وحجم الصور، لا حسب عدد الأعضاء المسجلين.
- عدة منشورات على جهاز واحد — تجمع الوكالة نسخ Ghost على خادم VPS أو اثنين بدل تكديس الاشتراكات.
- قوالب وتكاملات دون قيود الباقة — قالب مخصص، وwebhooks، وأدوات تحليل أو بحث موصولة مباشرة بالخادم.
- التحكم في البيانات — قاعدة MySQL ومجلد
contentوالنسخ الاحتياطية ملكك؛ تختار مكان حفظها ومدته. - الصيغة نفسها من البداية إلى النهاية — من Ghost إلى Ghost يكون الاستيراد أصلياً: لا محوّل ولا إعادة كتابة للمقالات.
- جدول تحديثات تختاره بنفسك — تختبر الإصدار الجديد على نسخة قبل تطبيقه على المنشور المباشر.
ما الذي يتغير، بنداً بنداً
مرّر الجدول أفقيًا
| البند | Ghost(Pro) | Ghost مستضاف ذاتياً |
|---|---|---|
| التسعير | حسب الباقة، بسقف لعدد الأعضاء | سعر الخادم، أياً كان عدد الأعضاء |
| إرسال النشرات | مُضمَّن، دون إعداد | حساب Mailgun إلزامي، يُفوتر على حدة |
| رسائل تسجيل دخول الأعضاء | مُضمَّنة | خادم SMTP يجب إعداده |
| تحديثات Ghost | يطبقها الناشر | على عاتقك |
| النسخ الاحتياطية | يديرها الناشر | قاعدة MySQL ومجلد `content` تنسخهما بنفسك |
| قالب مخصص | حسب الباقة | ممكن دائماً |
| عمولة على الاشتراكات | لا عمولة من Ghost في الباقات المدفوعة | لا عمولة؛ تُطبَّق رسوم Stripe فقط |
متطلبات بأرقام قبل لمس Ghost(Pro)
الخادم: خطط لـ 2 vCPU و2 غيغابايت من الذاكرة لمنشور واحد، و4 غيغابايت إذا جمعت نسختين أو ثلاثاً أو إذا تجاوزت القائمة بضع عشرات الآلاف من الأعضاء. احسب القرص حسب وسائطك: قِس مجلد الصور، وضاعفه للنسخ المحلية، وأضف 10 غيغابايت للنظام.
قاعدة البيانات: MySQL 8 وليس MariaDB. وثائق Ghost الرسمية واضحة: MySQL 8 هي القاعدة الوحيدة المدعومة في الإنتاج، ويوصي Ghost بترك MariaDB. لا يؤثر المحرك في تصدير JSON، لكن النسخة الهدف يجب أن تعمل على MySQL 8.
الإصدار: يجب أن يكون إصدار النسخة الهدف مساوياً لإصدار Ghost(Pro) أو أحدث منه. دوّن الإصدار المعروض في Ghost Admin قبل تثبيت أي شيء.
الحسابات والصلاحيات: صلاحية المالك على حساب Stripe الموصول بالمنشور، وحساب Mailgun للنشرات، وخادم SMTP وسيط لرسائل تسجيل الدخول، والوصول إلى منطقة DNS الخاصة بالنطاق.
التثبيت نفسه لا نكرره هنا: اتبع دليلنا لتثبيت Ghost على VPS، ثم عد إلى الخطوة 5.
الترحيل في عشر خطوات، من الجرد إلى التحويل
تسجيل الحالة المرجعية
قبل أي تصدير، دوّن ما يجب أن يجده الترحيل مجدداً: عدد المقالات المنشورة، والصفحات، والأعضاء المجانيين والمدفوعين والممنوحين اشتراكاً مجانياً (مرشحات واجهة Members في Ghost Admin)، وإصدار Ghost، وقائمة عناوين خريطة الموقع. احفظ هذه القائمة في ملف:
curl -s https://your-domain.com/sitemap-posts.xml | grep -o '<loc>[^<]*' | sed 's/<loc>//' > urls-before.txt wc -l urls-before.txtخفض TTL النطاق
في منطقة DNS، اخفض قيمة TTL لسجلات نطاق المنشور إلى 300 ثانية، قبل التحويل بـ 24 ساعة على الأقل. هذا ما يسمح يوم التحويل بتغيير عنوان IP في دقائق، والعودة بالسرعة نفسها.
تصدير كل المحتوى
في Ghost Admin، افتح Settings → Advanced → Import/Export، تبويب Export، واختر All data. يحتوي الأرشيف على
export.json(المحتوى والإعدادات)، وmembers.csv، والقوالب المثبتة بصيغة.zip، وroutes.yamlوredirects.yaml. تحقق من وجود كل ملف قبل المتابعة.استرجاع الصور والوسائط
وثائق Ghost واضحة: الصور ليست ضمن التصدير. على Ghost(Pro) لا تملك وصولاً إلى الخادم، لذا هناك طريقان. اطلب من دعم Ghost(Pro) أرشيفاً لمجلد
content/images، أو أعد بناءه من العناوين العامة الموجودة في التصدير:grep -o '/content/images/[^"\\]*' export.json | sort -u > images.txt wc -l images.txtثم نزّل كل ملف مع الحفاظ على شجرة
content/images/…: فالمستورد في Ghost يتوقع هذا المسار.تثبيت النسخة الهدف على نطاق فرعي للاختبار
ثبّت Ghost على VPS بعنوان مؤقت، مثل
https://new.your-domain.com، مع MySQL 8 وإصدار مساوٍ على الأقل لإصدار المصدر. يبقى منشور الإنتاج على Ghost(Pro) طوال هذا الوقت: لا يلاحظ قراؤك شيئاً.استيراد المحتوى والقالب وعمليات إعادة التوجيه
في Settings → Advanced → Import/Export، استورد ملف
.zipيضمexport.jsonومجلدcontent/images: يقبل المستورد JSON وzip، ويمكن تقسيم أرشيف الصور الكبير إلى عدة ملفات zip. ثم افحص القالب قبل رفعه:npx gscan -z my-theme.zipفعّله، وارفع
redirects.yamlوroutes.yamlمن Settings → Labs.ربط حساب Stripe نفسه، ثم استيراد الأعضاء
يطلب Ghost ربط حساب Stripe نفسه الذي يستخدمه المنشور الأصلي قبل استيراد الأعضاء المدفوعين. استورد أولاً عينة من خمسة إلى عشرة أعضاء مدفوعين، وتحقق من باقتهم واشتراكهم في بطاقة العضو، ثم استورد بقية
members.csv.توصيل البريد: SMTP وMailgun
اضبط كتلة
mailفيconfig.production.json(أو متغيرات البيئة المقابلة في Docker) بخادم SMTP الوسيط، لرسائل تسجيل الدخول. ثم أدخل مفاتيح Mailgun API في إعدادات Email newsletter في Ghost Admin. اختبر الاثنين: رابط تسجيل دخول يصل إلى عنوان داخلي، ثم نشرة تجريبية تُرسل إلى وسم داخلي.المقارنة قبل وبعد
احسب المقالات والأعضاء في النسخة الجديدة:
mysql -u ghost -p ghost_prod -e "SELECT status, COUNT(*) FROM posts GROUP BY status; SELECT status, COUNT(*) FROM members GROUP BY status;"يجب أن تطابق الأرقام أرقام الخطوة 1. افتح عشر مقالات عشوائياً مع صورها، وابحث عن أي أثر للمضيف القديم في الشيفرة المصدرية للصفحات.
تحويل النطاق مع إبقاء Ghost(Pro) فترة تداخل
استبدل العنوان المؤقت بالنطاق النهائي في الإعدادات، وأعد تشغيل Ghost، ثم عدّل سجل DNS. أعد المرور على خريطة الموقع وتحقق من أن كل عنوان قديم يجيب بـ 200:
while read u; do echo "$(curl -s -o /dev/null -w '%{http_code}' "$u") $u"; done < urls-before.txt | grep -v '^200'أبقِ اشتراك Ghost(Pro) نشطاً أسبوعاً إلى أسبوعين. وللبريد التشغيلي لعدة منشورات، راجع دليلنا لخادم SMTP الوسيط على VPS.
اشتراكات Stripe: ما الذي ينتقل، وما الذي يجب اختباره
يحمل تصدير الأعضاء، لكل عضو مدفوع، معرّف العميل في Stripe (stripe_customer_id). ويستطيع المستورد أيضاً إيجاده بنفسه: مع القيمة auto، يبحث Ghost في حساب Stripe الموصول عن عميل بعنوان البريد نفسه. ومن هنا الشرط الذي تضعه الوثائق: يجب ربط النسخة الجديدة بحساب Stripe نفسه قبل الاستيراد. حساب آخر لا يحتوي هؤلاء العملاء، وسيصل مشتركوك المدفوعون كأعضاء مجانيين.
أما الاشتراكات نفسها فتبقى لدى Stripe: الترحيل لا يلغيها ولا يطلب من أحد الاشتراك من جديد. لكن الوثائق لا تفصّل كيف يستعيد كل اشتراك باقته في النسخة الجديدة. لهذا وُجدت عينة الخطوة 7: تحقق في بعض البطاقات من أن الباقة وتاريخ التجديد وحالة الدفع صحيحة قبل استيراد القائمة كاملة.
بعد التحويل، افتح نقاط نهاية webhook في لوحة Stripe. يجب أن تستقبل نقطة النسخة الجديدة الأحداث؛ أما نقطة Ghost(Pro) فلا تُحذف إلا عند إغلاق الاشتراك القديم.
النشرات البريدية: فجوة البريد التي يجب سدها
هذه النقطة تكتشفها معظم عمليات الترحيل متأخرة. على Ghost(Pro) يكون إرسال النشرات مُضمَّناً. أما في الاستضافة الذاتية فوثائق Ghost صريحة: Mailgun هو مزود الإرسال الجماعي الوحيد المدعوم، وخادم SMTP عادي لا يستطيع إرسال النشرات. يقتصر SMTP على رسائل تسجيل الدخول والدعوات.
تحتاج إذن إلى قناتين: خادم SMTP وسيط للبريد التشغيلي، وحساب Mailgun للنشر. من حيث التكلفة، سحبت Mailgun خطة Flex من الحسابات الجديدة أو جعلت الوصول إليها صعباً: راجع الأسعار الحالية على موقع Mailgun قبل وضع الميزانية، بحسب حجم الإرسال الشهري (عدد الأعضاء المشتركين مضروباً في وتيرة النشر).
أخيراً، جهّز مصادقة نطاق الإرسال: تُضاف سجلات SPF وDKIM التي يوفرها Mailgun إلى منطقة DNS قبل أول إرسال فعلي. النشرة المرسلة من نطاق غير مُصادَق تنتهي في البريد العشوائي، وتتضرر سمعة النطاق بأكمله.
تحويل DNS مع أقل انقطاع ممكن
يتوقف الانقطاع على عنصرين: انتشار DNS وشهادة TLS. خفض TTL في الخطوة 2 يعالج الأول. وللثاني خياران. إذا كان خادمك يحصل على الشهادة عبر تحدي HTTP (Caddy في تثبيت Docker الرسمي لـ Ghost، أو certbot مع nginx)، فلن يستطيع ذلك إلا بعد تحويل DNS: توقّع بضع ثوانٍ إلى بضع دقائق من أخطاء TLS. وإذا سمح مزود DNS بذلك، فإن تحدي DNS-01 يُصدر الشهادة قبل التحويل ويلغي هذه النافذة.
اختر فترة قليلة الزيارات، ولا ترسل أي نشرة في ذلك اليوم. فالمنشور المجدول على Ghost(Pro) سيُرسل من النسخة القديمة: أوقف الإرسالات المجدولة قبل التصدير.
ما دام Ghost(Pro) نشطاً، فالتراجع يعني إعادة سجل DNS القديم. هذه شبكة الأمان. لا تُغلق الاشتراك إلا بعد أسبوع دون فروق في الأعداد، وwebhooks الخاصة بـ Stripe، وقابلية التسليم.
النسخ الاحتياطي من اليوم الأول
كان Ghost(Pro) يتولى النسخ الاحتياطي عنك؛ الآن هذا دورك. جدول على الأقل تفريغاً يومياً للقاعدة ونسخة من مجلد content، إلى تخزين خارج VPS:
mysqldump --single-transaction -u ghost -p ghost_prod | gzip > /backup/ghost-$(date +%F).sql.gz
tar czf /backup/content-$(date +%F).tar.gz /var/www/ghost/contentأغلق في الجدار الناري كل منفذ غير 22 و80 و443، واختبر استعادة كاملة على جهاز فارغ مرة كل ربع سنة على الأقل.
استكشاف الأخطاء: الأعطال الأكثر تكراراً
413 Request Entity Too Large عند الاستيراد: يرفض nginx الأرشيف. ارفع client_max_body_size في كتلة server (مثلاً 200m)، وأعد تحميل nginx، أو قسّم الصور إلى عدة ملفات zip.
صور معطوبة بعد الاستيراد: لم يحترم الأرشيف المسار content/images/…، أو هناك ملفات ناقصة. قارن images.txt بمحتوى المجلد على الخادم وأعد استيراد الناقص.
أعضاء مدفوعون استُوردوا كمجانيين: لم يكن Stripe موصولاً وقت الاستيراد، أو كان حساباً آخر. اربط الحساب الصحيح وأعد استيراد الأعضاء المعنيين.
رابط تسجيل الدخول لا يصل أبداً: كتلة mail غائبة أو خاطئة. راجع سجلات Ghost (ghost log، أو docker compose logs ghost) لحظة طلب تسجيل الدخول.
خيار الإرسال بالبريد غائب عند النشر: Mailgun غير مُعدّ. لا يكفي SMTP للنشرات؛ أدخل مفاتيح Mailgun API في Email newsletter.
للوكالات: جمع منشورات العملاء في مكان واحد
يستغرق ترحيل منشور واحد نصف يوم من التحضير وساعة للتحويل. أما الثاني فأسرع، لأن الخادم وخادم SMTP الوسيط والمنهجية موجودة. هنا تصبح الاستضافة الذاتية مربحة للوكالة: عدة نسخ Ghost على VPS واحد، لكل منها قاعدتها ونطاقها، وفاتورة بنية تحتية واحدة.
على ServOrbit تبدأ خوادم VPS من 99 درهم/شهر غير شاملةٍ للضريبة، مع صلاحيات root وعنوان IPv4 مخصص، وتُتابَع نطاقاتك وخوادمك وتجديداتك في مكان واحد. وإن بقي السؤال «من يدير الخادم؟»، فخيار إدارة VPS يجيب عنه: أنت تدير العلاقة التحريرية مع عملائك، ونحن نتولى البنية التحتية.
هذا الدليل مقدَّم كما هو، ولا ينفّذ فريق ServOrbit نقل منشور Ghost(Pro) نيابةً عنكم، فإدارة VPS تخص الخادم لا هذا الانتقال.