Chuyển đến nội dung chính
Slow Life

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.

Hướng dẫn 9 phút đọc
Cloudflare Tunnel
Cloudflare Tunnel

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ìnhThấp hơn (CDN Cloudflare toàn cầu)
Giới hạn kết nốiCó (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 choTest nhanh, thử nghiệmDù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.vn hoặc .id.vn hiệ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ầuChi 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ềnMột domain bất kỳ đã được chuyển nameserver về Cloudflare
Tài khoản CloudflareMiễ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.

  1. Đăng nhập vào Cloudflare Dashboard.
  2. Nhấn Add a Site và nhập tên miền của bạn.
  3. 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.
  4. 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.


  1. 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).
  2. 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.
  3. Chọn gói Free và xác nhận.

  1. Trong Zero Trust Dashboard, vào NetworksTunnels.
  2. Nhấn Create a tunnel.
  3. Chọn Cloudflared làm connector type → Nhấn Next.
  4. Đặ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ư:

Terminal window
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ườngGiá trị
Subdomainn8n (hoặc bất kỳ tên nào bạn muốn)
DomainChọn domain của bạn từ danh sách
TypeHTTP
URLlocalhost: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ảo cloudflared chỉ 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=localhost
N8N_PORT=5678
N8N_PROTOCOL=http
GENERIC_TIMEZONE=Asia/Ho_Chi_Minh
TZ=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.com bằ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:

Terminal window
docker compose down
docker compose up -d

Docker 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.


Terminal window
docker compose logs cloudflared

Nế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 TrustNetworksTunnels. 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.com

Nế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 ngrokGiải pháp với Cloudflare Tunnel
URL thay đổi mỗi lần restartURL cố định vĩnh viễn
Phải update WEBHOOK_URL mỗi lầnCấu hình một lần, dùng mãi
Phải restart Docker sau mỗi lần ngrok thay URLHoàn toàn tự động, không cần thao tác thủ công
Terminal ngrok phải mở liên tụccloudflared 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.


ngrokCloudflare 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! 🚀

Bình luận