Virtualization

Cách chạy bot Telegram trong giờ hành chính trên VPS cho người mới

Bạn vừa viết xong một con bot Telegram, chạy thử trên máy local thì ngon lành. Nhưng tắt laptop là bot chết, và bạn nhận ra mình cần một nơi để bot sống trong giờ hành chính mà không cần bật máy tính. Bài này hướng dẫn bạn từng bước để chạy bot Telegram trong giờ hành chính trên VPS Linux, từ khâu chuẩn bị môi trường, chạy bot dưới dạng service nền bằng systemd, cho đến theo dõi log và xử lý sự cố thường gặp.

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

  • Một VPS Linux, bài này dùng VPS Linux Ubuntu 24.04 LTS. Bạn có thể dùng Debian 12 hoặc AlmaLinux 9, các lệnh cơ bản tương tự, chỉ khác trình quản lý gói (apt vs dnf).
  • Quyền root hoặc user sudo trên VPS.
  • Một bot Telegram đã tạo bằng @BotFather và đã có token.
  • Kiến thức cơ bản về SSH và dòng lệnh Linux.

Nếu bạn chưa có VPS, có thể tham khảo thuê VPS Ubuntu tại các nhà cung cấp trong nước, máy chủ đặt tại Việt Nam sẽ cho độ trễ thấp khi gọi API Telegram từ khu vực Đông Nam Á. Bạn cũng cần biết cách bảo mật SSH trước khi đưa bot vào hoạt động chính thức.

Vì sao cần VPS riêng để chạy bot Telegram?

Bot Telegram không phải lúc nào cũng xử lý lệnh ngay lập tức. Nhiều bot chạy theo cơ chế polling, nghĩa là cứ vài giây lại hỏi Telegram "có tin nhắn mới không?". Nếu máy tính của bạn tắt hoặc mất mạng, bot sẽ bỏ lỡ toàn bộ tin nhắn trong khoảng thời gian đó. Với các bot dùng webhook, bạn càng cần một máy chủ có IP công khai và hoạt động liên tục để Telegram có thể gửi update đến.

Chạy bot trên VPS còn giúp bạn tách biệt môi trường chạy bot khỏi máy cá nhân. Muốn cài thêm thư viện, thay đổi phiên bản Python, hay khởi động lại máy, bạn làm trên VPS mà không ảnh hưởng đến công việc hàng ngày. VPS cũng cho phép bot chạy với IP tĩnh, điều này hữu ích nếu bạn cần đăng ký webhook hoặc tích hợp với dịch vụ bên ngoài yêu cầu IP cố định.

Một lưu ý về chi phí: bạn không cần cấu hình VPS quá cao cho bot Telegram. Với các bot xử lý vài trăm tin nhắn mỗi ngày, gói VPS 1 vCPU, 1GB RAM là đủ. Nếu bot của bạn dùng thư viện machine learning hoặc render ảnh, hãy tính toán thêm. Bạn có thể tham khảo bảng giá VPS để chọn gói phù hợp, thanh toán theo tháng không cần cam kết dài hạn.

Bước 1 - Cài đặt môi trường chạy bot trên VPS

Đầu tiên, SSH vào VPS và cập nhật hệ thống. Trên Ubuntu 24.04 hoặc Debian 12, dùng lệnh:

sudo apt update
sudo apt upgrade -y

Nếu bạn dùng AlmaLinux 9 hoặc Rocky Linux 9, thay bằng:

sudo dnf update -y

Tiếp theo, cài đặt Python 3 và pip nếu bot của bạn viết bằng Python (phổ biến nhất cho bot Telegram). Ubuntu 24.04 đi kèm Python 3.12, vẫn đang được hỗ trợ đến tháng 10 năm 2028, nên bạn không cần cài thêm bản mới hơn.

sudo apt install -y python3 python3-venv python3-pip git

Nếu bot viết bằng Node.js, cài Node.js 22 LTS (bản LTS hiện hành năm 2026):

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs

Quan trọng: đừng cài package Python toàn cục bằng pip. Luôn tạo virtual environment riêng cho bot. Điều này tránh xung đột thư viện giữa các dự án và giúp dễ dàng gỡ cài đặt khi không cần nữa.

mkdir -p ~/mybot
cd ~/mybot
python3 -m venv venv
source venv/bin/activate
pip install python-telegram-bot

Thay python-telegram-bot bằng thư viện bot bạn đang dùng: aiogram, pyrogram, telebot... Sau khi cài xong, copy mã nguồn bot vào thư mục ~/mybot. Bạn có thể dùng git clone nếu bot nằm trên GitHub, hoặc dùng scp từ máy local:

scp -r /path/to/your/bot/folder root@your_vps_ip:~/mybot/

Bước 2 - Chạy thử bot ở chế độ foreground

Trước khi đưa bot vào systemd, hãy chạy thử ở chế độ foreground để chắc chắn mã nguồn hoạt động đúng trên VPS. Kích hoạt virtual environment và chạy file chính của bot:

cd ~/mybot
source venv/bin/activate
python bot.py

Nếu bot khởi động thành công, bạn sẽ thấy log hiện ra trên terminal. Gửi thử một tin nhắn đến bot trên Telegram để kiểm tra phản hồi. Sau đó tắt bot bằng Ctrl+C.

Một số lỗi thường gặp ở bước này:

  • Lỗi token không hợp lệ: kiểm tra lại token lấy từ BotFather, đảm bảo không có khoảng trắng thừa.
  • Lỗi thiếu thư viện: chạy pip list trong virtual environment để xem các package đã cài, đối chiếu với file requirements.txt nếu có.
  • Lỗi kết nối: nếu bot không kết nối được Telegram, kiểm tra firewall trên VPS (xem Bước 4) và thử curl -I https://api.telegram.org.

Bước 3 - Tạo systemd service để bot chạy nền trong giờ hành chính

systemd là trình quản lý dịch vụ mặc định trên hầu hết các bản Linux hiện nay. Tạo một service file để systemd quản lý bot: tự động khởi động khi VPS boot, tự động restart khi bot crash, và ghi log theo chuẩn journald.

Tạo file service bằng lệnh:

sudo nano /etc/systemd/system/telegram-bot.service

Nội dung file:

[Unit]
Description=Telegram Bot Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/mybot
ExecStart=/root/mybot/venv/bin/python /root/mybot/bot.py
Restart=always
RestartSec=5
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target

Giải thích các dòng quan trọng:

  • After=network.target: đảm bảo service chỉ chạy sau khi mạng đã sẵn sàng.
  • ExecStart: đường dẫn rất cao đến Python trong virtual environment và file bot. Dùng đường dẫn rất cao, không dùng python bot.py vì systemd không load shell profile.
  • Restart=always: tự động khởi động lại bot nếu nó thoát bất ngờ hoặc crash.
  • RestartSec=5: chờ 5 giây trước khi restart, tránh restart liên tục khi bot lỗi ngay lúc khởi động.
  • Environment=PYTHONUNBUFFERED=1: buộc Python in log ngay lập tức, không đệm, để log hiển thị trên journald đúng thời điểm.

Sau khi tạo file, nạp lại systemd và kích hoạt service:

sudo systemctl daemon-reload
sudo systemctl enable telegram-bot
sudo systemctl start telegram-bot

Kiểm tra trạng thái hoạt động:

sudo systemctl status telegram-bot

Output mong đợi sẽ hiển thị active (running) và không có dòng lỗi màu đỏ. Nếu service ở trạng thái failed, xem log để biết nguyên nhân:

sudo journalctl -u telegram-bot -n 50 --no-pager

Bước 4 - Cấu hình firewall và bảo mật cho bot

Bot Telegram chỉ cần kết nối ra ngoài (outbound) đến api.telegram.org trên port 443. Bạn không cần mở bất kỳ port inbound nào nếu bot chạy theo cơ chế polling. Vì vậy, hãy siết chặt firewall để chỉ cho phép SSH và các kết nối cần thiết.

Trên Ubuntu/Debian với ufw:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw enable

Trên AlmaLinux/Rocky với firewalld:

sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload

Nếu bot của bạn dùng webhook thay vì polling, bạn cần mở port 80 hoặc 443. Lúc đó cần cài Nginx làm reverse proxy và gắn SSL. Bạn có thể tham khảo bài cài đặt Nginx reverse proxy trên VPS để cấu hình đúng chuẩn.

Một lưu ý bảo mật: rất cao không commit token bot lên GitHub hoặc để lộ trong file công khai. Token là chìa khóa điều khiển bot, ai có token đều có thể gửi tin nhắn thay bot. Dùng biến môi trường để lưu token:

sudo nano /etc/systemd/system/telegram-bot.service

Thêm dòng:

Environment=BOT_TOKEN=123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Sau đó sửa file bot.py để đọc token từ biến môi trường:

import os
TOKEN = os.environ.get('BOT_TOKEN')

Nhớ chạy sudo systemctl daemon-reloadsudo systemctl restart telegram-bot sau khi thay đổi service file.

Bước 5 - Theo dõi log và cấu hình cảnh báo lỗi

Khi bot chạy dưới systemd, toàn bộ log được ghi vào journald. Xem log theo thời gian thực:

sudo journalctl -u telegram-bot -f

Xem log của một khoảng thời gian cụ thể:

sudo journalctl -u telegram-bot --since "2026-04-01 00:00:00" --until "2026-04-01 12:00:00"

Để tránh log phình to không kiểm soát, cấu hình logrotate cho journald. Mặc định journald đã có giới hạn, nhưng bạn có thể kiểm tra dung lượng đang dùng:

journalctl --disk-usage

Nếu muốn giới hạn journald ở mức 200MB, sửa file /etc/systemd/journald.conf:

sudo nano /etc/systemd/journald.conf

Tìm dòng SystemMaxUse= và bỏ comment, đặt giá trị:

SystemMaxUse=200M

Khởi động lại journald:

sudo systemctl restart systemd-journald

Ngoài việc xem log thụ động, bạn nên chủ động nhận cảnh báo khi bot gặp lỗi. Cách đơn giản: viết script kiểm tra trạng thái service và gửi thông báo qua Telegram. Bạn có thể tham khảo bài gửi cảnh báo hệ thống qua Telegram bot để xây dựng hệ thống cảnh báo tự động cho VPS nói chung và bot nói riêng.

Bước 6 - Tối ưu RAM cho bot trên VPS cấu hình thấp

Bot Telegram viết bằng Python thường ngốn 50-150MB RAM tùy thư viện và số lượng thư viện tải vào. Nếu VPS của bạn chỉ có 1GB RAM và chạy thêm các dịch vụ khác, RAM có thể trở thành vấn đề. Một số cách giảm tải:

  • Dùng webhook thay vì polling: webhook giảm một luồng liên tục hỏi Telegram, đỡ tốn CPU và RAM hơn ở mức nhẹ.
  • Chỉ import những thư viện cần thiết trong file bot, tránh import cả module nặng khi không dùng.
  • Bật swap cho VPS để tránh OOM kill khi RAM đầy. Xem bài bật swap trên VPS ít RAM để cấu hình đúng cách.

Kiểm tra mức RAM bot đang dùng:

ps aux | grep python | grep -v grep

Cột %MEM cho biết phần trăm RAM bot chiếm dụng. Nếu bot của bạn ngốn RAM bất thường, có thể có lỗi rò rỉ bộ nhớ hoặc bot đang giữ quá nhiều dữ liệu trong biến. Xem thêm bài xử lý VPS bị đầy RAM để chẩn đoán.

Xử lý lỗi thường gặp khi chạy bot trên VPS

Dưới đây là các lỗi phổ biến và cách xử lý nhanh:

Lỗi 1: Bot chạy được vài phút rồi tắt, không có log lỗi rõ ràng.

Nguyên nhân thường do OOM Killer giết process khi VPS hết RAM. Kiểm tra bằng lệnh:

sudo dmesg | grep -i oom

Nếu thấy dòng OOM, giải pháp là bật swap hoặc giảm RAM bot sử dụng. Ngoài ra kiểm tra xem VPS có cấu hình swap chưa bằng free -h.

Lỗi 2: Bot không khởi động cùng VPS sau khi reboot.

Kiểm tra service đã được enable chưa:

sudo systemctl is-enabled telegram-bot

Output phải là enabled. Nếu chưa, chạy sudo systemctl enable telegram-bot. Ngoài ra, nếu service file có After=network.target mà bot vẫn lỗi khi boot, thử thêm network-online.target và kích hoạt systemd-networkd-wait-online.

Lỗi 3: Bot bị Telegram giới hạn do gửi quá nhiều request.

Telegram giới hạn khoảng 30 tin nhắn mỗi giây cho mỗi bot. Nếu bot gửi tin hàng loạt, hãy thêm delay giữa các lần gửi hoặc dùng phương thức send_media_group thay vì gửi từng ảnh riêng lẻ. Khi bị giới hạn, API trả về mã lỗi 429, log sẽ hiện rõ.

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

Chạy bot Telegram trên VPS cần cấu hình tối thiểu bao nhiêu RAM?

Bot Telegram viết bằng Python chạy tốt trên VPS 1GB RAM. Nếu dùng thêm database hoặc nhiều thư viện nặng, nên dùng VPS 2GB RAM. Bot viết bằng Go hoặc Rust nhẹ hơn, chỉ cần 512MB là thoải mái.

Nên dùng polling hay webhook cho bot Telegram?

Polling đơn giản hơn, không cần mở port hay cấu hình SSL, phù hợp cho bot cá nhân hoặc bot ít người dùng. Webhook phản hồi nhanh hơn và tiết kiệm tài nguyên, nhưng cần IP công khai, domain và SSL, phù hợp cho bot phục vụ nhiều người dùng.

Dịch vụ free như Heroku hoặc PythonAnywhere có đủ chạy bot trong giờ hành chính không?

Heroku đã ngừng gói free từ tháng 11 năm 2022. PythonAnywhere free có giới hạn thời gian xử lý và không cho phép chạy bot liên tục. Các nền tảng free khác thường có giới hạn về thời gian hoạt động hoặc yêu cầu ping định kỳ, không đáng tin cậy cho bot hoạt động trong giờ hành chính thực sự.

Làm sao để bot tự khởi động lại khi bị crash?

Dùng systemd với tham số Restart=always trong service file. systemd sẽ tự động khởi động lại bot sau 5 giây nếu process bị thoát. Đây là cách phổ biến và đáng tin cậy nhất trên Linux.

Bot Telegram có thể chạy trên VPS Windows không?

Được, bạn có thể chạy bot Python hoặc Node.js trên VPS Windows bằng Task Scheduler hoặc NSSM để chạy nền. Tuy nhiên, VPS Linux thường nhẹ hơn, ít tốn tài nguyên hơn và được cộng đồng hỗ trợ nhiều hơn cho loại ứng dụng này.

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