هذا الموقع
الملف الشخصي الذي تقرأه الآن: مشروع Hugo بقوالب وCSS خاصة به لا قالبًا جاهزًا من سوق قوالب، ثنائي اللغة بالعربية والإنجليزية، ومنشور عبر عملية ترحيل منصة جرت تحت قدميّ أثناء الإعداد.
أنت تنظر إليه الآن!- المنصة
- Hugo (static site generator)، بُني بـ Claude Code
- التقنيات
- Hugo + Go templates, Cloudflare Workers (static assets), Cloudflare Email Routing, Resend, GitHub
- الكود
- المستودع ←
ما هو
دراسة الحالة هذه هي الموقع نفسه. لا Squarespace، ولا Webflow، ولا قالب جاهز من سوق قوالب: إنه مشروع Hugo بتخطيطات خاصة به، وقالب للصفحة الرئيسية وآخر لصفحات المشاريع مبنيان على قوالب Go في Hugo، وCSS خاصة بهذا الموقع وحده. المشاريع الأخرى تُظهر ما أستطيع بناءه؛ وهذا المشروع يُظهر الجزء الذي يبقى مخفيًا عادة، وهو كيف أُوصل ما بنيته إلى نطاق وأُبقيه هناك.
وهو ثنائي اللغة أيضًا. كل صفحة موجودة بالإنجليزية والعربية، والنسخة العربية تعمل من اليمين إلى اليسار، ولكل لغة بياناتها الوصفية وصورة معاينة الرابط الخاصة بها بدل أن تتشارك صورة الإنجليزية.
لماذا هذا المشروع
قول «أستطيع نشر المشاريع» سهل ولا يخبرك بالكثير. أما أن أشير إلى المستودع، وإلى سجلات الـ DNS، وإلى الصفحة التي تقرأها الآن، فهو شيء أنفع، لأن بإمكانك أن تذهب وتتحقق من الثلاثة.
البناء
اخترت Hugo بدل إطار عمل JavaScript لأن الملف الشخصي محتوى لا تطبيق. التوليد الساكن يعني ألا يوجد توجيه في جهة العميل يمكن أن يتعطّل، ولا شيء يحتاج ترطيبًا (hydration)، وبناءً سريعًا بما يكفي لأن أغيّر سطرًا فأراه فورًا. وقوالب الصفحة الرئيسية وصفحات المشاريع هي تخطيطات baseof وsingle وindex خاصة بالمشروع، لا قالب منزّل، فجاء قسم الواجهة وشبكة الأعمال وقسم النبذة كما أردتها تمامًا.
النشر
هذا هو الجزء الذي تتولاه عنك أدوات بناء المواقع، وقد تبيّن أنه أكثر الهندسة إثارة للاهتمام في المشروع:
- نشر مبني على Git. المستودع موصول بـ Cloudflare، فكل دفعة إلى
mainتُطلق بناءً جديدًا في Hugo وإعادة نشر. ولا توجد خطوة رفع يدوي في أي موضع من العملية. - ترحيل منصة في منتصف الإعداد. كانت Cloudflare في منتصف دمج Pages داخل Workers بينما كنت أُعِدّ هذا، فلم تكن لوحة التحكم تطابق التوثيق، وظل البناء ينتج موقعًا فارغًا. وما حلّ المشكلة هو إضافة ملف
wrangler.jsoncيشير إلى مجلد المخرجات في Hugo، وهو ما يقرأه مسار الأصول الساكنة الجديد في Workers. - DNS حقيقي، على نطاق مجاني في البداية. بدأ الموقع على النطاق
sophianawasreh.dpdns.org، المسجَّل عبر DigitalPlat والمُفوَّض إلى Cloudflare بخوادم أسماء خارجية بدل خدمة DNS الخاصة بـ DigitalPlat، وهو ما عنى انتظار انتشار خوادم الأسماء فعليًا بدل افتراض أن الأمر قد نجح. - الانتقال إلى نطاق خاص دون كسر الروابط القديمة. يعيش الموقع الآن على
alnawasreh.dev، لكنني كنت قد أرسلت العنوان القديم في سيرتي الذاتية، فبقي النطاق القديم موصولًا بالموقع، وهو يحوّل كل طلب إلى الصفحة نفسها على النطاق الجديد. ولم تفعل أول نسخة من إعادة التوجيه هذه (redirect) شيئًا على الإطلاق، لأن Cloudflare تقدّم الملف الساكن المطابق قبل أن تعمل شيفرة الـ Worker أصلًا، فظل النطاق القديم يعرض الموقع كاملًا بهدوء، وما أصلح ذلك هو أن أطلب من Workers تشغيل الشيفرة أولًا. وسار بريد النطاق الجديد على النحو نفسه تقريبًا، إذ أعادت Google رسالة تحقّق لأن خوادم البريد لديها كانت لا تزال تتذكّر، لمدة قد تصل إلى نصف ساعة، نتيجة استعلام جرى قبل أن توجد سجلات البريد.
لا شيء من هذا معقّد بعد أن تعرفه. وقد استحق العناء لأنه الطبقة التي كنت سأظل أخمّن بشأنها لولا ذلك، ولم أعد أخمّن الآن.