دليل تشغيل تفعيل Pages
دليل تشغيل خطوة بخطوة لإطلاق GitHub Pages مع نطاق مخصص على apothem.ahmedgad.com عبر تهيئة سجل DNS من نوع CNAME.
يقود دليل التشغيل هذا apothem.ahmedgad.com من تهيئة
GitHub Pages جديدة إلى صفحة وصول HTTPS بحالة
200 OK. كُتب الإجراء للمشغِّل الذي يستخدم gh
وحدة تحكم مزوِّد DNS؛ ويتبعه مساهم جديد كفء دون سياق مسبق.
يُبنى دليل التشغيل بوصفه نواة مستقلة عن المزوِّد (خطوات جانب GitHub وخطوات سجل DNS التي يتشاركها كل مزوِّد) يتبعها ملاحق خاصة بالمزوِّد لـNamecheap وCloudflare وRoute53، وبديل احتياطي عام لـDNS. شغِّل النواة بالترتيب؛ وانتقل إلى الملحق المطابق لمُسجِّل نطاق القمة / مضيف DNS؛ ثم عُد إلى النواة للتحقق.
يُستضاف الموقع من المستودع العام ahmed-g-gad/apothem عبر
GitHub Pages مع توجيه CNAME الخاص بالنطاق المخصص
إلى ahmed-g-gad.github.io. يُخرج بناء الموقع الثابت إلى
site/dist/؛ ويرفع سير عمل Pages أداة البناء تلك
إلى الموقع المباشر عند كل دفع إلى main.
1. المتطلبات المسبقة
يؤكد المشغِّل ما يلي قبل المتابعة:
- حالة المستودع.
ahmed-g-gad/apothemعام، ومُفعَّل عليه Pages (Settings > Pages > Source: GitHub Actions)، ويوجد سير العملpublish-static-site.ymlفي.github/workflows/publish-static-site.yml. - سلطة DNS. يتحكم المشغِّل في DNS لـ
ahmedgad.comعند المُسجِّل أو عند مضيف DNS مُفوَّض (Cloudflare، Route53، إلخ). يُحدَّد مضيف DNS عبرdig NS ahmedgad.com +short. - الأدوات.
gh(GitHub CLI) الإصدار 2.40 أو أحدث، مُصادَقًا عليه مقابل حسابahmed-g-gad؛ وdig(BINDdigأوdrill) للتحقق من DNS؛ ومتصفح لفحص HTTPS. - موقف القمة. يُهيِّئ دليل التشغيل هذا النطاق الفرعي
apothem.ahmedgad.comفقط. ولا تُمسّ القمةahmedgad.com. يتطلب CNAME عند القمة تسطيح CNAME (Cloudflare) أو سجلات ALIAS (Route53)؛ ومسار النطاق الفرعي يتجنب كلا صنفي التعقيد.
2. النواة المستقلة عن المزوِّد
2.1 أضف النطاق المخصص إلى Pages
gh api -X PUT \
/repos/ahmed-g-gad/apothem/pages \
-F cname=apothem.ahmedgad.com \
-F https_enforced=trueتحقَّق من أن الاستدعاء أعاد سجل CNAME الجديد:
gh api /repos/ahmed-g-gad/apothem/pages \
--jq '.cname, .https_enforced, .status'المخرجات المتوقعة:
apothem.ahmedgad.com
true
builtتؤكد الحالة built أن أحدث بناء لـPages نجح. أما
الحالة null فتعني أن Pages لم يُشغَّل منذ تطبيق
CNAME — ادفع إيداعًا بلا تغيير إلى main لتشغيل
البناء.
2.2 أكِّد ملف CNAME
يستقبل GitHub Pages ملف site/public/CNAME عبر
أداة بناء الموقع الثابت عند كل نشر. يحتوي الملف على النطاق المخصص في سطر
واحد، دون مخطط، ودون شرطة مائلة في النهاية:
apothem.ahmedgad.comيوجد الملف في site/public/CNAME. تحقَّق:
cat site/public/CNAMEإذا كان الملف مفقودًا، أعد إنشاءه في site/public/CNAME
وأودِعه تحت chore: restore Pages CNAME.
2.3 أضف سجل DNS
يخدم Pages النطاق المخصص عندما يعيد مزوِّد DNS
للقمة أحد عناوين IP الأربعة لـGitHub (لنطاقات القمة)
أو CNAME يشير إلى <owner>.github.io (للنطاقات
الفرعية). بالنسبة إلى apothem.ahmedgad.com يكون صنف السجل
هو CNAME:
| الحقل | القيمة |
|---|---|
| Type | CNAME |
| Host | apothem (النطاق الفرعي فقط؛ يُضيف المُسجِّل القمة) |
| Value | ahmed-g-gad.github.io. (نقطة في النهاية عندما يطلبها المُسجِّل) |
| TTL | 3600 (ساعة واحدة؛ أقل لانتشار أسرع أثناء التبديل) |
يختلف تدفق الواجهة الدقيق لإضافة السجل بين المزوِّدين؛ انتقل إلى الملحق المطابق أدناه، وعُد إلى هنا عند حفظ السجل.
2.4 انتظر انتشار DNS
يكتمل الانتشار خلال خمس دقائق للسجلات ذات TTL المنخفض وخلال ساعة لـTTL الافتراضي البالغ 3600 ثانية — وقد تُمدِّد حواف المزوِّد هذه النافذة أثناء نقل منطقة DNS. تابِع التقدم:
dig apothem.ahmedgad.com CNAME +shortالمخرجات المتوقعة:
ahmed-g-gad.github.io.المخرجات الفارغة تعني أن السجل لم ينتشر بعد. أعد التشغيل كل 30 ثانية. إذا لم يظهر السجل أبدًا بعد 30 دقيقة، عُد إلى الملحق المطابق لمضيف DNS وتحقَّق من أن السجل مُودَع عند المزوِّد، لا معلَّقًا في حالة مسوَّدة.
2.5 تحقَّق من HTTPS
curl -sSI https://apothem.ahmedgad.com/ | head -5المخرجات المتوقعة:
HTTP/2 200
server: GitHub.com
content-type: text/html; charset=utf-8
strict-transport-security: max-age=31536000يؤكد السطران HTTP/2 200 وserver: GitHub.com
معًا أن Pages يخدم الموقع بشهادة TLS صالحة.
كما يُحقق التحويل 301 إلى عنوان HTTPS عند طلب
HTTP عادي البوابة أيضًا؛ ففرض HTTPS مُفعَّل.
إذا أعاد curl الرمز 526 (رمز شهادة غير صالحة
خاص بـCloudflare) أو 502 (بوابة سيئة)، فالشهادة
لم تُصدَر بعد. يُوفِّر Pages شهادات Let's Encrypt
تلقائيًا بمجرد تحلُّل CNAME؛ فامنح حتى 24 ساعة للإصدار الأول.
للتشخيص:
gh api /repos/ahmed-g-gad/apothem/pages \
--jq '.https_certificate.state, .https_certificate.description'تعني state: approved أن الإصدار اكتمل. وتعني
state: requesting أن الإصدار جارٍ؛ انتظر. وأي حالة أخرى
تتطلب إعادة تشغيل Pages (أوقِف النطاق المخصص وأعِد تشغيله عبر
الـAPI).
2.6 تحقَّق من الروابط العميقة
curl -sSI https://apothem.ahmedgad.com/architecture/ | head -3المخرجات المتوقعة:
HTTP/2 200
server: GitHub.com
content-type: text/html; charset=utf-8يعني رمز 404 على رابط عميق أن بناء الموقع الثابت لم يلتقط
الصفحة أو أن النشر لم يكتمل. شغِّل إعادة بناء عبر
gh workflow run publish-static-site.yml.
2.7 سجِّل التحقق
أضِف صفًا إلى سجل حالة موقع المشغِّل (أو إلى سجل التحقق في دليل التشغيل
هذا إن كان يُحفَظ مضمَّنًا) مع التاريخ، وهوية المشغِّل، ومخرجات حالة
Pages من gh api. سجل التحقق هو أثر التدقيق —
فكل تغيير في تهيئة Pages يترك صفًا.
3. ملحق المزوِّد — Namecheap
يكشف Namecheap عن DNS عبر علامة التبويب
"Advanced DNS" لدى المُسجِّل. يملك المشغِّل
ahmedgad.com هنا عندما تتطابق سجلات NS للمُسجِّل
مع dns1.registrar-servers.com و
dns2.registrar-servers.com (الافتراضي لـNamecheap).
تحقَّق بـdig NS ahmedgad.com +short.
الخطوات:
- سجِّل الدخول إلى Namecheap؛ وافتح لوحة التحكم.
- انقر
Domain Listفي التنقل الأيسر؛ وحدِّد موقعahmedgad.com؛ وانقرManage. - انقر علامة التبويب
Advanced DNS. - انقر
Add New Record. واختَر:- Type:
CNAME Record - Host:
apothem(دون قمة، دون نقطة في النهاية) - Value:
ahmed-g-gad.github.io.(مع نقطة في النهاية) - TTL:
Automatic(افتراضي Namecheap؛ يحترم 1800 ثانية)
- Type:
- انقر علامة الاختيار الخضراء للحفظ.
- انتظر من 5 إلى 10 دقائق لانتشار حافة Namecheap؛ ثم عُد إلى
النواة المستقلة عن المزوِّد §2.4 للتحقق بـ
dig.
عُطل شائع: ترفض واجهة Namecheap سجلات CNAME بصمت
عندما يشغل سجل A المضيف نفسه بالفعل. احذف سجل A
المتعارض أولًا؛ فـCNAME وA على المضيف نفسه يتنافيان
بحسب RFC 1034.
4. ملحق المزوِّد — Cloudflare
يستضيف Cloudflare DNS القمة عندما تشير سجلات NS
للمُسجِّل إلى *.ns.cloudflare.com (افتراضي
Cloudflare بعد التفويض). تحقَّق بـ
dig NS ahmedgad.com +short.
الخطوات:
- سجِّل الدخول إلى Cloudflare؛ واختَر منطقة
ahmedgad.com. - انقر
DNS->Recordsفي التنقل الأيسر. - انقر
Add record. واختَر:- Type:
CNAME - Name:
apothem(يُضيف Cloudflare القمة تلقائيًا) - Target:
ahmed-g-gad.github.io(دون نقطة في النهاية في واجهة Cloudflare) - TTL:
Auto(افتراضي Cloudflare؛ يوجِّه عبر حافته) - Proxy status: DNS only (سحابة رمادية، لا برتقالية)
- Type:
- انقر
Save.
اختيار حالة الوكيل حاسم. فتفعيل وكيل Cloudflare (السحابة البرتقالية) يوجِّه حركة المرور عبر حافة Cloudflare قبل الوصول إلى GitHub Pages؛ وهذا يكسر إصدار Let's Encrypt في Pages لأن Cloudflare يقدِّم شهادته الخاصة. أبقِ الوكيل مُعطَّلًا للإعداد الأولي؛ وفعِّل الوكيل لاحقًا فقط بعد أن تقرر ما إذا كنت ستدير الشهادة عند حافة Cloudflare.
- انتظر من 1 إلى 2 دقيقة لانتشار حافة Cloudflare؛ ثم عُد إلى النواة المستقلة عن المزوِّد §2.4.
عُطل شائع: يزيل Cloudflare النقطة النهائية من أهداف
CNAME بصمت. يقبل حقل الهدف ahmed-g-gad.github.io
دون النقطة النهائية؛ ويُضيف المُحلِّل النقطة النهائية وقت الاستعلام.
لا تكتب النقطة النهائية في واجهة Cloudflare — فهي تُنتج سجلًا
بنقطة مزدوجة يفشل في التحلُّل.
5. ملحق المزوِّد — Route53
يستضيف Route53 المنطقة عندما تشير سجلات NS للمُسجِّل
إلى أربعة خوادم awsdns-*.com / awsdns-*.org /
awsdns-*.co.uk / awsdns-*.net. تحقَّق بـ
dig NS ahmedgad.com +short.
الخطوات:
- افتح AWS Console؛ وانتقل إلى Route53؛ وانقر
Hosted zones؛ واختَر منطقةahmedgad.com. - انقر
Create record. - هيِّئ:
- Record name:
apothem(يُضيف Route53 القمة تلقائيًا) - Record type:
CNAME - Value:
ahmed-g-gad.github.io(دون نقطة في النهاية) - TTL:
300(5 دقائق؛ افتراضيات Route53 أعلى؛ خفِّض TTL لانتشار أسرع أثناء التبديل) - Routing policy:
Simple routing
- Record name:
- انقر
Create records. - انتظر من 1 إلى 5 دقائق لانتشار Route53؛ وعُد إلى §2.4.
يدعم Route53 سجلات الاسم البديل التي تتحلَّل وقت الاستعلام
دون توسيط CNAME. ولا تُستخدم سجلات الاسم البديل هنا لأن أهداف
الاسم البديل مقصورة على موارد AWS (CloudFront،
S3، ELB، إلخ) وahmed-g-gad.github.io
ليس موردًا في AWS. فـCNAME هو الصحيح.
عُطل شائع: تقبل واجهة Route53 أسماء سجلات مكررة بسياسات توجيه
مختلفة؛ ويظهر هذا كتوجيه تجاوز فشل بأسلوب فحص الصحة بدلًا من
CNAME بسيط. أكِّد أن Routing policy تُظهر
Simple routing قبل الحفظ.
6. ملحق المزوِّد — DNS العام
لمضيفي DNS غير المشمولين بالملاحق المُسمّاة (لوحات DNS الافتراضية لمعظم المُسجِّلين — GoDaddy، Hover، Gandi، OVH، Porkbun، Domains.google، Network Solutions)، طبِّق شكل CNAME المستقل عن المزوِّد:
| الحقل | القيمة |
|---|---|
| Type | CNAME |
| Host | apothem (النطاق الفرعي فقط) |
| Value | ahmed-g-gad.github.io. (نقطة في النهاية — تقبلها معظم اللوحات العامة؛ ويطلبها بعضها) |
| TTL | 3600 (أو أدنى قيمة متاحة في اللوحة أثناء التبديل) |
صنفا العُطل اللذان يتكرران عبر اللوحات العامة:
- عدم اتساق النقطة النهائية. تطلب بعض اللوحات النقطة النهائية؛ ويرفضها غيرها؛ ويقبل بعضها أيًّا منهما. عندما يفشل السجل في الانتشار بعد 30 دقيقة، بدِّل النقطة النهائية وأعِد الحفظ.
- سجل A متعارض على المضيف نفسه. ينتهك CNAME وA على المضيف نفسه RFC 1034 (Domain Names — Concepts and Facilities) القسم الثالث حول تفضيلات أسماء النطاقات. احذف سجل A المتعارض قبل إضافة CNAME.
بعد حفظ السجل، عُد إلى §2.4 للتحقق بـdig.
7. التعافي من الفشل
لإجراء تفعيل Pages أربعة أنماط فشل موثَّقة:
| الفشل | التشخيص | التعافي |
|---|---|---|
gh api .../pages يُعيد 404 | Pages غير مُفعَّل على المستودع | gh api -X POST /repos/ahmed-g-gad/apothem/pages -f source.branch=main -f source.path=/site ثم أعِد §2.1 |
dig يُعيد فراغًا بعد 30 دقيقة | سجل DNS غير مُودَع عند المزوِّد | عُد إلى ملحق المزوِّد المطابق؛ وتحقَّق من حفظ السجل (لا مسوَّدة / لا معلَّق)؛ وافحص اللوحة بحثًا عن خطوة Save مفقودة |
https_certificate.state: errored | لا يستطيع Pages إصدار شهادة | أوقِف النطاق المخصص وأعِد تشغيله في إعدادات Pages؛ فهذا يعيد تشغيل الإصدار. انتظر حتى 24 ساعة للمحاولة الجديدة |
| 404 على رابط عميق بعد البناء | لم يتضمن بناء الموقع الثابت الصفحة | gh workflow run publish-static-site.yml؛ وعند الاكتمال تحقَّق من أن gh run list --workflow=publish-static-site.yml --limit=1 --json conclusion --jq '.[0].conclusion' يُعيد success |
إذا فشل التعافي بعد دورة واحدة من التشخيص المطابق، صعِّد إلى دليل تشغيل التعافي من الإصدار (قد يكون الدفع القسري لتاريخ جديد قد ترك تهيئة Pages في حالة غير متسقة).
8. الإحالات المرجعية
- مصدر المواصفات. تُدرج المواصفات §2.5 دليل التشغيل هذا ضمن مُخرجات توثيق Cluster 4.
- الموقع القانوني لـ CNAME. يوجد ملف CNAME في
site/public/CNAMEومُودَع في المستودع؛ ويقرأه Pages عند كل بناء. - تدفق التعافي. يعيد دليل تشغيل التعافي من الإصدار تطبيق تهيئة Pages من لقطة التعافي عندما يفشل تسلسل التبديل في منتصف الطريق.
- دورة الإصدار. يتضمن كل تشغيل إصدار مهمة بناء Pages تتحقق من أن الموقع يُعرَض على النطاق المخصص.