Self-Hosted n8n Bằng Cloudflare Tunnel – Ổn Định Hơn, Không Cần VPS
Hướng dẫn chi tiết cách tự host n8n bằng Docker Desktop kết hợp Cloudflare Tunnel để có URL cố định, bảo mật SSL miễn phí và không lo URL thay đổi như ngrok.
Nếu bạn đã theo dõi series Automation của mình, hẳn bạn đã quen với hành trình khám phá n8n từ những bước đầu tiên:
- Bài 1: Giới thiệu tổng quan về n8n – công cụ workflow automation mã nguồn mở mạnh mẽ đang được cộng đồng tech ưa chuộng.
- Bài 2: Hướng dẫn self-hosted n8n bằng Docker Desktop + ngrok – cách nhanh nhất để chạy n8n trên máy local và public ra internet.
Nếu bạn chưa đọc hai bài trên, hãy xem lại để nắm nền tảng trước khi tiếp tục, vì bài này sẽ xây dựng trên những kiến thức đó.
Trong bài viết này, chúng ta sẽ nâng cấp mô hình lên một bậc: Self-hosted n8n bằng Cloudflare Tunnel – giải pháp cho những ai cần URL cố định, kết nối bền vững và bảo mật chuẩn SSL mà vẫn chạy hoàn toàn miễn phí trên máy tính cá nhân.
Cả hai đều giải quyết cùng một bài toán: đưa ứng dụng local của bạn ra internet mà không cần VPS hay địa chỉ IP tĩnh. Nhưng chúng có những điểm khác biệt quan trọng:
| Tiêu chí | ngrok (Free) | Cloudflare Tunnel (Free) |
|---|---|---|
| URL cố định | ❌ Thay đổi mỗi lần restart | ✅ Gắn với domain của bạn, cố định vĩnh viễn |
| Tên miền riêng | ❌ Dùng subdomain ngrok | ✅ Dùng domain/subdomain của bạn |
| SSL/HTTPS | ✅ Có (tự động) | ✅ Có (tự động qua Cloudflare) |
| Tốc độ & độ trễ | Trung bình | Thấp hơn (CDN Cloudflare toàn cầu) |
| Giới hạn kết nối | Có (Free plan) | Không giới hạn |
| Độ phức tạp cài đặt | ⭐ Rất đơn giản | ⭐⭐ Cần có domain riêng |
| Phù hợp cho | Test nhanh, thử nghiệm | Dùng lâu dài, ổn định |
Kết luận nhanh:
- Dùng ngrok khi bạn cần test nhanh, không quan tâm URL thay đổi, và chưa có domain.
- Dùng Cloudflare Tunnel khi bạn muốn URL cố định, chạy ổn định lâu dài, và đã có (hoặc sẵn sàng mua) một tên miền.
💡 Tên miền
.io.vnhoặc.id.vnhiện chỉ khoảng 30.000–60.000 VNĐ/năm – đây là khoản đầu tư xứng đáng nếu bạn định dùng n8n nghiêm túc.
Thay vì để ngrok quản lý đường hầm, Cloudflare Tunnel dùng một tiến trình nhỏ tên cloudflared chạy trên máy bạn. Tiến trình này tự mở kết nối ra ngoài đến hạ tầng Cloudflare – không cần mở port, không cần cấu hình firewall, không cần IP tĩnh.
Người dùng internet ↓https://n8n.yourdomain.com (Cloudflare DNS + SSL) ↓Cloudflare Edge Network ↓cloudflared (chạy trên máy bạn) ↓http://localhost:5678 (n8n trong Docker)Toàn bộ luồng này được mã hóa, bảo mật, và URL không bao giờ thay đổi miễn là bạn không xóa tunnel.
| Yêu cầu | Chi tiết |
|---|---|
| Thiết bị | Máy tính chạy Windows, macOS hoặc Linux |
| Docker Desktop | Đã cài đặt và hoạt động (xem Bài 2) |
| n8n | Đã chạy thành công ở http://localhost:5678 (xem Bài 2) |
| Tên miền | Một domain bất kỳ đã được chuyển nameserver về Cloudflare |
| Tài khoản Cloudflare | Miễn phí tại cloudflare.com |
| Lưu trữ | ~100MB thêm cho cloudflared |
⚠️ Điều kiện bắt buộc: Bạn phải có một tên miền và tên miền đó phải đang được quản lý bởi Cloudflare (nameserver trỏ về Cloudflare). Nếu chưa có, hãy mua một domain tại bất kỳ nhà cung cấp nào (Namecheap, GoDaddy, Tenten…) rồi thêm vào Cloudflare theo hướng dẫn của họ.
Nếu domain của bạn đã được quản lý bởi Cloudflare, hãy bỏ qua bước này.
- Đăng nhập vào Cloudflare Dashboard.
- Nhấn Add a Site và nhập tên miền của bạn.
- Chọn gói Free và làm theo hướng dẫn để cập nhật Nameserver tại nhà cung cấp domain.
- Chờ từ vài phút đến vài giờ để Cloudflare xác nhận quyền sở hữu.
Khi dashboard hiển thị trạng thái Active màu xanh lá, bạn đã sẵn sàng cho các bước tiếp theo.
- Từ Cloudflare Dashboard, nhấn vào Zero Trust trên thanh menu bên trái (hoặc truy cập one.dash.cloudflare.com).
- Nếu lần đầu sử dụng, Cloudflare sẽ yêu cầu bạn đặt tên cho team – nhập bất kỳ tên nào, ví dụ:
myteam. - Chọn gói Free và xác nhận.
- Trong Zero Trust Dashboard, vào Networks → Tunnels.
- Nhấn Create a tunnel.
- Chọn Cloudflared làm connector type → Nhấn Next.
- Đặt tên cho tunnel, ví dụ:
n8n-local→ Nhấn Save tunnel.
Cloudflare sẽ hiển thị một đoạn lệnh cài đặt có chứa token của bạn, trông giống như:
cloudflared service install eyJhIjoiXXXXXXXXXXXXXXXXXXXX...Hãy sao chép toàn bộ chuỗi token dài (phần sau install ) – chúng ta sẽ dùng nó ở Bước 4. Chưa cần chạy lệnh này ngay.
Vẫn trong quá trình tạo tunnel, Cloudflare sẽ chuyển sang màn hình Route tunnel. Đây là nơi bạn khai báo subdomain sẽ trỏ vào n8n.
Điền thông tin như sau:
| Trường | Giá trị |
|---|---|
| Subdomain | n8n (hoặc bất kỳ tên nào bạn muốn) |
| Domain | Chọn domain của bạn từ danh sách |
| Type | HTTP |
| URL | localhost:5678 |
Kết quả: n8n của bạn sẽ được truy cập tại https://n8n.yourdomain.com.
Nhấn Save tunnel để hoàn tất cấu hình.
Thay vì cài đặt cloudflared trực tiếp lên máy, chúng ta sẽ chạy nó như một service trong Docker Compose – gọn gàng và dễ quản lý hơn.
Mở file docker-compose.yaml trong thư mục dự án n8n và thêm service cloudflared vào:
services: n8n: image: n8nio/n8n:latest container_name: n8n restart: unless-stopped ports: - '5678:5678' env_file: - .env volumes: - ./n8n_data:/home/node/.n8n
cloudflared: image: cloudflare/cloudflared:latest container_name: cloudflared restart: unless-stopped command: tunnel --no-autoupdate run --token ${CLOUDFLARE_TUNNEL_TOKEN} depends_on: - n8n💡
depends_on: - n8nđảm bảocloudflaredchỉ khởi động sau khi container n8n đã sẵn sàng.
Mở file .env và thêm dòng sau, dán token bạn đã copy ở Bước 2.3 vào:
N8N_HOST=localhostN8N_PORT=5678N8N_PROTOCOL=http
GENERIC_TIMEZONE=Asia/Ho_Chi_MinhTZ=Asia/Ho_Chi_Minh
N8N_SECURE_COOKIE=false
WEBHOOK_URL=https://n8n.yourdomain.com
CLOUDFLARE_TUNNEL_TOKEN=eyJhIjoiXXXXXXXXXXXXXXXXXXXX...Lưu ý quan trọng:
- Thay
n8n.yourdomain.combằng subdomain thực tế bạn đã cấu hình ở Bước 3.- Thay phần token bằng token thực tế của bạn.
- Không đặt dấu ngoặc kép xung quanh token.
Tại thư mục dự án, chạy:
docker compose downdocker compose up -dDocker sẽ tải image cloudflare/cloudflared và khởi chạy cả hai container. Quá trình kết nối tunnel thường mất 10–30 giây.
docker compose logs cloudflaredNếu thấy dòng tương tự như bên dưới, tunnel đã kết nối thành công:
INF Connection registered connIndex=0 ...INF Connection registered connIndex=1 ...Quay lại Zero Trust → Networks → Tunnels. Tunnel n8n-local của bạn sẽ hiển thị trạng thái Healthy màu xanh lá.
Mở trình duyệt và truy cập:
https://n8n.yourdomain.comNếu giao diện đăng nhập n8n xuất hiện với biểu tượng ổ khóa HTTPS màu xanh trên thanh địa chỉ – chúc mừng, bạn đã self-hosted n8n thành công với Cloudflare Tunnel! 🎉
n8n/├── .env ← Chứa cấu hình và CLOUDFLARE_TUNNEL_TOKEN├── docker-compose.yaml ← Định nghĩa cả service n8n và cloudflared└── n8n_data/ ← Tự sinh ra, lưu database và workflow| Vấn đề với ngrok | Giải pháp với Cloudflare Tunnel |
|---|---|
| URL thay đổi mỗi lần restart | URL cố định vĩnh viễn |
Phải update WEBHOOK_URL mỗi lần | Cấu hình một lần, dùng mãi |
| Phải restart Docker sau mỗi lần ngrok thay URL | Hoàn toàn tự động, không cần thao tác thủ công |
| Terminal ngrok phải mở liên tục | cloudflared chạy ngầm trong Docker, tự khởi động cùng máy |
Bảo mật token tunnel
File .env chứa token Cloudflare có quyền điều khiển tunnel của bạn. Đừng commit file này lên Git hay chia sẻ công khai. Hãy thêm .env vào .gitignore nếu bạn dùng Git.
Máy tính vẫn phải bật Cloudflare Tunnel chỉ là cầu nối – n8n vẫn chạy trên máy local. Nếu máy tắt hoặc Docker dừng, n8n sẽ không thể truy cập được từ bên ngoài.
Không mở port trực tiếp Cloudflare Tunnel không yêu cầu bạn mở port trên router hay firewall. Mọi kết nối đều đi qua đường hầm ra ngoài từ máy bạn – đây là lợi thế bảo mật lớn so với việc cấu hình port-forwarding thủ công.
Sao lưu dữ liệu
Toàn bộ workflow và credentials nằm trong thư mục n8n_data. Hãy backup thư mục này thường xuyên.
Với URL cố định và SSL chuẩn, bạn giờ có thể tích hợp n8n với các dịch vụ đòi hỏi Webhook URL không thay đổi:
- Stripe Webhook – Nhận thông báo thanh toán tự động theo thời gian thực.
- GitHub/GitLab Actions – Trigger workflow khi có code mới được push lên repo.
- Notion Database Trigger – Phản ứng khi dữ liệu trong Notion thay đổi.
- Telegram/Discord Bot – Bot có thể nhận lệnh và phản hồi 24/7 (miễn máy bạn không tắt).
- AI Content Pipeline – Thu thập dữ liệu qua Webhook → Xử lý bằng OpenAI/Gemini/Claude → Tự động đăng lên website.
Mô hình Docker Local + Cloudflare Tunnel đã giải quyết được hầu hết nhược điểm của ngrok và phù hợp cho phần lớn nhu cầu cá nhân. Tuy nhiên, hãy cân nhắc nâng cấp lên VPS khi:
- Cần hệ thống hoạt động 24/7 thực sự, không phụ thuộc vào máy tính cá nhân.
- Khối lượng công việc lớn, cần tài nguyên (CPU/RAM) chuyên biệt.
- Triển khai cho môi trường production của doanh nghiệp với yêu cầu SLA và uptime cao.
Tin vui: khi bạn đã quen với Cloudflare Tunnel, việc chuyển lên VPS cũng rất dễ dàng – chỉ cần cài Docker lên VPS và chạy lại đúng docker-compose.yaml này.
| ngrok | Cloudflare Tunnel | |
|---|---|---|
| Miễn phí | ✅ | ✅ |
| Không cần VPS | ✅ | ✅ |
| URL cố định | ❌ | ✅ |
| SSL tự động | ✅ | ✅ |
| Cần domain riêng | ❌ | ✅ |
| Chạy ngầm trong Docker | ❌ | ✅ |
| Phù hợp dùng lâu dài | ❌ | ✅ |
Với Cloudflare Tunnel, bạn đã có một hệ thống self-hosted n8n thực sự ổn định, bảo mật và chuyên nghiệp – tất cả hoàn toàn miễn phí, chỉ với chi phí duy nhất là tên miền khoảng vài chục nghìn đồng mỗi năm.
Chúc các bạn thiết lập thành công và hẹn gặp lại ở bài viết tới! 🚀