# CHO CLAUDE ĐỌC: Bước 6. Tên miền về Cloudflare

> Tài liệu này viết cho Claude Code của học viên. Người học chỉ cần dán câu lệnh bên dưới vào Claude, Claude đọc file này rồi làm.
> Thuộc hệ thống triển khai AI 20 bước của Trương Minh Kiên. Trang bước này: https://trienkhaitenmien.truongminhkien.vn

## Việc cần làm

Để Claude tự thêm bản ghi, tự đăng trang, tự bật SSL. Chỉ thêm bản ghi, không xoá bản ghi cũ.

Câu lệnh học viên dán vào Claude:

```
Tải gói https://trienkhaitenmien.truongminhkien.vn/ten-mien-cloudflare.zip, giải nén, đọc CHO-CLAUDE-DOC.md rồi giúp tôi gắn tên miền của tôi vào Cloudflare: kiểm DNS đang ở đâu, hỏi tôi chọn cách A/B/C, chỉ thêm bản ghi, không xoá bản ghi cũ
```

## Luật khi làm

1. Đọc hết file này, kể cả phần bẫy, trước khi chạy lệnh nào.
2. Việc cần mật khẩu, mã OTP, token hay thanh toán thì dừng lại để học viên tự làm, không nhập hộ.
3. Không xoá dữ liệu, bản ghi DNS hay file cũ của học viên. Chỉ thêm.
4. Khoá bí mật chỉ nằm trong `.env` (đã có trong `.gitignore`), không ghi vào mã, wiki hay kết quả.
5. Xong mỗi bước thì kiểm tra thật (chạy thử, đọc lại) rồi mới báo xong.
6. Gói này chạy trên máy của học viên, không phải máy người soạn. Mọi đường dẫn tính từ thư mục giải nén hoặc thư mục vault của học viên; hỏi học viên nếu cần. Skill nào nhắc tới file `output/...` hay trang `wiki/...` mà vault học viên chưa có thì đó chỉ là nguồn tham khảo của người soạn: bỏ qua, dùng nội dung ngay trong skill. Riêng `wiki/concepts/bo-mau-thuong-hieu.md`: nếu chưa có, chép từ `mau/bo-mau-thuong-hieu.md` trong gói rồi hỏi học viên để điền.

## Skill trong gói

- (gói này không kèm skill riêng)

Cách cài skill: chép từng thư mục trong `.claude/skills/` của gói vào `.claude/skills/` của vault Obsidian (bước 1). Tên thư mục phải trùng tên skill, file chính tên `SKILL.md`.

## Cách cài đặt từng bước (làm theo thứ tự)

### CHO CLAUDE ĐỌC — đưa tên miền về Cloudflare (đo trước, chuyển sau, không làm chết thư)

> Bạn là Claude Code trên máy một người mới. Họ có một tên miền mua ở nhà đăng ký Việt Nam (Mắt
> Bão, PA, Tenten, iNET…) hoặc nước ngoài, muốn DNS về **Cloudflare** (miễn phí) để sau này Claude
> tự thêm bản ghi, tự đăng trang lên Cloudflare Pages, tự bật SSL. Kết quả cuối: `nslookup -type=NS`
> ra `*.ns.cloudflare.com`, mọi trang cũ vẫn HTTP 200, thư vẫn về đúng hộp.
>
> Việc này đã làm thật (05–08/09/2026) trên một tên miền `.vn` đang chết với cả internet — mọi bẫy
> dưới đây đều có người trả giá. Tiếng Việt, mỗi lượt một việc, **chỉ THÊM, không XOÁ**.

## 0. Hỏi ba câu, kiểm bốn thứ

Hỏi: (a) tên miền, (b) mua ở đâu (nhà đăng ký), (c) hiện có gì chạy trên tên miền — web, thư
(Gmail/Lark/Zoho), trang con?

Kiểm bằng lệnh — **không tin màn hình quản trị, tin phép đo**:

```
nslookup -type=NS  <tên-miền> 8.8.8.8          # DNS đang ở đâu
nslookup -type=MX  <tên-miền> 8.8.8.8          # thư đang về đâu
nslookup -type=TXT <tên-miền> 8.8.8.8          # SPF, xác minh
nslookup -type=A   <tên-miền> 8.8.8.8          # web trỏ đâu
```
Chạy `python do-suc-khoe-ten-mien.py <tên-miền>` trong repo này — nó in một bảng: NS/A/CNAME/MX/
TXT/DS và mã HTTP của tên gốc + `www`. **Lưu bảng này thành `truoc.txt`** — đây là bản chụp "trước",
để nghiệm thu "sau".

Người dùng phải có tài khoản Cloudflare (dash.cloudflare.com) — họ tự tạo, tự đăng nhập.

## 1. Chặng 1 — Chép toàn bộ bản ghi cũ ra file BIND

Vào trang DNS của nhà đăng ký (người dùng đăng nhập, bạn đọc màn hình hoặc họ chụp). Chép **mọi**
bản ghi ra tệp `vung-du-lieu.txt` dạng BIND:

```
ten-mien.vn.            1  IN  A      1.2.3.4
www.ten-mien.vn.        1  IN  CNAME  ten-mien.vn.
ten-mien.vn.            1  IN  MX     1  mx1.larksuite.com.
ten-mien.vn.            1  IN  TXT    "v=spf1 include:spf.onlarksuite.com -all"
abc._domainkey.ten-mien.vn.  1  IN  TXT  ( "đoạn1≤255" "đoạn2≤255" )
```
- TTL `1` = Auto trên Cloudflare.
- **Chuỗi DKIM dài hơn 255 ký tự phải cắt** thành nhiều đoạn bọc `( … )` — đó là cú pháp DNS
  chuẩn, máy đọc thư tự nối. Dán, không gõ tay; đếm độ dài (thường ~410 ký tự).
- Nếu tên miền dùng thư ở Lark/Google: lấy DKIM từ trang quản trị dịch vụ thư (Lark: *Email › Xác
  thực DKIM › nút Khôi phục* — **không bấm "Tạo khoá mới"**, sẽ vô hiệu khoá cũ).

## 2. Chặng 2 — Tạo zone Cloudflare và nhập file

Trên dash.cloudflare.com: **Add a domain** → gõ tên miền → gói **Free** → Cloudflare quét bản ghi
cũ (có thể quét được 0 nếu DNS cũ đang hỏng — bình thường). Ghi lại **hai nameserver** được cấp
(dạng `xxx.ns.cloudflare.com`).

Vào **DNS › Records › Import** → chọn `vung-du-lieu.txt` → tích **"Proxy imported DNS records"**:
CNAME/A của web tự bật mây cam (proxy); MX/TXT tự "DNS only". Sau khi nhập, **đếm lại**:
- Đúng **một** TXT chứa `v=spf1`. Hai là hỏng cả hai.
- MX **mây xám** (DNS only). MX bật proxy = thư chết lặng lẽ, không ai được báo.
- Số dòng = số dòng trong file.

Nếu token API có sẵn (`CLOUDFLARE_API_TOKEN`), có thể thêm bản ghi bằng API — nhưng token thường
**không có quyền tạo zone**; tạo zone làm tay trên trang.

## 3. Chặng 3 — Đổi nameserver ở nhà đăng ký

Người dùng đăng nhập trang nhà đăng ký → mục *Nameserver / DNS server* → thay bằng hai NS của
Cloudflare → lưu. Cloudflare sẽ email "active" sau vài phút tới vài giờ.

**Nếu nhà đăng ký báo "Tên miền đang bật DNSSEC, không thể đổi nameserver"** → đọc bẫy 1 trước khi
làm gì.

## 4. Chặng 4 — Nghiệm thu bằng đo, không đọc màn hình

```
python do-suc-khoe-ten-mien.py <tên-miền> > sau.txt
```
So `truoc.txt` với `sau.txt`: NS đổi sang Cloudflare · A/CNAME/MX/TXT giữ nguyên giá trị · mọi
trang trả HTTP 200 (hoặc đúng mã như trước) · gửi thử một thư tới địa chỉ trên tên miền, nhận được.
Trên Cloudflare: **SSL/TLS › Full** (không "Flexible" nếu máy chủ gốc có HTTPS; không "Full strict"
nếu chưa chắc chứng chỉ gốc).

## 5. Bẫy đã trả giá

| # | Bẫy | Cách xử |
|---|---|---|
| 1 | **Cờ DNSSEC kẹt ở nhà đăng ký** (Mắt Bão): "đang bật DNSSEC, không đổi được NS" — nhưng tắt DNSSEC lại đòi "đổi NS về mặc định trước" → **vòng khoá kín**. Đo `nslookup -type=DS <tên-miền> a.dns-servers.vn` ra **rỗng** ⇒ chưa từng ký, cờ giả | **Không bấm "Dùng NS mặc định"** — nó kéo tên miền về vùng rỗng, giết mọi trang và thư đang chạy. Gửi phiếu hỗ trợ kèm 3 phép đo (không DS ở `.vn`, không DNSKEY, hai thông báo mâu thuẫn), xin gỡ cờ **và đặt luôn NS Cloudflare** trong cùng phiếu. Đã được xử lý sau một đêm |
| 2 | Tên miền "chết" nhưng NS vẫn đúng, máy chủ khoẻ → hoá ra ở bảng hosting có ô **"Không quản lý DNS"** đang bật cho riêng tên miền đó | Trước khi kết luận, hỏi thẳng **từng** máy chủ NS: `nslookup <tên-miền> <ns>` — trả `REFUSED` nghĩa là vùng không tồn tại ở đó |
| 3 | Thừa hưởng số liệu của phiên trước ("tên miền trỏ về X") rồi suy luận tiếp | Mỗi phiên **đo lại từ cơ quan quản lý** (`.vn`: `a.dns-servers.vn`), không đệ quy |
| 4 | Bản ghi MX bật proxy | Thư chết lặng lẽ. MX luôn DNS only |
| 5 | Hai bản ghi SPF | Hỏng cả hai. Đếm sau khi nhập |
| 6 | DKIM gõ tay sai một ký tự | Không có báo lỗi. Dán + đếm độ dài |
| 7 | Ảnh/trang đổi nhưng trình duyệt giữ bản cũ sau khi bật proxy | Thêm `?v=<mtime>` vào đường dẫn tài nguyên, hoặc *Caching › Purge* |
| 8 | Cloudflare Pages: biến bí mật (`*_SECRET`) không đi theo khi tạo lại dự án → biểu mẫu trả HTTP 500 "thiếu biến" | Người dùng tự thêm ở *Pages › Settings › Variables and Secrets* (Claude **không cầm** khoá) |
| 9 | Nhà đăng ký gộp nhiều giá trị vào một dòng cùng Host+Loại (MX 3 giá trị) | Khi chép ra BIND, tách thành từng dòng |
| 10 | Nhấp chuột tự động lệch toạ độ trên trang quản trị hosting (`us.cloudlogin.co`) | Đổi kích thước cửa sổ trình duyệt rồi nhấp lại |

## 6. Lằn ranh

Chỉ đụng **một** tên miền đã hỏi. Chỉ THÊM, không XOÁ (thấy bản ghi lạ: chép lại và hỏi). Không bấm
regenerate/rotate khoá ở dịch vụ thư. Không tự tắt DNSSEC, không mở khoá chuyển nhượng, không
gia hạn/mua thêm, không nâng gói trả phí. Không nhập mật khẩu — người dùng tự đăng nhập.

## 7. Báo cáo cuối (khuôn)

```
✅ <tên-miền> đã về Cloudflare — NS: <ns1>, <ns2>
📄 Bản ghi: <n> dòng nhập, SPF ×1, MX ×<k> (DNS only), DKIM <độ dài> ký tự
🧪 Trước/sau: web 200/200 · thư nhận được · SSL Full
⏳ Còn chờ: <cờ DNSSEC / phiếu hỗ trợ #… / biến bí mật Pages…>
```


## Hướng dẫn chi tiết và các bẫy đã gặp

(Bản đầy đủ có hình và nút bấm: https://trienkhaitenmien.truongminhkien.vn)

Yêu cầu trước khi bắt đầu

- Đã xong [Bước 2: Cài Claude AI](https://trienkhaiclaude.truongminhkien.vn/) (để AI đọc bảng bản ghi và gõ lệnh giúp bạn)
- Đã mua ít nhất 1 tên miền và đăng nhập được trang quản lý tên miền của nơi bạn mua
- Có tài khoản Cloudflare (miễn phí tại cloudflare.com)

## Chọn đúng 1 trong 3 cách trước khi làm

**Cách A — Gắn tên miền phụ vào Cloudflare Pages, giữ DNS ở nơi bạn đã mua tên miền.**

Đây là cách chúng tôi đang dùng cho hơn 30 tên miền phụ của truongminhkien.vn (mọi trang lead magnet và mọi trang của hệ thống này). Hợp nhất khi tên miền đang chạy website hoặc email thật và bạn không muốn rủi ro.

**Cách B — Chuyển hướng tên miền cũ về tên miền chính bằng Redirect Rules.**

Chúng tôi đã làm cho truongminhkien.com → truongminhkien.vn, kiểm thật 5/5 đường dẫn đúng. Cần tên miền cũ đã nằm sẵn ở Cloudflare.

**Cách C — Đổi nameserver để Cloudflare quản lý toàn bộ DNS.**

Chúng tôi đã lập kế hoạch đầy đủ cho truongminhkien.vn nhưng **quyết định không làm**: đo thật thì lợi ích tốc độ gần bằng 0 (máy chủ ở Kuala Lumpur đã gần Việt Nam, đã có cache và HTTP/3, các trang lead magnet vốn đã chạy trên Cloudflare Pages), trong khi rủi ro đổi hơn 20 bản ghi của tên miền đang chạy thật là có thật. Vì vậy phần "Cách C" bên dưới là kế hoạch, **chưa được chạy thật**.

## Cách A — Gắn tên miền phụ vào Cloudflare Pages

1

### Đưa trang lên Cloudflare Pages

Trong thư mục chứa file `index.html` của trang, chạy (Claude AI làm giúp):

npx wrangler pages project create \<tên-dự-án\>\
npx wrangler pages deploy \<thư-mục-trang\> --project-name \<tên-dự-án\>

Sau bước này trang đã chạy được ở `<tên-dự-án>.pages.dev`.

2

### Thêm CNAME ở nơi quản lý DNS

Thêm bản ghi CNAME: tên phụ (ví dụ `trienkhaimail`) → `<tên-dự-án>.pages.dev`. Chỉ **thêm**, không sửa hay xoá bản ghi đang có.

3

### Thêm đúng tên phụ đó làm Custom Domain trong Cloudflare Pages

dash.cloudflare.com → Workers & Pages → dự án → **Custom domains** → thiết lập tên miền tùy chỉnh → nhập đúng tên phụ → chọn "Nhà cung cấp DNS của tôi" (nếu DNS không ở Cloudflare) → bấm kiểm tra bản ghi DNS. Sau chừng 15-20 giây trạng thái chuyển "Active — SSL enabled". **Bước 2 và bước 3 đều bắt buộc** — thiếu bước nào cũng lỗi (xem bẫy 5).

4

### Kiểm bằng lệnh, đừng chỉ tin giao diện

`curl -I https://<tên-phụ>.<tên-miền>` phải ra `200` và không báo lỗi SSL. Mở thêm trang bằng tab ẩn danh để chắc không dính cache.

## Cách B — Chuyển hướng tên miền cũ về tên miền chính

1

### Xem các rule đã có sẵn TRƯỚC khi tạo rule mới

Cloudflare → tên miền cũ → Rules → Redirect Rules. Đọc hết danh sách và ghi lại thứ tự (xem bẫy 1 — rất dễ mất công vì bước này).

2

### Tạo 2 rule theo đúng thứ tự

**Rule 1** (đặt trên): chỉ cho đường dẫn bị lệch tên giữa hai site, ví dụ `/duong-dan-cu` → `https://ten-mien-chinh/duong-dan-moi/`, mã 301.

**Rule 2** (đặt dưới): rule chung, giữ nguyên đường dẫn và tham số:

When: Hostname contains ten-mien-cu\
Then: Dynamic → concat("https://ten-mien-chinh", http.request.uri.path)\
Mã 301, bật "Preserve query string"

Rule 1 phải đứng trước Rule 2, nếu không rule chung chạy trước và đường dẫn lệch tên vẫn bị dẫn sai.

3

### Bật Proxied cho cả bản ghi gốc và `www`

Redirect Rules chỉ chạy trên lưu lượng đi qua Cloudflare (đám mây cam). Bản ghi ở chế độ "DNS only" (đám mây xám) sẽ đi thẳng tới máy chủ và không bao giờ chạm tới rule.

4

### Test bằng tab mới hoặc thêm tham số né cache

Gõ `ten-mien-cu`, `www.ten-mien-cu` và vài đường dẫn cụ thể, kèm `?cb=1`, `?cb=2`... Đủ tất cả đường dẫn quan trọng mới coi là xong.

## Cách C — Đổi nameserver (kế hoạch, chưa chạy thật)

Chỉ làm khi bạn thật sự cần Cloudflare quản lý toàn bộ DNS. Đây là danh sách kiểm chúng tôi đã soạn cho truongminhkien.vn trước khi quyết định không đổi.

- Cloudflare → Add a domain → nhập tên miền → gói Free → để Cloudflare tự quét DNS hiện có.
- Đếm số bản ghi Cloudflare vừa quét và **đối chiếu từng dòng với bảng thật ở nơi bạn đang quản lý DNS** (quét tự động hay bỏ sót TXT dài). Bổ sung tay bản ghi thiếu.
- Các bản ghi xác thực email (SPF, DKIM, DMARC của Resend hoặc Lark Mail) phải để **DNS only (xám)**, không proxy; sai 1 ký tự khoá DKIM là hỏng gửi thư.
- Bản ghi trỏ về website và các CNAME `*.pages.dev` có thể để Proxied (cam) để hưởng CDN.
- Lấy 2 nameserver Cloudflare cấp, đổi ở nơi đăng ký tên miền. Trong lúc DNS lan truyền, site vẫn chạy bằng nameserver cũ.
- Sau khi đổi: kiểm `dig NS`, từng tên miền phụ, trạng thái Verified của dịch vụ email, và thử điền 1 form lead thật.

Câu lệnh — dán vào Claude AI

Sao chép

Tôi có tên miền \[điền tên miền\]. Làm giúp tôi:\
1. Chạy nslookup -type=NS để biết DNS đang nằm ở đâu.\
2. Liệt kê mọi bản ghi DNS hiện có (A, CNAME, MX, TXT).\
3. Hỏi tôi muốn cách nào: A (gắn tên miền phụ vào Cloudflare Pages) / B (chuyển hướng tên miền cũ về tên miền chính) / C (đổi nameserver về Cloudflare). Nhắc tôi rằng cách C chưa từng được chạy thật ở hệ thống mẫu.\
Quy tắc: chỉ THÊM bản ghi, không tự xoá hay sửa bản ghi đang có. Mọi bước cần mật khẩu, OTP hoặc quét mã tôi tự làm. Nếu bạn không gõ được vào trang DNS thì in bảng bản ghi nguyên văn cho tôi gõ tay, rồi bạn chỉ kiểm lại bằng nslookup. Ngôn ngữ: tiếng Việt.

## ⚠ Bẫy đã gặp + cách gỡ

🔴 1. Đã tạo đúng rule chuyển hướng nhưng KHÔNG rule nào chạy — vì có 1 rule cũ đứng trên cùng

Redirect Rules xử lý theo kiểu **khớp đầu tiên thắng rồi dừng**. Tên miền nối từ Webcake có sẵn 1 rule "Chuyển hướng từ thư mục gốc đến WWW" nằm ở vị trí số 1, mà bản hướng dẫn ban đầu không hề nhắc tới. Kết quả: cả 5 đường dẫn test đều sai dù cấu hình đúng 100%.

**Cách gỡ:** luôn đọc danh sách rule có sẵn trước khi tạo; kéo rule cũ xuống cuối (không xoá) bằng nút "..." → "Di chuyển xuống".

2\. Chuyển hướng chạy với tên miền trần nhưng không chạy với `www`

Bản ghi `www` đang ở "DNS only" (đám mây xám) nên lưu lượng đi thẳng tới máy chủ, không chạm engine Rules của Cloudflare.

**Cách gỡ:** Edit bản ghi, chỉ bật công tắc Proxy (giữ nguyên tên, loại, đích), Save.

3\. Đã sửa đúng mà thử vẫn thấy nhảy sai

Chrome cache chuyển hướng 301 rất mạnh; Ctrl+Shift+R vẫn dính cache với URL từng gõ trước đó.

**Cách gỡ:** thêm tham số phân biệt (`?cb=1`), hoặc mở tab hoàn toàn mới / cửa sổ ẩn danh, trước khi kết luận rule sai.

4\. Cloudflare báo lỗi cú pháp khi nhập chuyển hướng kiểu Dynamic

Chuỗi trần đứng một mình không được chấp nhận làm biểu thức, và `concat()` với đúng 1 tham số bị báo "số lượng đối số không hợp lệ" (hàm này bắt buộc từ 2 tham số).

**Cách gỡ:** viết `concat("https://ten-mien-chinh/duong-dan/", "")` (thêm chuỗi rỗng làm tham số thứ 2), hoặc đổi sang kiểu "Static".

🔴 5. Tên miền phụ gõ vào báo lỗi SSL `ERR_SSL_VERSION_OR_CIPHER_MISMATCH`

Chỉ thêm CNAME ở nơi quản lý DNS mà quên thêm đúng tên phụ đó làm Custom Domain trong dự án Cloudflare Pages: tên miền phân giải được nhưng Cloudflare chưa cấp chứng chỉ cho hostname đó nên bắt tay SSL luôn lỗi.

**Cách gỡ:** luôn làm đủ 2 bước (CNAME + Custom Domain), rồi kiểm bằng `curl -I` cả 2 phía trước khi báo "xong".

6\. `Authentication error (code 10000)` khi tự gọi API Cloudflare bằng token lấy từ file cấu hình của wrangler

File OAuth của wrangler trên Windows nằm ở `C:\Users\<tên>\.wrangler\config\default.toml`, không phải `%APPDATA%\xdg.config\.wrangler\config\default.toml`; lần gặp thật, chỉ đường dẫn thứ nhất còn token hợp lệ.

**Cách gỡ:** kiểm lại đúng đường dẫn này trước khi nghi ngờ quyền của token.

Bước tiếp theo

Đã biết cách gắn tên miền, sang bước kế tiếp: tạo hộp thư theo chính tên miền của bạn (kiểu lienhe@tenmiencuaban.vn) để gửi và nhận thư đúng thương hiệu.

[Sang bước 7: Hộp thư tên miền riêng →](https://trienkhaimail.truongminhkien.vn/)
<!-- them 19/10 -->
### Đã đổi nameserver sang Cloudflare mà tên miền vẫn không vào được
Gắn tên miền vào dự án Cloudflare Pages lúc vùng tên miền còn chờ nhận nameserver thì Cloudflare **không tự tạo bản ghi**. Vùng báo Đang hoạt động nhưng trình duyệt vẫn báo không tìm thấy máy chủ; mục tên miền tuỳ chỉnh của dự án Pages báo "CNAME record not set".
**Cách gỡ:** vào DNS của tên miền trên Cloudflare, thêm CNAME `@` và `www` trỏ `<ten-du-an>.pages.dev`, bật proxy. Vào dự án Pages, mục Custom domains, bấm **Check DNS records**. Vài phút là chạy; máy mình chưa vào được thì thử bằng 4G hoặc tab ẩn danh (máy còn nhớ kết quả cũ). Kiểm lại bằng `nslookup <ten-mien> 1.1.1.1` và `curl -I https://<ten-mien>/`.

