# VPS chạy bot Telegram và Discord: cấu hình nhỏ mà ổn định

URL: https://cloudj.net/vi/blog/telegram-discord-bot-vps
Published: 2026-11-11 · Updated: 2026-11-11

> Hướng dẫn thuê VPS chạy bot Telegram hoặc Discord: chọn gói nhỏ nhất, giữ bot sống bằng systemd hay pm2, webhook hay polling, và đặt máy chủ ở đâu.

VPS chạy bot Telegram là một trong những máy chủ rẻ mà hữu ích nhất bạn có thể thuê. Phần lớn bot chat chỉ ngồi chờ tin nhắn, xử lý trong chớp mắt rồi lại chờ. Những cách chạy miễn phí hay chạy trên laptop mà nhiều người bắt đầu thường hỏng ở các chi tiết nhàm chán: bot chết khi đóng terminal, ngủ sau một lúc không có ai nhắn, hoặc không tự chạy lại sau khi máy khởi động lại. Bài này đi qua những quyết định thực sự quan trọng khi chạy bot Telegram hoặc Discord trên một VPS nhỏ: nhận update bằng cách nào, máy chủ nhỏ đến đâu là đủ, giữ tiến trình sống ra sao và nên đặt máy chủ ở đâu.

## Quyết định đầu tiên: polling hay webhook

Cách bot nhận update ảnh hưởng tới mọi thứ phía sau, nên hãy chốt điều này trước khi chọn máy chủ.

**Telegram** có hai cách, chỉ dùng được một trong hai cùng lúc:

- **Long polling (`getUpdates`)**: bot liên tục hỏi Telegram xem có tin nhắn mới không. Không cần tên miền, không cần chứng chỉ TLS, không cần mở cổng. Đa số thư viện mặc định dùng cách này.
- **Webhook (`setWebhook`)**: Telegram gửi từng update tới URL của bạn bằng HTTPS POST. Telegram bắt buộc HTTPS và chỉ chấp nhận các cổng 443, 80, 88 và 8443. Bạn cần tên miền (hoặc chứng chỉ cho IP) và một web server đứng trước bot.

Khi đã đặt webhook thì `getUpdates` không hoạt động, nên muốn quay lại polling phải xóa webhook trước.

**Discord** hoạt động khác. Bot Discord thông thường mở một kết nối WebSocket ra ngoài tới gateway của Discord và giữ kết nối đó, nên giống polling, không cần mở cổng inbound. Discord cũng hỗ trợ interactions endpoint qua HTTP cho slash command, hoạt động như webhook và cần URL HTTPS công khai.

Nên chọn cách nào:

| Tình huống | Telegram | Discord |
|---|---|---|
| Một bot, mới bắt đầu | Long polling | Kết nối gateway |
| Nhiều bot trên một máy, hoặc đã có sẵn web app | Webhook sau Nginx | Gateway hoặc interactions endpoint |
| Chưa có tên miền | Long polling | Kết nối gateway |
| Firewall chặt, không muốn mở cổng inbound | Long polling | Kết nối gateway |

Polling không "kém" hơn, chỉ đơn giản hơn. Webhook đáng làm khi bạn đã chạy web server, muốn gom nhiều bot sau một tên miền, hoặc muốn update được đẩy tới thay vì giữ một request mở liên tục.

## VPS chạy bot Telegram cần cấu hình bao nhiêu

Gói nhỏ nhất của Cloudj là 1 vCPU, 1 GB RAM, 20 GB ổ đĩa, đủ cho một bot thông thường viết bằng Python, Node.js hay Go, kể cả khi kèm SQLite hoặc Redis nhỏ. Giá trực tiếp có trên [trang bảng giá](https://cloudj.net/vi/pricing).

Nên chọn cấu hình lớn hơn khi bot làm nhiều hơn trả lời tin nhắn:

- Bot chạy model AI ngay trên máy hoặc xử lý ảnh, âm thanh, video.
- Bot Discord phát voice hay nhạc, tốn CPU và băng thông đều đặn.
- Bot dùng chung máy với database, dashboard và các bot khác.
- Bot phục vụ cộng đồng rất lớn, lệnh dồn dập theo đợt.

Vì có thể tăng CPU, RAM và mở rộng ổ đĩa về sau, bắt đầu bằng gói nhỏ nhất rồi theo dõi biểu đồ CPU, RAM trong console là cách hợp lý. CPU dùng chung ("Availability") hợp với đa số bot; general purpose đáng cân nhắc khi bot phải tính toán thật sự.

## Giữ bot luôn chạy

Bot chạy bằng `python bot.py` trong phiên SSH sẽ chết khi bạn ngắt kết nối. Hãy dùng trình quản lý tiến trình.

### Cách 1: systemd (mọi ngôn ngữ)

systemd có sẵn trên Ubuntu, Debian, AlmaLinux và Rocky Linux, không phải cài thêm gì. Tạo một user riêng và file unit tại `/etc/systemd/system/mybot.service`:

```ini
[Unit]
Description=My Telegram bot
After=network-online.target
Wants=network-online.target

[Service]
User=bot
WorkingDirectory=/home/bot/app
EnvironmentFile=/home/bot/app/.env
ExecStart=/home/bot/app/.venv/bin/python bot.py
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
```

Sau đó bật service và xem log:

```bash
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
journalctl -u mybot -f
```

Để token của bot trong file `.env`, chỉ user `bot` được đọc (`chmod 600`), tuyệt đối không để trong code hay đẩy lên repo.

### Cách 2: pm2 (bot Node.js)

Nếu bot viết bằng Node.js, pm2 lo việc tự khởi động lại, xoay vòng log và cho xem trạng thái nhanh:

```bash
sudo npm install -g pm2
pm2 start bot.js --name mybot
pm2 save
pm2 startup
```

`pm2 startup` in ra một lệnh để bạn chạy bằng `sudo`; lệnh đó giúp pm2 tự chạy lại các tiến trình đã lưu khi máy khởi động. Đừng chạy cùng một bot bằng cả pm2 lẫn systemd, hai bản sẽ tranh nhau nhận update. Chọn một thôi.

## Cài webhook cho bot Telegram

Nếu chọn webhook, hãy đặt Nginx trước bot với chứng chỉ Let's Encrypt (bài [Nginx reverse proxy kèm SSL](https://cloudj.net/vi/blog/nginx-reverse-proxy-ssl-vps) hướng dẫn chi tiết), proxy một đường dẫn bí mật về cổng nội bộ của bot, rồi đăng ký URL:

```bash
curl -X POST "https://api.telegram.org/bot<TOKEN>/setWebhook" \
  -d "url=https://bot.example.com/tg-7f3c9a" \
  -d "secret_token=<chuoi-ngau-nhien>"
```

Từ đó Telegram gửi kèm header `X-Telegram-Bot-Api-Secret-Token` trong mỗi update; hãy từ chối request nào không khớp. Kiểm tra trạng thái bất cứ lúc nào bằng `getWebhookInfo`, phương thức này báo lỗi gần nhất nếu gửi update thất bại.

## Nên đặt máy chủ ở đâu

Với bot chat, tin nhắn đi từ người dùng tới Telegram hoặc Discord trước, rồi mới tới máy chủ của bạn. Vì vậy khoảng cách quan trọng nhất là giữa máy chủ và các dịch vụ bot gọi tới: API của nền tảng, database và các API bên ngoài. Trên thực tế:

- Nếu bot gọi API hay database đặt ở một khu vực cụ thể, hãy đặt bot ở đó.
- Nếu bot có thêm dashboard web hoặc mini app mà người dùng mở trực tiếp, hãy đặt gần họ. Với người dùng Việt Nam và Đông Nam Á, [VPS Singapore](https://cloudj.net/vi/blog/best-vps-singapore) là lựa chọn phổ biến; với cộng đồng ở Bắc Mỹ, xem [VPS Mỹ](https://cloudj.net/vi/blog/best-vps-united-states).
- Nếu không có gì ràng buộc, chọn vị trí gần bạn để thao tác SSH mượt hơn. Cloudj không có máy chủ tại Việt Nam, nên với bot chạy từ Việt Nam hoặc phục vụ nhóm Zalo, khách Việt, Singapore hay Hồng Kông là vị trí gần nhất để bắt đầu.

Bài [hướng dẫn VPS châu Á](https://cloudj.net/vi/blog/asia-vps-guide) và [hướng dẫn VPS châu Mỹ, châu Đại Dương và Israel](https://cloudj.net/vi/blog/americas-oceania-israel-vps-guide) so sánh các khu vực kỹ hơn. Gói tại Singapore và Mỹ có trên trang [Singapore](https://cloudj.net/vi/cloud-servers/singapore) và [Mỹ](https://cloudj.net/vi/cloud-servers/united-states).

Cuối cùng, hãy tuân thủ quy định của từng nền tảng: tôn trọng giới hạn tần suất và điều khoản của Telegram, Discord, và không dùng bot để spam người dùng.

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

### Một VPS nhỏ chạy được nhiều bot không?

Được. Mỗi bot dùng một unit systemd hoặc tên tiến trình pm2 riêng và file token riêng. Theo dõi RAM khi thêm bot.

### Bot Telegram có cần tên miền không?

Chỉ cần khi dùng webhook. Long polling chạy được mà không cần tên miền hay mở cổng inbound.

### Chạy bot nên trả theo giờ hay theo tháng?

Bot chạy suốt tháng, nên trả trước theo kỳ có sẵn băng thông thường đơn giản hơn. Tính giờ hợp với thử nghiệm ngắn; nhớ rằng máy chủ tính giờ vẫn bị tính phí cho tới khi bạn xóa, kể cả khi đã tắt.

### Bot không chạy lại sau khi khởi động lại máy, vì sao?

Nhiều khả năng bot được chạy bằng tay. Hãy dùng `systemctl enable` hoặc `pm2 startup` kèm `pm2 save` để bot tự chạy khi máy khởi động.

## Đưa bot lên máy chủ

Triển khai gói nhỏ nhất tại vị trí phù hợp với người dùng trong [console Cloudj](https://app.cloudj.net), thêm SSH key và chuyển bot sang chạy dưới systemd hoặc pm2. Bạn có thể nạp số dư bằng chuyển khoản ngân hàng bằng VND và nâng cấu hình khi bot lớn dần.
