Thời gian ước tính lần đầu: 2–3 giờ | Cập nhật: 2026-09
Em chọn Hugo + theme PaperMod + Cloudflare Pages + Giscus. PaperMod hỗ trợ sẵn nút share và chỗ gắn bình luận, nên anh ít phải viết code nhất.
Tổng quan quy trình
Anh viết bài Markdown trên máy, git push lên GitHub, Cloudflare tự build và đăng lên web. Bình luận và like nằm trong GitHub Discussions của chính repo đó.
Viết bài (.md) → git push → GitHub → Cloudflare Pages (auto build) → Blog online → Bình luận / Like (GitHub Discussions)
Giai đoạn 0: Chuẩn bị (15 phút)
- Tạo tài khoản GitHub và Cloudflare (đều miễn phí).
- Cài Git, và cài Hugo bản “extended” (Windows:
winget install Hugo.Hugo.Extended; macOS:brew install hugo). - Cài một trình soạn thảo, ví dụ VS Code.
- Kiểm tra: gõ
hugo versionvàgit --versiontrong terminal phải ra số phiên bản. Anh nhớ số phiên bản Hugo này, lát nữa cần dùng.
Giai đoạn 1: Dựng blog trên máy (30 phút)
hugo new site myblog
cd myblog
git init
git submodule add --depth=1 https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod
Tạo file hugo.yaml ở thư mục gốc (xóa file hugo.toml mặc định nếu có):
baseURL: "https://myblog.pages.dev/" # sẽ đổi khi có tên miền riêng
locale: vi
defaultContentLanguage: vi
title: "Tên blog của anh"
theme: PaperMod
params:
description: "Mô tả ngắn về blog"
defaultTheme: auto # tự theo sáng/tối của thiết bị
ShowReadingTime: true
ShowShareButtons: true # nút chia sẻ
comments: true # bật khung bình luận
ShareButtons: ["facebook", "twitter", "telegram", "whatsapp", "linkedin"]
menu:
main:
- { name: "Bài viết", url: "/posts/", weight: 1 }
- { name: "Giới thiệu", url: "/about/", weight: 2 }
Viết bài đầu tiên và chạy thử:
hugo new posts/bai-viet-dau-tien.md
# mở file, sửa nội dung, đổi draft: true thành draft: false
hugo server
Mở http://localhost:1313 để xem.
Giai đoạn 2: Đưa code lên GitHub (10 phút)
- Trên GitHub, tạo repo public (bắt buộc để Giscus hoạt động), ví dụ
myblog. - Tạo file
.gitignoreở thư mục gốc với nội dung:
public/
resources/_gen/
.hugo_build.lock
- Đẩy code:
git add .
git commit -m "Khởi tạo blog"
git branch -M main
git remote add origin https://github.com/TENCUAANH/myblog.git
git push -u origin main
Lưu ý khi clone lại repo trên máy khác: Theme PaperMod là submodule, cần thêm flag
--recurse-submodules:# Khi clone repo về máy khác: git clone --recurse-submodules https://github.com/TENCUAANH/myblog.git # Hoặc nếu đã clone rồi mà chưa có theme: git submodule update --init --recursive
Giai đoạn 3: Cài Giscus (20 phút)
- Vào repo → Settings → General → Features → tích Discussions.
- Cài app Giscus tại
github.com/apps/giscus, chọn cho đúng repomyblog. - Trong tab Discussions của repo, vào phần quản lý category, tạo (hoặc dùng) một category loại Announcements. Loại này chỉ cho phép Giscus và người quản trị tạo chủ đề mới, giúp tránh rác.
- Vào
giscus.app, điền tên repo, chọn:- Mapping: pathname (mỗi bài một chủ đề riêng)
- Category: Announcements
- Tích Enable reactions (đây chính là chức năng like)
- Language: Tiếng Việt
- Trang sẽ sinh ra một đoạn
<script>. Chép lại hai giá trịdata-repo-idvàdata-category-id. - Tạo file
layouts/partials/comments.html:
<script src="https://giscus.app/client.js"
data-repo="TENCUAANH/myblog"
data-repo-id="DAN_GIA_TRI_VAO_DAY"
data-category="Announcements"
data-category-id="DAN_GIA_TRI_VAO_DAY"
data-mapping="pathname"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="preferred_color_scheme"
data-lang="vi"
crossorigin="anonymous"
async>
</script>
Lưu ý: Khung bình luận Giscus sẽ không hiện trên localhost. Anh cần push lên Cloudflare Pages và mở trang thật để kiểm tra. Sau khi deploy xong, mở một bài viết, cuối bài sẽ thấy khung bình luận — đăng thử một bình luận bằng tài khoản GitHub để kiểm tra.
Giai đoạn 4: Đăng lên Cloudflare Pages (20 phút)
Trong Cloudflare: Workers & Pages → Create → Pages → Connect to Git, chọn repo
myblog. Giao diện Cloudflare hay thay đổi, nếu không thấy đúng tên nút thì tìm mục kết nối Git để deploy site tĩnh.Cấu hình build:
- Build command:
hugo --gc --minify - Output directory:
public
- Build command:
Thêm biến môi trường
HUGO_VERSIONvới giá trị đúng số phiên bản anh đã ghi ở Giai đoạn 0 (ví dụ0.167.0). Bước này quan trọng, vì nếu không Cloudflare có thể dùng bản Hugo cũ và build lỗi với theme.Cảnh báo: Đảm bảo file
.gitmodulesđã được commit vào repo. Nếu thiếu, Cloudflare sẽ không pull được theme PaperMod và trang bị trắng hoàn toàn sau khi deploy.Nhấn deploy. Vài phút sau anh có địa chỉ dạng
myblog.pages.dev.Quay lại
hugo.yaml, sửabaseURLthành địa chỉ thật, rồi push lại.
Giai đoạn 5: Tên miền riêng (tùy chọn, 15 phút)
- Mua tên miền ở nhà đăng ký bất kỳ (khoảng vài trăm nghìn đồng mỗi năm với
.com). Nếu chưa muốn tốn tiền, cứ dùng.pages.dev, hoàn toàn dùng được. - Trong dự án Pages chọn Custom domains → thêm tên miền → làm theo hướng dẫn trỏ DNS. Chứng chỉ HTTPS được cấp tự động.
- Cập nhật
baseURLtronghugo.yaml. - Nếu muốn giới hạn chỉ tên miền của anh được nhúng Giscus, tạo file
giscus.jsonở gốc repo với trườngorigins, xem hướng dẫn “advanced usage” của Giscus.
Giai đoạn 6: Hoàn thiện (30 phút)
- Trang Giới thiệu:
hugo new about.md. - RSS và sitemap: Hugo tạo sẵn, không cần làm gì.
- Ảnh bìa và ảnh bài viết: đặt trong thư mục
static/hoặc cạnh bài viết. Nên nén ảnh dưới khoảng 200 KB. - Thống kê truy cập: bật Cloudflare Web Analytics trong dashboard, miễn phí và không dùng cookie.
- Nút share cho điện thoại: PaperMod đã có Facebook, Telegram, WhatsApp… Nếu muốn thêm Zalo và các app khác, có thể bổ sung nút dùng Web Share API của trình duyệt (trên điện thoại sẽ hiện danh sách app đã cài).
Quy trình viết bài hằng ngày
hugo new posts/ten-bai.md # viết nội dung, draft: false
git add . && git commit -m "Bài mới: ..." && git push
Khoảng 1 đến 2 phút sau bài đã lên web.
Vận hành và kiểm duyệt
- Bình luận nằm trong tab Discussions của repo. Anh có thể xóa, ẩn, khóa chủ đề ở đó, và bật thông báo email của GitHub để biết khi có bình luận mới.
- Sao lưu: toàn bộ nội dung đã nằm trong Git. Nên clone thêm một bản về máy hoặc đẩy sang một nơi thứ hai.
- Cập nhật theme định kỳ:
git submodule update --remote --merge.
Lỗi hay gặp
| Triệu chứng | Nguyên nhân thường gặp |
|---|---|
| Trang trắng hoặc mất giao diện sau deploy | Thiếu HUGO_VERSION, hoặc quên kéo submodule của theme |
| Không hiện khung bình luận | Repo chưa public, chưa cài app Giscus, hoặc dán sai repo-id / category-id |
| Bình luận sai bài | data-mapping không phải pathname, hoặc đổi đường dẫn bài (đổi URL sẽ mất liên kết với chủ đề cũ) |
| Bài mới không lên | Còn draft: true, hoặc ngày đăng (date) ở tương lai |
Anh cần nhớ một hạn chế: người bình luận phải có tài khoản GitHub. Nếu sau này thấy đây là rào cản, anh có thể chuyển sang Waline mà không phải làm lại blog, vì chỉ cần thay file comments.html.
Bình luận và reaction được đồng bộ trực tiếp với GitHub Discussions của repo. Đăng nhập bằng tài khoản GitHub để bình luận hoặc phản hồi bài viết.