دليل النشر

نقل مدونة Ghost من Ghost(Pro) إلى خادم VPS خاص

انشر على VPS Cloud ←

دليل عملي

نقل مدونة Ghost من Ghost(Pro) إلى خادم VPS خاص

الاستضافة الذاتية11 دقيقةً للقراءةعدد الخطوات: 10

يفوتر Ghost(Pro) حسب عدد الأعضاء: كل شريحة تتجاوزها ترفع الاشتراك، والوكالة التي تدير عدة منشورات تدفع اشتراكاً عن كل موقع. ولأن Ghost مفتوح المصدر، يمكن للمنشور نفسه أن يعمل على خادمك الخاص بصيغة التصدير نفسها. الخطر ليس في استيراد المحتوى، بل في كل ما يحيط به: الصور، واشتراكات Stripe، وإرسال النشرات البريدية، وتحويل النطاق. يعالج هذا الدليل هذه النقاط الأربع خطوة بخطوة، مع إمكانية التراجع ما دام Ghost(Pro) نشطاً.

المحتويات· لماذا تغادر Ghost(Pro)، وما الذي تتركه خلفك1/11
  1. 01لماذا تغادر Ghost(Pro)، وما الذي تتركه خلفك
  2. 02ما تستعيده عند مغادرة Ghost(Pro)
  3. 03ما الذي يتغير، بنداً بنداً
  4. 04متطلبات بأرقام قبل لمس Ghost(Pro)
  5. 05الترحيل في عشر خطوات، من الجرد إلى التحويل
  6. 06اشتراكات Stripe: ما الذي ينتقل، وما الذي يجب اختباره
  7. 07النشرات البريدية: فجوة البريد التي يجب سدها
  8. 08تحويل DNS مع أقل انقطاع ممكن
  9. 09النسخ الاحتياطي من اليوم الأول
  10. 10استكشاف الأخطاء: الأعطال الأكثر تكراراً
  11. 11للوكالات: جمع منشورات العملاء في مكان واحد

لماذا تغادر 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.

الترحيل في عشر خطوات، من الجرد إلى التحويل

  1. تسجيل الحالة المرجعية

    قبل أي تصدير، دوّن ما يجب أن يجده الترحيل مجدداً: عدد المقالات المنشورة، والصفحات، والأعضاء المجانيين والمدفوعين والممنوحين اشتراكاً مجانياً (مرشحات واجهة 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
  2. خفض TTL النطاق

    في منطقة DNS، اخفض قيمة TTL لسجلات نطاق المنشور إلى 300 ثانية، قبل التحويل بـ 24 ساعة على الأقل. هذا ما يسمح يوم التحويل بتغيير عنوان IP في دقائق، والعودة بالسرعة نفسها.

  3. تصدير كل المحتوى

    في Ghost Admin، افتح Settings → Advanced → Import/Export، تبويب Export، واختر All data. يحتوي الأرشيف على export.json (المحتوى والإعدادات)، وmembers.csv، والقوالب المثبتة بصيغة .zip، وroutes.yaml وredirects.yaml. تحقق من وجود كل ملف قبل المتابعة.

  4. استرجاع الصور والوسائط

    وثائق Ghost واضحة: الصور ليست ضمن التصدير. على Ghost(Pro) لا تملك وصولاً إلى الخادم، لذا هناك طريقان. اطلب من دعم Ghost(Pro) أرشيفاً لمجلد content/images، أو أعد بناءه من العناوين العامة الموجودة في التصدير:

    grep -o '/content/images/[^"\\]*' export.json | sort -u > images.txt
    wc -l images.txt

    ثم نزّل كل ملف مع الحفاظ على شجرة content/images/…: فالمستورد في Ghost يتوقع هذا المسار.

  5. تثبيت النسخة الهدف على نطاق فرعي للاختبار

    ثبّت Ghost على VPS بعنوان مؤقت، مثل https://new.your-domain.com، مع MySQL 8 وإصدار مساوٍ على الأقل لإصدار المصدر. يبقى منشور الإنتاج على Ghost(Pro) طوال هذا الوقت: لا يلاحظ قراؤك شيئاً.

  6. استيراد المحتوى والقالب وعمليات إعادة التوجيه

    في Settings → Advanced → Import/Export، استورد ملف .zip يضم export.json ومجلد content/images: يقبل المستورد JSON وzip، ويمكن تقسيم أرشيف الصور الكبير إلى عدة ملفات zip. ثم افحص القالب قبل رفعه:

    npx gscan -z my-theme.zip

    فعّله، وارفع redirects.yaml وroutes.yaml من Settings → Labs.

  7. ربط حساب Stripe نفسه، ثم استيراد الأعضاء

    يطلب Ghost ربط حساب Stripe نفسه الذي يستخدمه المنشور الأصلي قبل استيراد الأعضاء المدفوعين. استورد أولاً عينة من خمسة إلى عشرة أعضاء مدفوعين، وتحقق من باقتهم واشتراكهم في بطاقة العضو، ثم استورد بقية members.csv.

  8. توصيل البريد: SMTP وMailgun

    اضبط كتلة mail في config.production.json (أو متغيرات البيئة المقابلة في Docker) بخادم SMTP الوسيط، لرسائل تسجيل الدخول. ثم أدخل مفاتيح Mailgun API في إعدادات Email newsletter في Ghost Admin. اختبر الاثنين: رابط تسجيل دخول يصل إلى عنوان داخلي، ثم نشرة تجريبية تُرسل إلى وسم داخلي.

  9. المقارنة قبل وبعد

    احسب المقالات والأعضاء في النسخة الجديدة:

    mysql -u ghost -p ghost_prod -e "SELECT status, COUNT(*) FROM posts GROUP BY status; SELECT status, COUNT(*) FROM members GROUP BY status;"

    يجب أن تطابق الأرقام أرقام الخطوة 1. افتح عشر مقالات عشوائياً مع صورها، وابحث عن أي أثر للمضيف القديم في الشيفرة المصدرية للصفحات.

  10. تحويل النطاق مع إبقاء 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 تخص الخادم لا هذا الانتقال.

منشورات Ghost الخاصة بك، مجمّعة على خوادمك

مساحة واحدة للنطاقات وخوادم VPS ومواعيد التجديد لكامل محفظة منشوراتك. خيار إدارة VPS يغطي تشغيل الخادم لا الانتقال نفسه: أنت تدير العلاقة مع عملائك، ونحن نتولى البنية التحتية.

بحاجة إلى مساعدة؟

تصفّح مركز المساعدة والأسئلة الشائعة، أو تواصل مع فريقنا — معاودة اتصال أو WhatsApp أو بريد إلكتروني. الدعم بـالعربية والفرنسية والإنجليزية.

راسلنا على WhatsAppيُفتح في علامة تبويب جديدة