انتقل إلى المحتوى الرئيسي
العودة إلى الفئة

تثبيت Ghost: منصة مدونة ومحتوى مستضافة ذاتياً

تثبيت Ghost عبر Docker، Nginx reverse proxy، شهادة SSL، إعداد القالب، نظام العضوية والاشتراك، النشرة البريدية وتكوين بيئة الإنتاج.

وقت القراءة: 13 dk الاستضافة الذاتية
ghostمدونةcmsself-hostingdockerنشرة بريديةإدارة المحتوى
الكاتب
REXE Teknoloji Network & Security Team
المحرر
REXE Teknoloji Technical Editorial
أول نشر
آخر تحديث

تثبيت Ghost: منصة مدونة ومحتوى مستضافة ذاتياً

Ghost هي منصة CMS مفتوحة المصدر مصممة للتدوين الحديث ونشر المحتوى. مقارنة بـ WordPress، فهي أسرع وأكثر أماناً وموجهة للمحتوى. تدعم أيضاً تحقيق الدخل من المحتوى عبر نظام العضوية والنشرة البريدية وتكامل الدفع.

ما هو Ghost؟

Ghost هو CMS headless ومنصة نشر مبنية على Node.js. الميزات الرئيسية:

  • السرعة: مبني على Node.js، تحميل صفحات سريع جداً
  • SEO: أدوات SEO مدمجة وبيانات منظمة
  • العضوية: نظام عضوية مجاني ومدفوع
  • النشرة البريدية: إرسال نشرات بريدية مدمج
  • القوالب: نظام قوالب مبني على Handlebars
  • API: REST API للاستخدام كـ headless CMS

متطلبات النظام

  • خادم مع Docker و Docker Compose
  • حد أدنى 1 جيجابايت RAM (يُنصح بـ 2 جيجابايت)
  • MySQL 8.0 أو SQLite
  • نطاق صالح وشهادة SSL

التثبيت عبر Docker

إعداد الإنتاج مع MySQL

hljs yaml
# docker-compose.yml
version: '3.8'

services:
  ghost:
    image: ghost:5-alpine
    container_name: ghost
    restart: unless-stopped
    depends_on:
      - db
    environment:
      database__client: mysql
      database__connection__host: db
      database__connection__user: ghost
      database__connection__password: strong-password
      database__connection__database: ghost
      url: https://blog.example.com
      mail__transport: SMTP
      mail__options__host: smtp.mailgun.org
      mail__options__port: 587
      mail__options__auth__user: postmaster@mg.example.com
      mail__options__auth__pass: mailgun-api-key
      mail__from: noreply@example.com
    volumes:
      - ./ghost-content:/var/lib/ghost/content
    ports:
      - "127.0.0.1:2368:2368"

  db:
    image: mysql:8.0
    container_name: ghost-db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: root-password
      MYSQL_DATABASE: ghost
      MYSQL_USER: ghost
      MYSQL_PASSWORD: strong-password
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:
hljs bash
# تشغيل الحاويات
docker compose up -d

# التحقق من السجلات
docker logs ghost -f

ينشئ Ghost قاعدة البيانات تلقائياً عند التشغيل الأول. الوصول إلى لوحة الإدارة: https://blog.example.com/ghost.

Nginx Reverse Proxy و SSL

hljs nginx
server {
    listen 80;
    server_name blog.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name blog.example.com;

    ssl_certificate /etc/letsencrypt/live/blog.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:2368;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
    }
}

نظام العضوية والاشتراك

Settings → Membership
- السماح بالأعضاء المجانيين: مفعّل
- الاشتراكات المدفوعة: عبر Stripe
- الوصول الافتراضي للمنشورات: عام / للأعضاء فقط / مدفوع

تكامل Stripe

Settings → Membership → Stripe
1. إنشاء حساب Stripe
2. إدخال مفاتيح API
3. إضافة webhook endpoint:
   https://blog.example.com/members/webhooks/stripe

النشرة البريدية

hljs yaml
environment:
  mail__transport: SMTP
  mail__options__service: Mailgun
  mail__options__host: smtp.mailgun.org
  mail__options__port: 587
  mail__options__auth__user: postmaster@mg.example.com
  mail__options__auth__pass: mailgun-smtp-password
  mail__from: "Blog Name <noreply@example.com>"

النسخ الاحتياطي

hljs bash
# نسخ احتياطي لمجلد محتوى Ghost
tar -czf ghost-backup-$(date +%Y%m%d).tar.gz ./ghost-content/

# نسخ احتياطي لقاعدة بيانات MySQL
docker exec ghost-db mysqldump -u ghost -pstrong-password ghost > \
  ghost-db-$(date +%Y%m%d).sql

الخلاصة

Ghost بديل قوي وحديث لـ WordPress لنشر المحتوى. نظام العضوية المدمج وإمكانيات النشرة البريدية والمحرر النظيف يجعله مثالياً للمدونين والناشرين المحترفين. مع النشر عبر Docker على خوادم REXE يمكنك تشغيل Ghost جاهز للإنتاج في دقائق.

الأسئلة الشائعة

لا أستطيع الوصول إلى لوحة إدارة Ghost، أحصل على خطأ 404.

تحقق من أن حاوية Ghost تعمل بـ docker ps. تأكد من ضبط متغير البيئة URL بشكل صحيح. تحقق من تكوين Nginx proxy. راجع سجلات Ghost: docker logs ghost. عند الإعداد الأول انتقل إلى مسار /ghost: https://blog.example.com/ghost.

إرسال البريد لا يعمل، لا يمكن إرسال النشرات البريدية.

تحقق من إعدادات SMTP. إذا كنت تستخدم Mailgun تأكد من التحقق من النطاق. أرسل بريداً تجريبياً من Ghost admin Settings → Email. في وضع sandbox لـ Mailgun يمكن الإرسال فقط إلى عناوين محققة. فعّل نطاق Mailgun للإنتاج.

تكامل الدفع مع Stripe لا يعمل.

تحقق من إدخال مفاتيح API لـ Stripe بشكل صحيح (مفتاح live وليس test). تأكد من إضافة webhook endpoint في لوحة Stripe. يجب أن يكون URL الخاص بـ Ghost بـ HTTPS (Stripe يرفض HTTP). تحقق من أحداث webhook في سجلات Stripe.

كيف أحدّث Ghost؟

قبل التحديث خذ نسخة احتياطية (مجلد المحتوى + قاعدة البيانات). حمّل الصورة الجديدة: docker compose pull. أعد تشغيل الحاوية: docker compose up -d. يقوم Ghost تلقائياً بترحيل قاعدة البيانات. عند التحديثات الكبيرة (مثل 4.x → 5.x) اقرأ ملاحظات الإصدار.

رفعت قالباً مخصصاً لكنه لا يظهر.

تأكد من أن ملف .zip للقالب بالهيكل الصحيح (package.json و index.hbs مطلوبان). فعّل القالب عبر Settings → Design → Activate. تحقق من سجلات Ghost لأخطاء القالب. يجب أن يكون القالب متوافقاً مع إصدار Ghost الخاص بك.

Ghost بطيء جداً، أوقات تحميل الصفحات طويلة.

إذا كنت تستخدم MySQL حسّن اتصال قاعدة البيانات. أضف ضغط gzip وتخزين المتصفح المؤقت في Nginx. فعّل التخزين المؤقت في Ghost Settings → Labs. فكّر في استخدام CDN (خطة Cloudflare المجانية). زد RAM الخادم (يُنصح بحد أدنى 2 جيجابايت).

مقالات ذات صلة

حركة الشبكةالداخل Gbpsالخارج Gbps