انتقل إلى المحتوى
في هذه الصفحة

تسع سنوات على GitHub Pages، لماذا انتقلت أخيراً إلى Cloudflare

تسع سنوات على GitHub Pages، لماذا انتقلت أخيراً إلى Cloudflareصورة منشأة بالذكاء الاصطناعي

لمدة تسع سنوات تقريباً، كان موقعي على GitHub Pages. مجاني، موثوق، بلا صيانة تقريباً. فما سبب الترحيل إلى Cloudflare Pages؟ هذا المقال يشرح الدافع وراء التغيير، كيف تم الترحيل، المشكلات التي ظهرت، والمقايضات التي اكتشفتها على طول الطريق.

الموقع انطلق كمدونة Jekyll في يونيو 2016، وتحول إلى Docusaurus في يونيو 2025. GitHub Pages خدمني بإخلاص طوال هذه السنوات. الترحيل إلى Cloudflare لم يكن رد فعل على عطل فني، بل قرار واعٍ لأخذ وجودي على الإنترنت بجدية أكبر.

السبب الحقيقي: أريد توسيع الموقع

GitHub Pages مثالي لمحفظة أعمال صغيرة. تسع سنوات من الرضا التام: push، نشر، مجاني، بلا تفكير.

لكن خططي للموقع تغيرت. أريد المزيد من المقالات التقنية، المزيد من ملخصات الكتب، وفي النهاية تقديم منتجات: دورات، ربما مطبوعات تصويرية أو presets كهواية جانبية. بمجرد أن تبدأ بالتفكير في تحقيق دخل، زيارات منتظمة، وSEO، تتغير الأولويات. رابط github.io ليس علامة تجارية. بناء link equity حوله ليس ممكناً كما هو الحال مع نطاق تملكه بالكامل.

السؤال الحقيقي: أين أسجل نطاقاً مخصصاً، وماذا أفعل به بعد ذلك؟

اختيار مسجل نطاق

قارنت ستة مسجلين نطاقات من حيث السعر، سهولة الاستخدام، جودة DNS، والإضافات.

المزودالسعرسهولة الاستخدامنظام أسماء النطاقاتالإضافاتالإجمالي
Cloudflare Registrar★★★★★★★★★☆★★★★★★★★★★10/10
Porkbun★★★★★★★★★★★★★★☆★★★★☆9.8/10
Namecheap★★★★☆★★★★★★★★★☆★★★★☆9.2/10
Spaceship★★★★★★★★★★★★★★☆★★★★☆9.1/10
Dynadot★★★★☆★★★★☆★★★★☆★★★★☆9.0/10
GoDaddy★★☆☆☆★★★★☆★★★☆☆★★☆☆☆6.5/10

Porkbun و Spaceship خياران ممتازان. لكن Cloudflare Registrar فاز لأن تسعيره بسعر التكلفة (لا هامش ربح، التجديد بنفس سعر السنة الأولى)، DNS من الطراز الأول، وكل شيء في مكان واحد: النطاق، DNS، والاستضافة.

Cloudflare Pages ضد GitHub Pages

بعد تسجيل النطاق عبر Cloudflare، ربطه بـ Cloudflare Pages بسيط جداً. إضافة نطاق مخصص لمشروع Pages يستغرق دقائق ولا يحتاج أي تعديل DNS، سجلات DNS تدار من نفس لوحة التحكم.

إليك مقارنة بين منصتي الاستضافة:

الميزةGitHub PagesCloudflare Pagesلماذا تهم
شبكة توصيل المحتوى العالميةجيدةممتازةتحميل أسرع للصفحات للزوار خارج الولايات المتحدة
HTTPSنعمنعممطلوب لتحسين محركات البحث وثقة المتصفح
بناء تلقائيعبر GitHub Actionsمضمّننشر مع كل دفع دون الحفاظ على ملف سير عمل
نشر تجريبيلانعماختبار التغييرات على رابط مباشر قبل الدمج
تحليلاتلا يوجدمضمّنةفهم من أين تأتي الزيارات دون سكريبت طرف ثالث
تحسين الصورلانعمتقديم صور بالحجم الصحيح تلقائياً
دوال الحافةلانعمتشغيل منطق خادم على حافة شبكة التوصيل دون خلفية منفصلة
سرعة البناءجيدةأسرعحلقة تغذية راجعة أقصر عند النشر
إعادة توجيه مخصصةمحدودةممتازةإعادة توجيه الروابط القديمة بشكل نظيف دون تغيير الكود
رؤوس مخصصةلانعم (عبر ملف _headers)تعيين رؤوس HTTP مثل CSP و cache-control لكل مسار
استرجاع فوريلانعمالتراجع عن نشر خاطئ بنقرة واحدة من لوحة التحكم
مستودع خاصنعم (مجاني)نعم (مجاني)إبقاء الكود المصدري خاصاً إذا لزم الأمر

بالنسبة لموقعي الحالي (موقع Docusaurus ثابت)، الفروقات الأكثر أهمية: Preview Deployments (مفيدة لاختبار ترجمات i18n قبل الدمج) و Edge CDN (تحميل أسرع عالمياً).

كم التكلفة

لمدونة شخصية: Cloudflare Pages، CDN، HTTPS، ونشر Preview كلها مجانية. التكلفة الوحيدة هي تسجيل النطاق نفسه، حوالي 11 يورو سنوياً عبر Cloudflare Registrar.

ما تغير بالفعل في المستودع

المفاجأة: الترحيل كان أسهل مما توقعت.

تمت إزالة: .github/workflows/deploy.yml، سير عمل GitHub Actions الذي كان يبني الموقع ويدفعه إلى gh-pages.

تمت إضافة: wrangler.jsonc، 14 سطراً:

{
  "$schema": "node_modules/wrangler/config-schema.json",
  "name": "website",
  "compatibility_date": "2026-07-19",
  "observability": {
    "enabled": true,
  },
  "assets": {
    "directory": "build",
  },
  "compatibility_flags": ["nodejs_compat"],
}

تم تحديث: نصين في package.json:

"deploy": "yarn run build && wrangler deploy",
"preview": "yarn run build && wrangler dev"

هذا كل شيء. النشر الآن yarn deploy، والمعاينة المحلية yarn preview.

ما الذي حدث بشكل خاطئ

الترحيل كان سريعاً. المشكلات التي ظهرت بعده كانت أقل وضوحاً، بالضبط النوع الذي لن تجد له أثراً في الوثائق الرسمية.

كشف مدير الحزم

CI في Cloudflare يكتشف مدير الحزم تلقائياً من package.json. إذا حقل packageManager غير مثبت، قد يحاول ترقية أو تبديل مدير الحزم. الحل: تثبيته صراحة:

"packageManager": "yarn@1.22.22"

بدون هذا، كانت بيئة بناء Cloudflare تحاول ترقية yarn تلقائياً، مما كسر البناء.

تكوين رابط Docusaurus

Docusaurus يستخدم حقل url في docusaurus.config.ts لتوليد روابط مطلقة لخريطة الموقع وعلامات كانونيكال وخلاصات RSS وصورة OG. كان رابطي لا يزال مضبوطاً على نطاق GitHub Pages القديم:

url: "https://ammarnajjar.github.io",

البناء والنشر تم بنجاح، لكن خريطة الموقع كانت مليئة بالروابط الخاطئة، صورة OG تشير إلى العدم، وروابط RSS مكسورة. الحل بسيط: تحديث url إلى النطاق الجديد قبل النشر.

url: "https://ammar-najjar.com",

سهل تفويته، لأن الموقع يبدو سليماً في المتصفح. الأجزاء المكسورة غير مرئية، ما لم تفتح مصدر الصفحة أو تجري تدقيق SEO.

إعداد النطاق المخصص في Cloudflare

بمجرد أن يصبح الموقع حياً على https://<project>.pages.dev، ربط نطاق مخصص يحتاج ثلاث خطوات فقط في لوحة تحكم Cloudflare:

  1. اذهب إلى Workers & Pages، افتح مشروعك، ثم Custom domains
  2. أضف نطاقك. Cloudflare ينشئ سجلات DNS تلقائياً لأن النطاق ومشروع Pages في نفس الحساب
  3. انتظر دقائق حتى تجهز شهادة TLS. النطاق يصبح حياً تلقائياً

إذا كان نطاقك مسجلاً عند مزود آخر، ستحتاج إضافة سجل CNAME يدوياً. التسجيل عبر Cloudflare Registrar يلغي هذه الخطوة بالكامل.

مستودع GitHub خاص

إذا كنت تخطط لجعل المستودع خاصاً بعد ربطه بـ Cloudflare Pages، تأكد من أن تطبيق GitHub لـ Cloudflare لديه صلاحية الوصول إلى المستودعات الخاصة. اذهب إلى إعدادات GitHub تحت Applications، جد تطبيق Cloudflare Pages، وتحقق من صلاحيته للمستودع المحدد. بدون هذا، ستفشل عمليات البناء بصمت بعد التحويل إلى خاص.

الخطوات، بالترتيب

لتطبيق نفس الخطوات:

  1. أنشئ حساب Cloudflare
  2. اربط مستودع GitHub وانشر موقعك من Cloudflare Pages
  3. تأكد من أنه يعمل على https://<project>.pages.dev
  4. أجر أي تحسينات تريدها، فرصة جيدة لتدقيق الموقع
  5. اشتر نطاقك المخصص عبر Cloudflare Registrar
  6. اربط النطاق بمشروع Pages (دقائق، لا عمل يدوي على DNS)
  7. فعّل إعادة التوجيه ليذهب كل الزوار إلى نطاقك الجديد

الترتيب مهم: انشر أولاً، ثم اشتر النطاق. تريد التأكد من أن الموقع يعمل قبل أن تنفق المال، وتريد أن مشروع Pages موجود مسبقاً عند ربط النطاق.

إبقاء الروابط القديمة حية

الرابط القديم ammarnajjar.github.io لا يزال حياً، ويعيد التوجيه الآن إلى ammar-najjar.com. بدلاً من إعادة توجيه من جهة الخادم (غير متوفرة في GitHub Pages)، index.tsx يقوم بذلك client-side: وسم meta http-equiv="refresh" للزواحف، window.location.replace() للمتصفحات، ورابط احتياطي مرئي في حال فشل كل ما سبق. الكود المصدري الكامل على GitHub.

رقم واحد

ليس لدي نتائج Lighthouse من إعداد GitHub Pages القديم للمقارنة، لذا لن أختلق مقارنة قبل/بعد. ما يمكنني مشاركته: تحليلات Cloudflare تظهر Cache Hit Rate حوالي 80% لهذا الموقع. يعني 8 من كل 10 طلبات تُخدم مباشرة من Edge Cloudflare دون لمس Origin. لمدونة ثابتة مع زوار عائدين في الغالب، هذا الرقم يترجم مباشرة إلى زمن تحميل أسرع عالمياً.

هل كان يستحق ذلك؟

نعم. سير العمل أبسط، النطاق والاستضافة في مكان واحد، وفوري Preview Deployments، Analytics، وRollbacks بدون أي إعداد إضافي.

إذا كنت راضياً عن GitHub Pages وليس لديك خطط للتوسع، لا داعي للانتقال. لكن إذا كنت ستسجل نطاقاً مخصصاً على أي حال، فالطريق عبر Cloudflare إلى Cloudflare Pages هو أقل مقاومة. استغرق الترحيل بعد ظهر يوم واحد، والنتيجة إعداد سأبقى عليه للعقد القادم.

تسع سنوات عمر جيد لأي أداة. GitHub Pages أدى مهمته. التغيير لم يكن رفضاً، بل تطوراً في الطموح.

إذا كنت تستضيف موقعاً شخصياً اليوم: هل ما زلت ستختار GitHub Pages، أم ستبدأ بـ Cloudflare Pages؟ أشواقي لمعرفة المقايضات التي اكتشفها الآخرون.