Bot trả lời mọi tin nhắn cho đến khi bạn đóng nắp laptop, rồi người dùng không còn nhận được phản hồi. Một VPS nhỏ giải quyết việc này với vài đô la mỗi tháng. VPS tốt nhất cho bot Telegram phụ thuộc vào cách bot nhận bản cập nhật: bot hỏi Telegram, hoặc Telegram gửi chúng đến bot.
Lựa chọn đó quyết định cổng, chứng chỉ cần dùng và có cần kết nối IPv4 công cộng hay không.
Phiên bản ngắn gọn
- Với một bot trên một VPS, hãy dùng long polling. Không cần tên miền, chứng chỉ hay mở cổng nhận kết nối.
- Webhook cần HTTPS trên cổng 443, 80, 88 hoặc 8443 và địa chỉ IPv4 công cộng. Telegram không gửi webhook qua IPv6.
- 512 MB of RAM is a workable start for one bot with no local database.
- Dùng systemd để duy trì bot, hoặc chính sách khởi động lại của Docker nếu bạn đã triển khai bằng container.
- Chọn nhà cung cấp dựa trên IPv4 và RAM còn dư, không chỉ giá niêm yết.
Polling hay webhook: lựa chọn quyết định yêu cầu máy chủ
Bot Telegram nhận bản cập nhật bằng một trong hai cách. Với long polling, bot gọi getUpdates và Telegram giữ yêu cầu mở cho đến khi có cập nhật hoặc hết thời gian chờ, nên mọi kết nối đều bắt đầu từ máy chủ của bạn. Với webhook, bạn đăng ký URL một lần bằng setWebhook, rồi Telegram gửi từng cập nhật bằng POST qua HTTPS.
| Yêu cầu | Long polling (getUpdates) |
Webhook (setWebhook) |
|---|---|---|
| Cổng nhận kết nối | Không cần; chỉ gửi yêu cầu ra ngoài | HTTPS trên 443, 80, 88 hoặc 8443 |
| IPv4 công cộng | Không bắt buộc | Bắt buộc; webhook không hỗ trợ IPv6 |
| Tên miền và chứng chỉ | Không cần | Cần chứng chỉ; thường dùng tên miền, nhưng chứng chỉ tự ký có thể dùng IP làm CN |
| Tiến trình | Chạy liên tục | Liên tục trả lời yêu cầu HTTPS |
Cột webhook tuân theo yêu cầu webhook của Telegram.
Để biết bot dùng cách nào, hãy truy vấn Bot API:
curl "https://api.telegram.org/bot<YOUR_TOKEN>/getWebhookInfo"
Nếu phản hồi chứa "url":"", webhook chưa được cấu hình nên bot có thể dùng long polling. bot.start() của grammY mặc định dùng long polling; python-telegram-bot dùng run_polling() hoặc run_webhook().
Với một bot trên VPS riêng, tôi chọn polling; đó cũng là khuyến nghị mặc định của grammY. Webhook phù hợp hơn khi máy đã có reverse proxy (máy chủ web chuyển tiếp yêu cầu HTTPS đến bot), khi nhiều bot dùng chung một điểm cuối HTTPS, hoặc trên nền tảng serverless. Với cách đó, Caddy lấy và gia hạn chứng chỉ mà không cần tác vụ cron.
Một lần gián đoạn ngắn làm tin nhắn đến chậm chứ không mất. Theo quy tắc cập nhật của Bot API, với cả hai cách, Telegram lưu cập nhật tối đa 24 giờ cho đến khi bot nhận được, và thử lại các yêu cầu webhook thất bại trước khi từ bỏ.
Nếu webhook trực tiếp chiếm riêng cổng, hãy giới hạn cổng đó theo các dải nguồn Telegram công bố. Nếu reverse proxy phục vụ cả các trang khác dùng chung cổng 443, chỉ hạn chế đường dẫn webhook hoặc dùng token bí mật của Telegram thay vì chặn mọi lưu lượng HTTPS khác. Hướng dẫn webhook liệt kê hai dải nguồn và cảnh báo chúng có thể thay đổi. Khi dùng UFW làm tường lửa máy chủ:
sudo ufw allow 22/tcp # keep SSH open before you enable the firewall
sudo ufw allow proto tcp from 149.154.160.0/20 to any port 443
sudo ufw allow proto tcp from 91.108.4.0/22 to any port 443
sudo ufw allow 80/tcp # if your HTTPS setup uses HTTP validation or redirects HTTP to HTTPS
sudo ufw enable
Đổi 443 nếu webhook lắng nghe trên 80, 88 hoặc 8443. Các quy tắc này bảo vệ bot chạy trực tiếp trên máy chủ. Tài liệu tường lửa Docker cho biết cổng được công bố bỏ qua UFW, nên container webhook khởi chạy với -p 443:443 vẫn mở cho mọi người. Đồng thời đặt secret_token trong setWebhook. Telegram gửi lại giá trị này trong tiêu đề X-Telegram-Bot-Api-Secret-Token của mọi yêu cầu, và trình xử lý phải từ chối yêu cầu thiếu nó.
Duy trì bot hoạt động: systemd hoặc Docker
Chạy bot Telegram 24/7 nghĩa là phải khởi động lại sau khi lỗi hoặc máy khởi động lại. Trên VPS, systemd làm việc đó; Docker cũng làm được nếu bot được đóng gói thành image.
Unit systemd là tệp cấu hình ngắn cho hệ thống init biết cách khởi động và khởi động lại chương trình. Tạo /etc/systemd/system/telegram-bot.service:
[Unit]
Description=Telegram bot
After=network-online.target
Wants=network-online.target
[Service]
User=bot
WorkingDirectory=/opt/bot
EnvironmentFile=/opt/bot/.env
ExecStart=/opt/bot/venv/bin/python bot.py
# Node: ExecStart=/usr/bin/node bot.js
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Đặt token trong tệp .env ở thư mục dự án dưới dạng BOT_TOKEN=..., rồi đọc bằng os.environ["BOT_TOKEN"] (Node: process.env.BOT_TOKEN) để không đưa token vào mã nguồn. Sau đó chép dự án vào đúng vị trí và khởi chạy:
sudo mkdir -p /opt/bot
sudo cp -r ~/your-bot/. /opt/bot/ # your project, after git clone or scp from your machine; include .env and requirements.txt
sudo apt install -y python3-venv # Debian/Ubuntu
sudo useradd --system --no-create-home bot
sudo chown -R bot:bot /opt/bot
sudo -u bot python3 -m venv /opt/bot/venv
sudo -u bot /opt/bot/venv/bin/pip install -r /opt/bot/requirements.txt
# Node: skip the venv and pip commands above, then run:
cd /opt/bot && sudo -u bot npm ci
sudo chmod 600 /opt/bot/.env
sudo systemctl daemon-reload
sudo systemctl enable --now telegram-bot
systemctl status telegram-bot # look for: Active: active (running)
sudo journalctl -u telegram-bot -f # follow the bot's logs
Theo hướng dẫn systemd.service, Restart=always khởi động lại bot dù thoát bình thường hay gặp lỗi; on-failure bỏ qua trường hợp thoát bình thường. RestartSec=5 tạo khoảng cách giữa các lần thử, còn WantedBy=multi-user.target kết hợp enable cho bot chạy lúc khởi động máy. Nếu bot liên tục khởi động lại, sudo journalctl -u telegram-bot -n 50 hiển thị traceback. Trước tiên hãy kiểm tra có thiếu BOT_TOKEN không.
Cách tương đương trong Docker chỉ cần một cờ:
docker run -d --name telegram-bot --restart unless-stopped --env-file .env your-bot-image
docker logs -f telegram-bot
Trong Compose, dùng dòng restart: unless-stopped. Tài liệu chính sách khởi động lại của Docker cho biết container chạy lại khi thoát hoặc khi daemon khởi động lại, nhưng không tự chạy lại sau khi bạn chủ động dừng. Điều này cũng xử lý việc máy khởi động lại nếu Docker tự chạy lúc boot, vốn là mặc định trên Debian và Ubuntu. Trên hệ thống khác, chạy sudo systemctl enable docker.service.
Nguyên tắc của tôi: một script trên máy nhỏ thì dùng systemd để không có daemon phụ chiếm bộ nhớ. Nếu đã tạo image hoặc chạy container khác, hãy dùng Docker và tính đến phần RAM mà daemon chiếm dụng.
Cả hai công cụ đều không báo khi bot ngừng hoạt động. Giám sát push của Uptime Kuma trên máy chủ thứ hai có thể làm việc đó. Bot gọi URL giám sát theo lịch, và Uptime Kuma báo qua Telegram khi các lần gọi dừng lại.
Hạn chế của hosting miễn phí và máy chủ tại nhà
Render cho dịch vụ web miễn phí ngủ sau 15 phút không có lưu lượng đến; tài liệu gói miễn phí của Render cho biết mất khoảng một phút để đánh thức. Bot polling không nhận lưu lượng đến nên bị dừng. Bot webhook được đánh thức bởi POST của Telegram, nhưng phải khởi động nguội sau thời gian yên ắng. Vì vậy hosting miễn phí có phù hợp với bot Telegram hay không phụ thuộc vào phương thức bot dùng.
Hướng dẫn grammY liệt kê các nền tảng serverless là lựa chọn phù hợp cho webhook, trong khi long polling cần máy chạy suốt ngày đêm. Fly.io tính phí theo sử dụng và yêu cầu lưu thông tin thẻ.
Raspberry Pi hoặc PC cũ có thể chạy bot polling chừng nào máy, nguồn điện và kết nối còn hoạt động. Webhook tại nhà cũng cần địa chỉ công cộng và chuyển tiếp cổng. Với bot sở thích, cả hai cách miễn phí đều có thể đủ dùng.
VPS hỗ trợ cả hai phương thức với mức phí tháng cố định.
So sánh năm nhà cung cấp VPS cho bot Telegram
Bảng so sánh năm gói trả phí khởi điểm cho bot Telegram theo giá tháng quảng cáo trước thuế, tính đến tháng 10/2026. Giá khuyến mãi được ghi rõ khi áp dụng.
| Nhà cung cấp | Thông số gói khởi điểm | Giá tháng | IPv4 công cộng | Thanh toán |
|---|---|---|---|---|
| Cloudzy | 1 vCPU (AMD EPYC), 512 MB DDR5, 20 GB NVMe, lưu lượng 1 TB | Khuyến mãi $2.48 (thông thường $4.95) | Có sẵn, kèm IPv6 | Theo giờ hoặc tháng |
| DigitalOcean | 1 vCPU, 512 MiB, 10 GiB SSD, lưu lượng 500 GiB | Từ $4 | Có sẵn | Theo giây, tối đa bằng giá tháng |
| Vultr | 1 vCPU, 512 MB, 10 GB SSD, lưu lượng 512 GB | Chỉ IPv6: từ $2.50; có IPv4: từ $3.50 | Chỉ có trong gói $3.50 | Theo giờ hoặc tháng |
| Hetzner (Đức/Phần Lan) | 2 vCPU, 4 GB, 40 GB SSD, lưu lượng 20 TB | Từ €5.49 chưa VAT | Thêm từ €0.50/tháng chưa VAT (IPv6 miễn phí) | Theo giờ, tối đa bằng giá tháng |
| Linode (Akamai) | 1 vCPU, 1 GB, lưu trữ 25 GB, lưu lượng 1 TB | Từ $5 | Có sẵn | Theo giờ hoặc tháng |
Gói chỉ IPv6 của Vultr không có IPv4, còn giá Hetzner chưa gồm địa chỉ IPv4. Không có IPv4 thì cả hai đều không nhận được webhook.
Bot polling có thể chỉ dùng IPv6 vì api.telegram.org có địa chỉ IPv6. Mọi đích khác bot truy cập cũng phải có, bao gồm kho gói, máy chủ Git và từng API mà bot gọi. Kiểm tra từng máy chủ trước khi chọn:
dig +short AAAA api.telegram.org
dig +short AAAA github.com
dig +short AAAA pypi.org # repeat for every host your bot or its installs reach
Kết quả trống nghĩa là máy chủ đó không có địa chỉ IPv6.
512 MB có đủ cho bot Telegram không?
Tôi sẽ bắt đầu với 512 MB cho một bot không có cơ sở dữ liệu cục bộ. Tài liệu python-telegram-bot không nêu yêu cầu bộ nhớ. Điều quyết định là những gì dùng chung máy: hệ điều hành, daemon Docker nếu có, và cơ sở dữ liệu cục bộ. Hãy đo thực tế.
free -m # "available" is your headroom; the Swap row shows swap use
ps -o rss,cmd -p "$(systemctl show -p MainPID --value telegram-bot)" # bot's resident memory, in KB
docker stats --no-stream # per-container memory, if the bot runs in Docker
journalctl -k | grep -i "out of memory" # kernel OOM kills
OOM kill là việc kernel kết thúc tiến trình để giải phóng RAM khi thiếu bộ nhớ. systemd khởi động lại bot nên dòng nhật ký đó có thể là bằng chứng duy nhất. Nâng lên 1 GB khi xuất hiện OOM kill, swap được dùng thường xuyên, hoặc trước khi thêm cơ sở dữ liệu cục bộ hay bot thứ hai.
Nên chọn gói nào
Với một bot, tôi chọn gói 512 MB có sẵn IPv4 công cộng. Sau đó chọn nhà cung cấp theo giá, tài nguyên dư và vị trí người dùng.
- Giá tháng thấp nhất hiện tại: Cloudzy $2.48 trong đợt giảm 50%, có cả IPv4 và IPv6.
- Giá có IPv4 thấp nhất hiện tại: Cloudzy $2.48 trong đợt khuyến mãi, có IPv4 riêng và IPv6.
- 1 GB of headroom for Docker or a small database: Linode, from $5 a month.
- Nhiều bot hoặc cơ sở dữ liệu, người dùng ở châu Âu: Hetzner, có nhiều tài nguyên nhất trên mỗi euro trong bảng này khi gói còn hàng (gói này được ghi là không khả dụng vào tháng 10/2026). Cộng phí IPv4 nếu dùng webhook.
- Nhiều dung lượng đĩa và lưu lượng hơn ở mức 512 MB: Cloudzy. Trong các gói 512 MB, gói này có lưu trữ lớn nhất (20 GB NVMe so với 10 GB) và lưu lượng nhiều nhất (1 TB so với khoảng 500 GB), kèm IPv4 và IPv6. Với giá khuyến mãi hiện tại, Cloudzy cũng rẻ hơn các gói khởi điểm khác trong so sánh này.
Với giá khuyến mãi hiện tại, Cloudzy kết hợp mức phí tháng thấp nhất trong so sánh này với dung lượng lưu trữ và lưu lượng lớn hơn các gói 512 MB còn lại. Gói 512 MB của Cloudzy tính phí theo giờ và có bảo đảm hoàn tiền 14 ngày, nên bạn có thể chạy thử bot vài ngày trước khi quyết định. Chọn vị trí gần người dùng nhất, triển khai VPS Linux của Cloudzy, rồi thêm unit systemd ở trên.
Câu hỏi thường gặp
VPS rẻ nhất có thể chạy bot Telegram là gì?
Tính đến tháng 10/2026, gói 512 MB của Cloudzy rẻ nhất trong năm gói, ở mức $2.48/tháng trong đợt giảm 50%, kèm IPv4 riêng và IPv6. Giá thường là $4.95/tháng. Lựa chọn chỉ IPv6 của Vultr có giá khởi điểm hơi cao hơn, từ $2.50.
Vì sao webhook Telegram cần HTTPS?
Theo hướng dẫn webhook, Telegram yêu cầu SSL/TLS cho webhook bất kể cổng nào. Dịch vụ từ chối HTTP thường và chấp nhận TLS 1.2 trở lên. Không có TLS, mỗi POST sẽ truyền tin nhắn người dùng không mã hóa. Có thể dùng chứng chỉ Let's Encrypt hoặc chứng chỉ tự ký tải lên bằng setWebhook.
Bot Telegram có chạy được với RAM 512 MB không?
Thường là có, với một bot không có cơ sở dữ liệu cục bộ. Theo dõi nhật ký kernel để phát hiện tiến trình bị kết thúc do thiếu bộ nhớ, rồi nâng lên 1 GB nếu có hoặc khi thêm cơ sở dữ liệu.
Làm sao giữ bot Telegram hoạt động sau khi khởi động lại máy?
Bật dịch vụ systemd bằng sudo systemctl enable --now telegram-bot, hoặc chạy container với --restart unless-stopped và bật docker.service để Docker chạy lúc máy khởi động.
Telegram có giới hạn tốc độ bot theo địa chỉ IP không?
FAQ của Telegram về giới hạn bot mô tả giới hạn theo bot và cuộc trò chuyện; không nên xem chuyển máy chủ là cách vượt qua giới hạn. Khi vượt mức, API trả về HTTP 429 kèm giá trị retry_after. Đợi số giây đó trước khi thử lại.
Nên chọn khu vực máy chủ nào cho bot Telegram?
Chọn vị trí gần người dùng và các dịch vụ bot gọi nhất, rồi đo thời gian kết nối từ từng nơi bằng curl -o /dev/null -s -w '%{time_connect}\n' https://api.telegram.org.
Thảo luận
Bình luận
Đăng nhập để tham gia thảo luận.