Mở Localhost ra internet: Cloudflare Tunnel — phương án thay thế ngrok
Bạn cần chia sẻ site phát triển local với khách hàng? Đang kiểm thử các webhook đòi hỏi URL công khai? Có lẽ bạn đã dùng ngrok—và trả phí hàng tháng của họ cho những tính năng cơ bản như tên miền tùy chỉnh.
Cloudflare Tunnel là một phương án khác. Cloudflare Tunnel (trước đây là Argo Tunnel) cung cấp:
- ✅ Public hostname trên các tên miền bạn quản lý trong Cloudflare
- ✅ Hostname ổn định, có thể tái sử dụng sau khi tunnel khởi động lại
- ✅ Mức sử dụng phụ thuộc gói và chính sách Cloudflare hiện tại của bạn
- ✅ Thiết lập một cú nhấp trong FlyEnv—không cần dòng lệnh
Vì sao lập trình viên đang chuyển từ ngrok
| Tính năng | ngrok Free | ngrok Pro ($8/tháng) | Cloudflare Tunnel |
|---|---|---|---|
| Tên miền tùy chỉnh | ❌ | ✅ | ✅, tùy gói dịch vụ |
| Hostname ổn định | ❌ | ✅ | ✅, với DNS được quản lý |
| Hỗ trợ HTTP/2 | ✅ | ✅ | ✅ |
| Giới hạn sử dụng | Tùy gói | Tùy gói | Xem điều khoản Cloudflare hiện hành |
| Xác thực | ❌ | ✅ | Khả dụng qua Cloudflare Access |
| Độ phức tạp thiết lập | Đơn giản | Đơn giản | Một cú nhấp trong FlyEnv |
Thiết lập một cú nhấp với FlyEnv (Khuyến nghị)
FlyEnv tích hợp Cloudflare Tunnel trực tiếp vào UI. Không lệnh terminal, không tệp cấu hình—chỉ cần trỏ, nhấp và chia sẻ.
Bước 1: Lấy API Token của Cloudflare
- Đăng nhập vào Cloudflare Dashboard

- Vào My Profile (góc trên bên phải) → API Tokens

- Nhấp Create Token

Dùng mẫu "Cloudflare Tunnel", hoặc tạo token tùy chỉnh với các quyền sau:
- Account:Cloudflare Tunnel:Edit — Để quản lý tunnel
- Zone:Zone:Read — Để liệt kê các tên miền của bạn
- Zone:DNS:Edit — Để tạo bản ghi DNS
Chọn Zone Resources (các tên miền) bạn muốn dùng




- Sao chép token đã sinh
Bước 2: Cấu hình trong FlyEnv
- Mở FlyEnv → module Cloudflare Tunnel, và nhấp Nút biểu tượng Plus
- Dán API Token của bạn
- FlyEnv tự động tải các tên miền khả dụng của bạn

Bước 3: Tạo Tunnel của bạn
Sau khi các zone được tải:
- Select Zone: Chọn tên miền bạn muốn dùng (ví dụ
yourdomain.com) - Set Subdomain: Nhập subdomain bạn mong muốn (ví dụ
dev→ tạo radev.yourdomain.com) - Set Local URL: Chọn URL phát triển local của bạn (ví dụ
http://localhost:3000hoặchttps://myproject.test) - Nhấp "Ok"

Xong rồi đấy! FlyEnv tự xử lý mọi thứ bên trong:
- ✅ Tạo Cloudflare Tunnel
- ✅ Cấu hình bản ghi DNS
- ✅ Thiết lập các quy tắc định tuyến
- ✅ Sinh chứng chỉ SSL
Bước 4: Khởi động Tunnel
Nhấp nút "Start" trong module Cloudflare Tunnel.
Site local của bạn giờ đã trực tuyến tại https://dev.yourdomain.com

Quản lý nhiều Tunnel
Tạo bao nhiêu tunnel tùy nhu cầu:
| Subdomain | Local URL | Mục đích |
|---|---|---|
dev | https://myapp.test | Site phát triển chính |
api | http://localhost:3000 | Server API |
admin | http://localhost:8080 | Bảng điều khiển quản trị |
client-a | https://client-a.test | Bản xem trước cho khách hàng |
Tất cả được quản lý từ một giao diện duy nhất—khởi động, dừng hoặc xóa tunnel chỉ với một cú nhấp.
Cấu hình thủ công (Dòng lệnh)
Dành cho người dùng nâng cao thích kiểm soát bằng dòng lệnh, đây là phương pháp thiết lập truyền thống:
Điều kiện tiên quyết
- Một tài khoản Cloudflare với gói hỗ trợ các tính năng bạn cần
- Một tên miền đã được thêm vào Cloudflare
- Cloudflared đã cài (có sẵn trong module Cloudflared của FlyEnv)
Bước 1: Xác thực với Cloudflare
cloudflared tunnel loginLệnh này mở một cửa sổ trình duyệt để cấp quyền truy cập Cloudflare.
Bước 2: Tạo Tunnel của bạn
# Create a named tunnel
cloudflared tunnel create dev-localhost
# Output will show your Tunnel ID
# Save this - you'll need it for configurationBước 3: Cấu hình định tuyến DNS
# Route your subdomain to the tunnel
cloudflared tunnel route dns dev-localhost dev.yourdomain.comBước 4: Tạo tệp cấu hình
Tạo config.yml:
tunnel: <your-tunnel-id>
credentials-file: /Users/username/.cloudflared/<tunnel-id>.json
ingress:
- hostname: dev.yourdomain.com
service: http://localhost:80
- hostname: api.yourdomain.com
service: http://localhost:3000
- service: http_status:404Bước 5: Khởi động Tunnel
cloudflared tunnel run dev-localhostSo sánh: Cách tiếp cận UI của FlyEnv loại bỏ tất cả các bước này—bạn chỉ cần nhập API token, chọn zone, đặt subdomain và nhấp lưu.
Các tình huống sử dụng phổ biến
1. Bản xem trước cho khách hàng
Trước: "Để tôi triển khai lên staging... (30 phút sau)"
Sau: Chia sẻ https://feature-branch.yourdomain.com ngay lập tức—chỉ cần tạo một tunnel và khởi động nó.
2. Phát triển Webhook
Kiểm thử webhook Stripe, GitHub hay Slack tại local:
Thiết lập FlyEnv:
- Tạo tunnel:
webhooks.yourdomain.com→http://localhost:3000/webhooks - Khởi động tunnel
- Cấu hình điểm cuối webhook trong dashboard Stripe/GitHub
3. Kiểm thử trên thiết bị di động
Kiểm thử thiết kế responsive trên thiết bị thật:
- iPhone truy cập
https://mobile.yourdomain.com - Android truy cập cùng URL đó
- Cả hai đều trỏ tới server phát triển local của bạn
4. Phát triển API với HTTPS
Một số API đòi hỏi callback HTTPS. Cloudflare Tunnel cung cấp:
- Chứng chỉ SSL tự động
- Chấm dứt HTTPS tại biên (edge) của Cloudflare
- Kết nối an toàn tới localhost của bạn
5. Cộng tác nhóm
Chia sẻ công việc đang tiến hành với đồng nghiệp:
- Mỗi lập trình viên tự tạo tunnel của riêng mình
- Hoặc dùng chung một tunnel trỏ tới server của nhóm
Khắc phục sự cố
"Cannot get zones" trong FlyEnv
Nguyên nhân: API Token không hợp lệ hoặc thiếu quyền
Giải pháp:
- Xác nhận token có các quyền sau: Zone:Read, DNS:Edit, Cloudflare Tunnel:Edit
- Bảo đảm token bao gồm zone bạn muốn dùng
- Thử tạo token mới bằng mẫu "Cloudflare Tunnel"
"Tunnel creation failed"
Nguyên nhân: Sự cố mạng hoặc trùng tên tunnel
Giải pháp:
- Kiểm tra kết nối internet
- Thử một subdomain khác
- Kiểm tra xem tunnel đã tồn tại trong dashboard Cloudflare chưa
"Tunnel started but site not accessible"
Nguyên nhân: Local URL sai hoặc dịch vụ local chưa chạy
Giải pháp:
- Xác nhận local URL trong cài đặt tunnel (ví dụ
http://localhost:3000) - Bảo đảm server phát triển local của bạn thực sự đang chạy
- Thử truy cập trực tiếp local URL trong trình duyệt trước
DNS chưa lan truyền
Nguyên nhân: Bộ nhớ đệm DNS của Cloudflare
Giải pháp:
- Chờ 1-5 phút sau khi tạo tunnel
- Kiểm tra bản ghi DNS trong dashboard Cloudflare
- Bảo đảm đám mây màu cam đã bật (proxied)
Cấu hình nâng cao
Xác thực (Zero Trust)
Thêm đăng nhập Google/GitHub cho tunnel của bạn:
- Trong Cloudflare Zero Trust Dashboard
- Vào Access → Applications
- Tạo ứng dụng mới cho subdomain của bạn
- Cấu hình các nhà cung cấp xác thực
- Áp dụng cho hostname tunnel của bạn
Giờ dev.yourdomain.com đòi hỏi đăng nhập trước khi hiển thị site local của bạn.
Cân bằng tải (Nhiều Tunnel)
Cho tính khả dụng cao khi demo:
# config.yml - Manual configuration example
# On Machine A
tunnel: tunnel-id-1
# On Machine B
tunnel: tunnel-id-2
# Both route to same hostname
# Cloudflare load balances between themLưu ý: Với đa số tình huống phát triển, một tunnel duy nhất là đủ.
So sánh: FlyEnv với thiết lập thủ công
| Khía cạnh | Thủ công (Dòng lệnh) | FlyEnv UI |
|---|---|---|
| Thời gian thiết lập | 15-30 phút | 2 phút |
| Số lệnh phải nhớ | 10+ | 0 |
| Tệp cấu hình | Nhiều tệp YAML | Không có |
| Quản lý tunnel | Lệnh terminal | Trỏ và nhấp |
| Nhiều tunnel | Phức tạp | Dễ dàng |
| Khởi động/dừng | cloudflared tunnel run | Một nút duy nhất |
Câu hỏi thường gặp (FAQ)
H: Cloudflare Tunnel có thực sự miễn phí không?
Đ: Cloudflare cung cấp gói miễn phí có thể đủ dùng cho nhiều tunnel phát triển. Các giới hạn và tính năng Access đi kèm có thể thay đổi, nên hãy kiểm tra tài liệu gói Cloudflare hiện hành trước khi dựa vào một tính năng nào đó.
H: Tôi có cần gói Cloudflare trả phí không?
Đ: Không nhất thiết. Nhiều quy trình xem trước local chạy tốt trên gói miễn phí, nhưng yêu cầu cụ thể phụ thuộc vào hostname, chính sách Access, mức sử dụng và điều khoản Cloudflare hiện hành.
H: Tôi có thể dùng bất kỳ tên miền nào không?
Đ: Bạn cần kiểm soát DNS của tên miền đó (thêm nó vào Cloudflare). Tên miền miễn phí dùng được, hoặc dùng một subdomain của tên miền bạn sở hữu.
H: Cái này an toàn đến mức nào?
Đ: Connector chủ động tạo kết nối outbound, nên bạn không cần mở cổng inbound trên router. Public hostname vẫn có thể truy cập từ internet trừ khi bạn bổ sung các chính sách Cloudflare Access phù hợp, xác thực ứng dụng và kiểm soát origin.
H: Cái này có làm chậm việc phát triển local của tôi không?
Đ: Tác động tối thiểu. Tunnel cộng thêm độ trễ khoảng ~50-100ms—chấp nhận được cho bản xem trước và webhook. Với phát triển local, bạn vẫn dùng localhost trực tiếp.
H: Còn WebSockets thì sao?
Đ: Cloudflare Tunnel hỗ trợ WebSockets, nhưng hành vi ứng dụng vẫn phụ thuộc vào origin, cài đặt proxy và gói Cloudflare của bạn.
H: Tôi có thể dùng cùng một tunnel trên nhiều máy không?
Đ: Không—mỗi tunnel gắn với một máy. Hãy tạo các tunnel riêng cho các máy hoặc lập trình viên khác nhau.
H: Điều gì xảy ra khi tôi dừng tunnel?
Đ: URL công khai không thể truy cập nữa, nhưng bản ghi DNS vẫn còn. Khi bạn khởi động lại tunnel (dù là nhiều ngày sau), cùng URL đó lại hoạt động bình thường.
H: Tôi có thể chia sẻ tunnel với thành viên nhóm không?
Đ: Thành viên nhóm có thể tự tạo tunnel của riêng họ trỏ tới máy local của họ. Với môi trường dùng chung, hãy cân nhắc triển khai lên một server staging thay thế.
H: Tôi có cần giữ FlyEnv luôn chạy không?
Đ: Có. Tunnel chạy qua module Cloudflare Tunnel của FlyEnv. Đóng FlyEnv đồng nghĩa với dừng tunnel.
Sẵn sàng từ bỏ ngrok?
Cloudflare Tunnel tích hợp với FlyEnv cung cấp một UI tiện lợi để cấu hình public hostname cho phát triển local.
Tải xuống FlyEnv để bắt đầu với hỗ trợ Cloudflare Tunnel tích hợp sẵn.
Muốn khám phá thêm các tính năng mạng? Hãy xem hướng dẫn Thiết lập Reverse Proxy hoặc Tên miền tùy chỉnh & Auto SSL của chúng tôi.