Chào anh em,
Trước đây mình có chia sẻ việc tự dựng một hệ thống automation nho nhỏ để phục vụ công việc.
Các giải pháp webapp như Power Automate, Zapier, Make, n8n… thì khá tiện nhưng tốn phí hàng tháng. Tự dựng server nội bộ thì ngoài chi phí nhân sự còn kéo theo nhiều thứ phức tạp. Dùng ngrok bản miễn phí trên máy cá nhân lại bất tiện vì mỗi lần restart là đổi link (và với mình thì setup cũng không thật sự nhẹ nhàng như nhiều bài review).
Nếu anh em cũng đang mắc ở chỗ này thì câu trả lời ngắn gọn là: có cách khác, và không tốn tiền.
Trong bài này, mình chia sẻ cách biến chính máy tính bàn/laptop thành một “server” chạy ổn định, truy cập từ Internet bằng tên miền công ty (ví dụ: webhook.congty.com) thông qua Cloudflare Tunnel.
Không cần mở port modem, không lộ IP, bảo mật ổn và đủ dùng cho các nhu cầu automation nội bộ.
Dưới đây là toàn bộ quá trình mình tự mày mò và triển khai. Anh em nào muốn tiết kiệm chi phí vận hành có thể tham khảo và làm theo.
PHẦN 1: TẠI SAO LẠI LÀ CLOUDFLARE TUNNEL?
Trước đây, khi cần cho một phần mềm chạy trên máy tính (localhost) nhận request từ bên ngoài – ví dụ Microsoft Teams hay Google Sheets – cách phổ biến nhất là dùng ngrok.
- Ngrok tiện, nhưng có vài điểm bất cập: link dài và khó nhớ, bản miễn phí thì mỗi lần restart lại đổi URL, dùng lâu khá thiếu ổn định và không phù hợp cho môi trường làm việc nghiêm túc.
- Với Cloudflare Tunnel, cách làm khác hẳn. Bạn tạo một kết nối ngược (tunnel) từ máy của mình lên hạ tầng Cloudflare. Từ đó, bạn có thể dùng một URL cố định như
https://webhook.skyperry.com, trỏ thẳng vào ứng dụng đang chạy trên máy cá nhân. - Kết nối này hoạt động ổn định 24/7, không cần mở port modem, không lộ IP thật, và đủ an toàn để dùng cho các webhook hoặc hệ thống automation nội bộ.
PHẦN 2: CHUẨN BỊ “ĐỒ NGHỀ”
-
Một máy tính: Để ở văn phòng, chạy 24/7 càng tốt (hoặc máy laptop cá nhân để test).
-
Docker Desktop: Tải về và cài đặt (đây là cái “hộp” chứa phần mềm n8n).
-
Tên miền: Đã trỏ DNS về Cloudflare (bắt buộc nhé, Cloudflare quản lý DNS free rất ngon).
PHẦN 3: CÁC BƯỚC THỰC HIỆN (CHI TIẾT)
Mình không phải dân IT chuyên, nên chọn cách làm gọn nhất: Gộp tất cả vào 1 file cài đặt.
Bước 1: Lấy Token từ Cloudflare
-
Chọn Networks -> Tunnels -> Create a Tunnel.
-
Đặt tên (ví dụ:
n8n-office) -> Save. -
Ở bước “Install connector”, bạn sẽ thấy một đoạn mã dài. Hãy Copy đoạn token (chuỗi ký tự lằng ngoằng sau chữ
-thoặctoken:). Lưu cái này lại bí mật nhé. -
Bấm Next. Tại tab Public Hostnames:
-
Subdomain:
webhook(hoặc tên bạn thích). -
Domain:
skyperry.com(tên miền của bạn). -
Service: Chọn
HTTPvà URL làn8n:5678(Lưu ý: điền y chang vậy, đừng điền localhost).
-
-
Save Tunnel.
Bước 2: Tạo file “Thần Thánh” (docker-compose.yml)
Trên máy tính, mình tạo một thư mục tên MyAutomation, bên trong tạo một file tên là docker-compose.yml và dán nội dung này vào.
Lưu ý: Đây là đoạn code mình đã tinh chỉnh để n8n và Cloudflare tự kết nối với nhau, anh em chỉ cần thay Token vào thôi.
YAML
version: '3'
services:
# 1. Đây là n8n - Bộ não xử lý
n8n:
image: n8nio/n8n:latest
container_name: n8n-local
restart: always
ports:
- "5678:5678"
environment:
- N8N_HOST=webhook.skyperry.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://webhook.skyperry.com/
- GENERIC_TIMEZONE=Asia/Ho_Chi_Minh
volumes:
- n8n_data:/home/node/.n8n
# 2. Đây là Cloudflare Tunnel - Người vận chuyển
tunnel:
image: cloudflare/cloudflared:latest
container_name: cf-tunnel
restart: always
command: tunnel run
environment:
# Dán cái Token dài ngoằng bạn lấy ở Bước 1 vào đây
- TUNNEL_TOKEN=eyJhIjoiO... (Dán token của bạn vào đây)
depends_on:
- n8n
volumes:
n8n_data:
Bước 3: Kích hoạt hệ thống
Mở Terminal (hoặc windown + R và CMD) tại thư mục đó và gõ đúng 1 lệnh:
docker-compose up -d
Đợi khoảng 1-2 phút. Xong! Giờ đây, bạn truy cập https://webhook.skyperry.com từ bất kỳ đâu trên thế giới, nó sẽ trỏ thẳng về n8n đang chạy trên máy tính của bạn. Cảm giác nó “phê” lắm các bác ạ!
PHẦN 4: KẾT NỐI “HỆ SINH THÁI” MICROSOFT (NẠP TRÍ TUỆ CHO BOT)
Vì công ty dùng “full option” bộ Microsoft 365, nên mình chọn cách chính thống nhất là tạo Bot qua Azure. Nghe “Azure” thì có vẻ đao to búa lớn, kỹ thuật cao siêu, nhưng thực ra nó chỉ là nơi để mình đăng ký cái “giấy khai sinh” cho con Bot thôi.
Làm cách này có cái hay là bảo mật tuyệt đối, đúng chuẩn doanh nghiệp, và quan trọng là… nó miễn phí (với nhu cầu nội bộ).
Bước 1: “Làm giấy khai sinh” trên Azure
-
Truy cập vào Azure Portal bằng tài khoản công ty (dĩ nhiên là quyền admin).
-
Tìm kiếm từ khóa “Azure Bot” và bấm Create.
-
Đặt tên cho bot (ví dụ:
Skyperry-Core), chọn loại Multi Tenant (hoặc Single Tenant tùy cấu hình công ty). -
Quan trọng: Sau khi tạo xong, Azure sẽ cấp cho mình 2 cái chìa khóa:
Microsoft App IDvàClient Secret. Các bác nhớ lưu kỹ 2 mã này, lát nữa sẽ đưa cho n8n để nó có quyền trả lời tin nhắn.
Bước 2: Nối Webhook
Đây là bước kết nối cái tên miền webhook.skyperry.com (đã làm ở phần trước) vào Azure.
-
Trong trang cấu hình Azure Bot, tìm mục Configuration.
-
Ở dòng Messaging endpoint, dán đường dẫn n8n vào. Dạng nó sẽ như này:
https://webhook.skyperry.com/webhook/duong-dan-cua-ban -
Bấm Save. Vậy là xong! Giờ ai nhắn gì cho Bot trên Teams, Azure sẽ chuyển thẳng tin nhắn đó về máy tính.
Bước 3: Mở cổng Microsoft Teams
-
Vẫn trong Azure Bot, chọn mục Channels.
-
Bấm vào logo Microsoft Teams -> Chọn Agree -> Save.
-
Vậy là con bot đã chính thức có mặt trên mạng lưới Teams của công ty.
Bước 4: Nạp logic xử lý (Javascript Parser)
Khi tin nhắn chạy về đến n8n, nó vẫn là một mớ dữ liệu thô. Sau đó, dùng node Code trong n8n để phân loại xem nhân viên đang muốn gì.
Dưới đây là đoạn code Javascript mà mình dùng để “dạy” bot hiểu lệnh:
// Code Javascript trong n8n để phân loại tin nhắn
for (const item of items) {
const body = item.json.body;
// Mặc định: Chưa hiểu lệnh
item.json.inputType = 'unknown';
item.json.projectId = null;
// TRƯỜNG HỢP 1: Nhân viên gõ lệnh text (Ví dụ: "report ex25xxx")
if (body.text && !body.value) {
const parts = body.text.trim().split(/\s+/);
// Tự động viết hoa lệnh để so sánh (ví dụ: report -> REPORT)
const cmd = parts[0] ? parts[0].toUpperCase() : '';
if (cmd === 'REPORT') {
item.json.inputType = 'command';
// Tự động viết hoa mã dự án (ex25xxx -> EX25xxx) cho chuẩn data
item.json.projectId = parts[1] ? parts[1].toUpperCase() : null;
}
}
// TRƯỜNG HỢP 2: Nhân viên bấm nút (Tương tác trên Adaptive Card)
else if (body.value) {
item.json.inputType = 'button_click';
item.json.projectId = body.value.projectId; // Lấy mã dự án ẩn trong nút
item.json.userChoice = body.value.action; // Lấy hành động (xem KPI, xem Budget...)
}
}
return items;
KẾT QUẢ: TRẢI NGHIỆM THỰC TẾ CỦA ANH EM CÔNG TY
Sau khi setup xong xuôi, giờ đây các thành viên trong công ty có thể tương tác với “CTO ảo” ngay trên Microsoft Teams (cả điện thoại và máy tính) cực kỳ tiện lợi:
-
Gõ lệnh trực tiếp: Muốn xem nhanh tình hình dự án, anh em chỉ cần chat:
report ex2509xxx. Bot sẽ tự hiểu, tra cứu SharePoint và trả về các lựa chọn. -
Bấm nút chọn (Interactive Buttons): Thay vì phải nhớ cú pháp phức tạp, Bot sẽ hiện ra các nút bấm đẹp mắt như:
📅 Tiến độ,💰 Ngân sách,📊 KPI. Chỉ cần bấm “bộp” một cái là số liệu hiện ra ngay. -
Điền Form nhanh (Adaptive Cards): Sắp tới mình còn định nâng cấp để anh em điền xin nghỉ phép hay báo cáo ngày ngay trong khung chat của Bot, không cần mở web hay điền form nữa.
Từ một người không chuyên, tâm sự với AI, và tận dùng kết hợp Cloudflare Tunnel và hệ sinh thái Microsoft có sẵn, mình đã tạo ra được một trợ lý ảo đắc lực với chi phí gần như bằng 0.
Công nghệ không hề xa vời, nhưng nếu SME với ngân sách thấp mà vẫn muốn tối ưu vận hành, có thể mở rộng được trong tương lai thì chắc chắn là phải thử rồi. Mình trước giờ dùng automation nội bộ, nay vọc vạch môn n8n thấy tốn thời gian (vì nó hay quá), nên bạn nào cũng muốn thử thì liên hệ mình cùng thử chung nhé!!














