AI Automation

Tạo bot Telegram tự động bằng n8n trong 30 phút

Bạn có một Telegram bot nhưng muốn nó tự động trả lời tin nhắn, ghi log vào Google Sheets, gửi thông báo lỗi server hay thậm chí restart service khi có lệnh? Với n8n, nền tảng automation mã nguồn mở, bạn có thể làm tất cả điều đó mà không cần viết dòng code Python nào. Bài viết này hướng dẫn bạn từ con số 0: tạo bot trên Telegram, cài n8n trên VPS Ubuntu 24.04 bằng Docker Compose, và chạy workflow tự động đầu tiên. Tổng thời gian: dưới 30 phút nếu bạn đã có sẵn VPS.

Tóm tắt nhanh những gì bạn sẽ làm

  • Tạo bot Telegram qua BotFather và lấy token API.
  • Cài n8n trên VPS bằng Docker Compose (bản mới nhất 2026).
  • Cấu hình webhook để Telegram gửi tin nhắn vào n8n.
  • Xây workflow nhận tin nhắn, xử lý và trả lời tự động.
  • Chạy thử và kiểm tra bot còn sống.

Toàn bộ hướng dẫn này chạy trên VPS Ubuntu 24.04 với Docker và Docker Compose đã cài sẵn. Nếu bạn chưa có VPS, có thể tham khảo dịch vụ thuê VPS Linux có full root để tự do cài đặt.

Yêu cầu trước khi bắt đầu

  • Một VPS chạy Ubuntu 24.04 LTS với quyền sudo. Mình khuyên dùng gói VPS tối thiểu 2 GB RAM (n8n + Docker + workflow chạy ổn định).
  • Docker và Docker Compose (v2) đã cài sẵn. Nếu chưa, chạy lệnh: sudo apt update && sudo apt install docker.io docker-compose-v2 -y.
  • Tài khoản Telegram để tạo bot.
  • Domain hoặc subdomain trỏ về IP VPS để nhận webhook (Telegram yêu cầu HTTPS). Nếu chưa có, dùng ngrok tạm thời cho bước test.

Bước 1, Tạo bot Telegram và lấy token

Mở Telegram, tìm BotFather (tài khoản chính thức của Telegram để quản lý bot). Gõ lệnh /newbot và làm theo hướng dẫn: đặt tên bot (vd "My Test Bot"), sau đó đặt username kết thúc bằng "bot" (vd "my_test_123_bot"). BotFather sẽ trả về một token dạng 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11. Lưu token này vào đâu đó an toàn, bạn sẽ dùng nó để kết nối n8n với Telegram API.

Verify: Test thử bot còn sống bằng curl. Trên VPS, chạy:

curl -s "https://api.telegram.org/bot<THAY_BANG_TOKEN_THAT>/getMe"

Kết quả trả về JSON có "ok": true và tên bot của bạn là thành công.

Bước 2, Cài n8n trên VPS bằng Docker Compose

SSH vào VPS với user sudo. Tạo thư mục làm việc:

mkdir ~/n8n && cd ~/n8n

Tạo file docker-compose.yml:

nano docker-compose.yml

Dán nội dung sau:

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      - N8N_SECURE_COOKIE=false
      - N8N_HOST=<domain-cua-ban.com>
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://<domain-cua-ban.com>/
      - N8N_ENCRYPTION_KEY=<tao-key-32-ky-tu>
    volumes:
      - ./n8n_data:/home/node/.n8n

Giải thích nhanh:

  • N8N_SECURE_COOKIE=false: dùng trong môi trường có reverse proxy xử lý SSL.
  • N8N_HOSTWEBHOOK_URL: domain bạn trỏ về VPS.
  • N8N_ENCRYPTION_KEY: key dài 32 ký tự để mã hóa credential. Tạo bằng: openssl rand -hex 16.
  • Volume ./n8n_data lưu database và dữ liệu workflow.

Chạy container:

docker compose up -d

Verify: Kiểm tra container đã chạy:

docker ps | grep n8n

Bạn sẽ thấy container n8n đang ở trạng thái Up.

Bước 3, Cấu hình reverse proxy với Nginx và SSL (Let's Encrypt)

Telegram yêu cầu webhook phải chạy HTTPS. Cách nhanh nhất là dùng Nginx làm reverse proxy + Certbot. Cài Nginx:

sudo apt install nginx certbot python3-certbot-nginx -y

Tạo file cấu hình cho n8n:

sudo nano /etc/nginx/sites-available/n8n

Nội dung:

server {
    listen 80;
    server_name <domain-cua-ban.com>;

    location / {
        proxy_pass http://127.0.0.1:5678;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_cache_bypass $http_upgrade;
    }
}

Kích hoạt site và lấy SSL:

sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d <domain-cua-ban.com>

Verify: Mở trình duyệt truy cập https://<domain-cua-ban.com>, bạn sẽ thấy giao diện đăng nhập n8n. Đây là lúc bạn tạo tài khoản admin lần đầu.

Bước 4, Thiết lập webhook Telegram trong n8n

Đăng nhập vào n8n. Tạo workflow mới. Ở thanh công cụ bên phải, tìm node Telegram Trigger và kéo vào canvas.

Cấu hình node Telegram Trigger:

  • Credential: Nhấn "Create New". Chọn loại "Telegram API". Dán token bot bạn lấy từ BotFather vào.
  • Trigger: Chọn "message" (nhận mọi tin nhắn) hoặc nếu bạn chỉ muốn nhận lệnh bắt đầu bằng "/", chọn "command".
  • Webhook URL: n8n tự động sinh ra một URL dạng https://<domain>/webhook/<UUID>. Copy URL này.

Kích hoạt workflow bằng nút "Active" ở góc trên cùng. Ngay lập tức n8n sẽ tạo webhook trên Telegram API, bạn không cần làm gì thêm.

Verify: Gửi một tin nhắn bất kỳ đến bot của bạn. Vào tab "Execution" của workflow trong n8n, bạn sẽ thấy một execution mới xuất hiện với nội dung tin nhắn.

Bước 5, Xây workflow phản hồi tự động

Thêm node Telegram (loại "Send Message") vào sau Telegram Trigger. Kéo dây nối từ trigger sang node này.

Cấu hình Telegram node:

  • Credential: Chọn credential Telegram vừa tạo.
  • Chat ID: Nhấn vào icon "Add Expression" (hình {x}) và chọn {{ $json.message.chat.id }}, đây là ID của người gửi tin nhắn, đảm bảo bot trả lời đúng người.
  • Text: Gõ nội dung bạn muốn bot trả lời, ví dụ: "Cảm ơn bạn đã nhắn tin! Bot đang trong giai đoạn phát triển." Hoặc dùng expression để động: {{ "Bạn vừa nói: " + $json.message.text }}.

Kích hoạt lại workflow nếu nó đang tắt. Gửi tin nhắn "Hello" đến bot, bạn sẽ nhận được câu trả lời ngay lập tức.

NodeChức năngLưu ý
Telegram TriggerNhận tin nhắn từ người dùng qua webhookLuôn để "Active" để webhook tồn tại
Telegram (Send)Gửi tin nhắn trả lờiChat ID lấy từ event gốc, không hardcode

Xử lý lỗi thường gặp

1. Webhook báo lỗi "Bad Request: can't parse entities"
Nguyên nhân: Text chứa ký tự đặc biệt (dấu * _ `) khiến Markdown bị lỗi. Sửa: Trong node Telegram, bỏ chọn "Markdown" ở phần "Additional Fields" nếu bạn không cần format.

2. n8n không nhận được webhook
Kiểm tra log Nginx: sudo tail -f /var/log/nginx/error.log. Nếu thấy lỗi 502, chứng tỏ n8n chưa chạy hoặc chết container: docker logs n8n. Nếu lỗi 429, Telegram đang rate-limit, đợi vài phút và thử lại.

3. Bot trả lời chậm hoặc không trả lời
VPS quốc tế có độ trễ cao đến Telegram server (châu Âu). Nếu VPS của bạn đặt tại Việt Nam, kiểm tra ping: ping api.telegram.org. Nếu latency >300ms, cân nhắc dùng thêm node "Wait" để tránh timeout.

Câu hỏi thường gặp

Bot Telegram của tôi có cần phải public không?

Không. Bot Telegram hoạt động qua API, không cần public IP. Tuy nhiên, webhook của n8n phải có HTTPS và n8n phải chạy trên VPS có thể truy cập từ internet. Bạn có thể dùng VPS có IPv4 riêng Việt Nam để đảm bảo kết nối ổn định.

Tôi có thể xử lý lệnh riêng (ví dụ /start, /help) không?

Có. Trong Telegram Trigger, chọn loại "command". Sau đó thêm node "Switch" để phân luồng dựa vào giá trị $json.message.text. Mỗi nhánh xử lý một lệnh khác nhau.

Làm sao để bot gửi ảnh hoặc file?

Thay vì dùng node "Send Message", dùng node "Telegram" với action "Send Photo" hoặc "Send Document". Bạn cần cung cấp URL công khai của file, hoặc tải file lên Telegram trực tiếp qua node "HTTP Request".

Workflow của tôi có chạy được trên VPS RAM thấp (1 GB) không?

n8n + Docker + Telegram webhook nhẹ, 1 GB RAM chạy được nhưng rất sát. Nếu workflow xử lý nhiều (gọi API, parse dữ liệu lớn), nên dùng VPS 2 GB RAM trở lên. Tham khảo gói VPS Linux có sẵn NVMe để tối ưu I/O.

Tôi muốn bot gửi cảnh báo lỗi server từ VPS đến Telegram thì làm thế nào?

Dùng node "Webhook" trong n8n với phương thức POST thay vì Telegram Trigger. Trên VPS, cài script bash gọi curl đến webhook đó. n8n nhận dữ liệu và gọi Telegram node để gửi tin nhắn.

Bài viết liên quan

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.