Runbook pengaktifan Pages
Runbook langkah demi langkah untuk meluncurkan GitHub Pages dengan domain kustom di apothem.ahmedgad.com melalui konfigurasi DNS CNAME.
Runbook ini mengarahkan apothem.ahmedgad.com dari konfigurasi GitHub
Pages yang baru menuju halaman landing HTTPS dengan status 200 OK.
Prosedur ini ditulis untuk operator yang menggunakan gh dan konsol
penyedia DNS; kontributor baru yang kompeten dapat mengikutinya tanpa
konteks sebelumnya.
Runbook disusun sebagai inti yang tidak bergantung pada penyedia (langkah sisi GitHub dan langkah DNS-record yang dibagi setiap penyedia) diikuti oleh lampiran spesifik-penyedia untuk Namecheap, Cloudflare, Route53, dan opsi cadangan DNS generik. Jalankan inti secara berurutan; lompat ke lampiran yang cocok dengan registrar domain apex / host DNS; kembali ke inti untuk verifikasi.
Situs dihosting dari repositori publik ahmed-g-gad/apothem melalui
GitHub Pages dengan CNAME domain kustom menunjuk ke
ahmed-g-gad.github.io. Build situs statis menghasilkan keluaran ke
site/dist/; alur kerja Pages mengangkat artefak build itu ke situs
live pada setiap push ke main.
1. Prasyarat
Operator mengonfirmasi hal berikut sebelum melanjutkan:
- Status repositori.
ahmed-g-gad/apothembersifat publik, telah mengaktifkan Pages (Settings > Pages > Source: GitHub Actions), dan alur kerjapublish-static-site.ymlada di.github/workflows/publish-static-site.yml. - Otoritas DNS. Operator mengendalikan DNS untuk
ahmedgad.comdi registrar atau di host DNS yang didelegasikan (Cloudflare, Route53, dll.). Host DNS diidentifikasi melaluidig NS ahmedgad.com +short. - Perkakas.
gh(GitHub CLI) versi 2.40 atau lebih baru yang terautentikasi terhadap akunahmed-g-gad;dig(BINDdigataudrill) untuk verifikasi DNS; sebuah peramban untuk inspeksi HTTPS. - Sikap apex. Runbook ini hanya mengonfigurasi subdomain
apothem.ahmedgad.com. Apexahmedgad.comtidak disentuh. CNAME di apex memerlukan CNAME-flattening (Cloudflare) atau ALIAS record (Route53); jalur subdomain menghindari kedua kelas komplikasi tersebut.
2. Inti yang tidak bergantung pada penyedia
2.1 Tambahkan domain kustom ke Pages
gh api -X PUT \
/repos/ahmed-g-gad/apothem/pages \
-F cname=apothem.ahmedgad.com \
-F https_enforced=trueVerifikasi bahwa panggilan tersebut mengembalikan record CNAME yang baru:
gh api /repos/ahmed-g-gad/apothem/pages \
--jq '.cname, .https_enforced, .status'Keluaran yang diharapkan:
apothem.ahmedgad.com
true
builtStatus built mengonfirmasi bahwa build Pages terbaru berhasil. Status
null berarti Pages belum berjalan sejak CNAME diterapkan — push commit
no-op ke main untuk memicu build.
2.2 Konfirmasi berkas CNAME
GitHub Pages menerima site/public/CNAME melalui artefak build situs
statis pada setiap deploy. Berkas tersebut berisi domain kustom dalam
satu baris, tanpa skema, tanpa trailing slash:
apothem.ahmedgad.comBerkas tersebut berada di site/public/CNAME. Verifikasi:
cat site/public/CNAMEJika berkas hilang, buat ulang di site/public/CNAME dan commit dengan
chore: restore Pages CNAME.
2.3 Tambahkan DNS record
Pages menyajikan domain kustom ketika penyedia DNS apex mengembalikan
salah satu dari empat alamat IP GitHub (untuk domain apex) atau sebuah
CNAME yang menunjuk ke <owner>.github.io (untuk subdomain). Untuk
apothem.ahmedgad.com kelas record-nya adalah CNAME:
| Field | Nilai |
|---|---|
| Type | CNAME |
| Host | apothem (hanya subdomain; registrar menambahkan apex) |
| Value | ahmed-g-gad.github.io. (titik akhir ketika registrar mensyaratkannya) |
| TTL | 3600 (satu jam; lebih rendah untuk propagasi lebih cepat saat cutover) |
Alur UI yang tepat untuk menambahkan record bervariasi per penyedia; lompat ke lampiran yang cocok di bawah, kembali ke sini ketika record telah disimpan.
2.4 Tunggu propagasi DNS
Propagasi selesai dalam lima menit untuk record ber-TTL rendah dan dalam satu jam untuk TTL default 3600 detik — edge penyedia dapat memperpanjang jendela ini selama transfer zona DNS. Lacak progres:
dig apothem.ahmedgad.com CNAME +shortKeluaran yang diharapkan:
ahmed-g-gad.github.io.Keluaran kosong berarti record belum terpropagasi. Jalankan ulang setiap 30 detik. Jika record tidak pernah muncul setelah 30 menit, kembali ke lampiran yang cocok dengan host DNS dan verifikasi bahwa record ter-commit di penyedia, bukan tertahan dalam status draf.
2.5 Verifikasi HTTPS
curl -sSI https://apothem.ahmedgad.com/ | head -5Keluaran yang diharapkan:
HTTP/2 200
server: GitHub.com
content-type: text/html; charset=utf-8
strict-transport-security: max-age=31536000Baris HTTP/2 200 dan server: GitHub.com bersama-sama mengonfirmasi
bahwa Pages menyajikan situs di bawah sertifikat TLS yang valid. Sebuah
301 ke URL HTTPS pada permintaan HTTP-biasa juga memenuhi gerbang
tersebut; HTTPS-enforced aktif.
Jika curl mengembalikan 526 (kode sertifikat-tidak-valid spesifik
Cloudflare) atau 502 (bad gateway), sertifikat belum diterbitkan. Pages
menyediakan sertifikat Let's Encrypt secara otomatis begitu CNAME
ter-resolve; berikan waktu hingga 24 jam untuk penerbitan pertama. Untuk
diagnostik:
gh api /repos/ahmed-g-gad/apothem/pages \
--jq '.https_certificate.state, .https_certificate.description'state: approved berarti penerbitan selesai. state: requesting berarti
penerbitan sedang berlangsung; tunggu. Status lain memerlukan restart
Pages (matikan dan nyalakan domain kustom melalui API).
2.6 Verifikasi deep link
curl -sSI https://apothem.ahmedgad.com/architecture/ | head -3Keluaran yang diharapkan:
HTTP/2 200
server: GitHub.com
content-type: text/html; charset=utf-8Sebuah 404 pada deep link berarti build situs statis belum memuat
halaman tersebut atau deploy belum selesai. Picu rebuild melalui
gh workflow run publish-static-site.yml.
2.7 Catat verifikasi
Tambahkan satu baris ke log status-situs operator (atau ke log verifikasi
runbook ini jika dipelihara secara inline) dengan tanggal, identitas
operator, dan keluaran status Pages dari gh api. Log verifikasi adalah
jejak audit — setiap perubahan konfigurasi Pages meninggalkan satu baris.
3. Lampiran penyedia — Namecheap
Namecheap menyediakan DNS melalui tab "Advanced DNS" registrar. Operator
memiliki ahmedgad.com di sini ketika NS record registrar cocok dengan
dns1.registrar-servers.com dan dns2.registrar-servers.com (default
Namecheap). Verifikasi dengan dig NS ahmedgad.com +short.
Langkah-langkah:
- Masuk ke Namecheap; buka dasbor.
- Klik
Domain Listdi navigasi kiri; temukanahmedgad.com; klikManage. - Klik tab
Advanced DNS. - Klik
Add New Record. Pilih:- Type:
CNAME Record - Host:
apothem(tanpa apex, tanpa titik akhir) - Value:
ahmed-g-gad.github.io.(dengan titik akhir) - TTL:
Automatic(default Namecheap; menghormati 1800 detik)
- Type:
- Klik tanda centang hijau untuk menyimpan.
- Tunggu 5 hingga 10 menit untuk propagasi edge Namecheap; lalu kembali
ke inti yang tidak bergantung pada penyedia §2.4 untuk verifikasi
dig.
Kegagalan umum: UI Namecheap secara diam-diam menolak record CNAME ketika
sebuah record A sudah menempati host yang sama. Hapus record A yang
berkonflik terlebih dahulu; CNAME dan A pada host yang sama saling
eksklusif menurut RFC 1034.
4. Lampiran penyedia — Cloudflare
Cloudflare DNS menghosting apex ketika NS record registrar menunjuk ke
*.ns.cloudflare.com (default Cloudflare setelah delegasi). Verifikasi
dengan dig NS ahmedgad.com +short.
Langkah-langkah:
- Masuk ke Cloudflare; pilih zona
ahmedgad.com. - Klik
DNS->Recordsdi navigasi kiri. - Klik
Add record. Pilih:- Type:
CNAME - Name:
apothem(Cloudflare menambahkan apex secara otomatis) - Target:
ahmed-g-gad.github.io(tanpa titik akhir di UI Cloudflare) - TTL:
Auto(default Cloudflare; merutekan melalui edge-nya) - Proxy status: DNS only (awan abu-abu, bukan oranye)
- Type:
- Klik
Save.
Pilihan proxy-status bersifat menentukan. Mengaktifkan proxy Cloudflare (awan oranye) merutekan lalu lintas melalui edge Cloudflare sebelum mencapai GitHub Pages; ini merusak penerbitan Let's Encrypt di Pages karena Cloudflare menyajikan sertifikatnya sendiri. Biarkan proxy mati untuk penyiapan awal; aktifkan proxy nanti hanya setelah memutuskan apakah akan mengelola sertifikat di edge Cloudflare.
- Tunggu 1 hingga 2 menit untuk propagasi edge Cloudflare; lalu kembali ke inti yang tidak bergantung pada penyedia §2.4.
Kegagalan umum: Cloudflare menghapus titik akhir dari target CNAME secara
diam-diam. Field target menerima ahmed-g-gad.github.io tanpa titik
akhir; resolver menambahkan titik akhir saat kueri. Jangan mengetik titik
akhir di UI Cloudflare — ini menghasilkan record bertitik-ganda yang
gagal ter-resolve.
5. Lampiran penyedia — Route53
Route53 menghosting zona ketika NS record registrar menunjuk ke empat
server awsdns-*.com / awsdns-*.org / awsdns-*.co.uk / awsdns-*.net.
Verifikasi dengan dig NS ahmedgad.com +short.
Langkah-langkah:
- Buka AWS Console; navigasi ke Route53; klik
Hosted zones; pilih zonaahmedgad.com. - Klik
Create record. - Konfigurasikan:
- Record name:
apothem(Route53 menambahkan apex secara otomatis) - Record type:
CNAME - Value:
ahmed-g-gad.github.io(tanpa titik akhir) - TTL:
300(5 menit; default Route53 lebih tinggi; turunkan TTL untuk propagasi lebih cepat saat cutover) - Routing policy:
Simple routing
- Record name:
- Klik
Create records. - Tunggu 1 hingga 5 menit untuk propagasi Route53; kembali ke §2.4.
Route53 mendukung alias record yang ter-resolve saat kueri tanpa
indireksi CNAME. Alias record tidak digunakan di sini karena target alias
terbatas pada sumber daya AWS (CloudFront, S3, ELB, dll.) dan
ahmed-g-gad.github.io bukan sumber daya AWS. CNAME sudah tepat.
Kegagalan umum: UI Route53 menerima nama record duplikat dengan policy
routing yang berbeda; ini muncul sebagai routing failover bergaya
healthcheck alih-alih CNAME sederhana. Pastikan Routing policy membaca
Simple routing sebelum menyimpan.
6. Lampiran penyedia — DNS generik
Untuk host DNS yang tidak tercakup oleh lampiran yang disebutkan namanya (panel DNS default sebagian besar registrar — GoDaddy, Hover, Gandi, OVH, Porkbun, Domains.google, Network Solutions), terapkan bentuk CNAME yang tidak bergantung pada penyedia:
| Field | Nilai |
|---|---|
| Type | CNAME |
| Host | apothem (hanya subdomain) |
| Value | ahmed-g-gad.github.io. (titik akhir — sebagian besar panel generik menerimanya; beberapa mensyaratkannya) |
| TTL | 3600 (atau nilai terendah yang tersedia di panel saat cutover) |
Dua kelas kegagalan yang berulang di panel generik:
- Inkonsistensi titik akhir. Beberapa panel mensyaratkan titik akhir; yang lain menolaknya; sebagian menerima keduanya. Ketika record gagal terpropagasi setelah 30 menit, alihkan titik akhir dan simpan ulang.
- Record A yang berkonflik pada host yang sama. CNAME dan A pada host yang sama melanggar RFC 1034 (Domain Names — Concepts and Facilities) bagian tiga tentang preferensi nama-domain. Hapus record A yang berkonflik sebelum menambahkan CNAME.
Setelah record disimpan, kembali ke §2.4 untuk verifikasi dig.
7. Pemulihan kegagalan
Prosedur pengaktifan Pages memiliki empat mode kegagalan yang terdokumentasi:
| Kegagalan | Diagnostik | Pemulihan |
|---|---|---|
gh api .../pages mengembalikan 404 | Pages tidak diaktifkan pada repo | gh api -X POST /repos/ahmed-g-gad/apothem/pages -f source.branch=main -f source.path=/site lalu ulangi §2.1 |
dig mengembalikan kosong setelah 30 menit | DNS record tidak ter-commit di penyedia | Kembali ke lampiran penyedia yang cocok; verifikasi record disimpan (bukan draf / pending); periksa panel untuk langkah Save yang terlewat |
https_certificate.state: errored | Pages tidak dapat menerbitkan sertifikat | Matikan dan nyalakan domain kustom di pengaturan Pages; ini memicu ulang penerbitan. Tunggu hingga 24 jam untuk percobaan baru |
| 404 deep-link setelah build | Build situs statis tidak menyertakan halaman | gh workflow run publish-static-site.yml; saat selesai verifikasi gh run list --workflow=publish-static-site.yml --limit=1 --json conclusion --jq '.[0].conclusion' mengembalikan success |
Jika pemulihan gagal setelah satu siklus diagnostik yang cocok, eskalasikan ke runbook pemulihan-rilis (force-push riwayat baru mungkin telah meninggalkan konfigurasi Pages dalam keadaan tidak konsisten).
8. Referensi silang
- Sumber spesifikasi. Spesifikasi §2.5 mencantumkan runbook ini dalam deliverable dokumentasi Cluster 4.
- Lokasi kanonik CNAME. Berkas CNAME berada di
site/public/CNAMEdan ter-commit ke repositori; Pages membacanya pada setiap build. - Alur pemulihan. Runbook pemulihan-rilis menerapkan ulang konfigurasi Pages dari snapshot pemulihan ketika urutan cutover gagal di tengah jalan.
- Siklus rilis. Setiap eksekusi rilis menyertakan job build Pages yang memverifikasi situs ter-render di domain kustom.