EQVPS

รันบอท Telegram 24/7 บน VPS: aiogram, systemd, polling กับ webhook

Jul 4, 2026 · 2 นาทีในการอ่าน · EQVPS Team

คุณเขียนบอท Telegram ด้วย aiogram ทดสอบในเครื่อง และมันทำงาน ตอนนี้มันต้องอยู่ที่ที่ไม่หลับเมื่อคุณปิดแล็ปท็อป VPS เล็กคือบ้านที่เป็นธรรมชาติ — แต่มีช่องว่างระหว่าง python bot.py ในเซสชัน SSH และบอทที่อยู่จริงผ่านแครช รีบูต และการเชื่อมต่อของคุณหลุด

นี่คือฉบับโปรดักชัน: virtualenv โทเคนที่เก็บพ้นโค้ดของคุณ บริการ systemd ที่ชุบชีวิตบอทเอง และคำตอบที่ชัดตาต่อคำถามที่ทุกคนถามในที่สุด — polling หรือ webhook?

ทำไมไม่แค่รันมันบนแล็ปท็อป

บอทต้องการการเชื่อมต่อขาออกที่เสถียรไปยัง Telegram แล็ปท็อปของคุณหลับ รีบูตเพื่ออัปเดต และกระโดดระหว่างเครือข่าย — ทุกอันหลุดบอท และผู้ใช้ชนกำแพงความเงียบ VPS ถือการเชื่อมต่อนั้นตลอดเวลา นั่นคือเหตุผลทั้งหมดในการย้ายมันจากเครื่องของคุณ และเป็นเหตุผลเดียวกันที่บอท Discord ควรอยู่บนเซิร์ฟเวอร์ด้วย

หากคุณแค่อยากได้เส้นทาง "นำมันออนไลน์" ที่เร็วที่สุดด้วยบอทขั้นต่ำ คู่มือโฮสต์บอท Telegramครอบคลุมนั่น ชิ้นนี้ไปลึกขึ้นระดับหนึ่ง: aiogram การจัดการโทเคนที่ปลอดภัย และการรู้ว่าเมื่อไรขยายขนาด

บอท ใน virtualenv

SSH เข้าและเก็บบอทแยกใน venv ของตัวเอง — อย่าติดตั้งแพ็กเกจทั่วระบบ มันทำให้การอัปเกรดและการล้างยุ่งภายหลัง:

sudo apt update && sudo apt install -y python3-venv
mkdir ~/tgbot && cd ~/tgbot
python3 -m venv venv && source venv/bin/activate
pip install -U aiogram

บอท aiogram 3 ขั้นต่ำที่อ่านโทเคนจากสภาพแวดล้อม ไม่ใช่จากสตริง hard-code:

# bot.py
import asyncio, logging, os
from aiogram import Bot, Dispatcher
from aiogram.types import Message
from aiogram.filters import CommandStart

logging.basicConfig(level=logging.INFO)
dp = Dispatcher()

@dp.message(CommandStart())
async def start(m: Message):
    await m.answer("Alive and running on a VPS.")

async def main():
    bot = Bot(os.environ["BOT_TOKEN"])
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())

เก็บโทเคนพ้นโค้ดของคุณ

อย่าวางโทเคน BotFather ลงใน bot.py — push ครั้งเดียวไป repo สาธารณะแล้วมันรั่ว ใส่มันในไฟล์ env ที่ root อ่านได้แทน:

sudo tee /etc/tgbot.env >/dev/null <<'EOF'
BOT_TOKEN=123456:your-token-from-botfather
EOF
sudo chmod 600 /etc/tgbot.env

โทเคนที่รั่วอยู่ห่างจากการแก้เพียง /revoke ใน BotFather — แต่อะไรอื่นที่รั่วบนเครื่องที่แชร์แย่กว่า VPS เฉพาะสำหรับบอทตรงไปตรงมาแล้วเป็นบ้านที่ปลอดภัยกว่าสำหรับโทเคนกว่าแล็ปท็อปประจำวันของคุณ: หากมันรั่ว คุณหมุนโทเคนหนึ่ง ไม่ใช่การตั้งค่าทั้งหมด

ส่วนที่เก็บมันให้มีชีวิต: systemd

นี่คือสิ่งที่แยกบอทที่รันจากบอทที่อยู่รัน สร้างบริการ:

# /etc/systemd/system/tgbot.service
[Unit]
Description=Telegram bot (aiogram)
After=network-online.target
Wants=network-online.target

[Service]
User=botuser
WorkingDirectory=/home/botuser/tgbot
EnvironmentFile=/etc/tgbot.env
ExecStart=/home/botuser/tgbot/venv/bin/python bot.py
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

รันมันในฐานะผู้ใช้ที่ไม่ใช่ root (botuser ข้างต้น) ไม่ใช่ root — หากบอทถูกบุกรุกเมื่อใด คุณอยากให้มันถูกกักไว้ จากนั้น:

sudo systemctl daemon-reload
sudo systemctl enable --now tgbot

Restart=always กับ RestartSec=3 หมายถึงการแครช — อัปเดตแย่จาก Telegram exception ที่ไม่ได้จัดการ OOM — นำบอทกลับในสามวินาทีแทนการทิ้งมันตายจนคุณสังเกต ดูมันสด:

journalctl -u tgbot -f

นั่นคือการตั้งค่า logging ทั้งหมดของคุณ ไม่มีไฟล์ log ให้หมุน ไม่มีเครื่องมือเพิ่ม journald มีมันแล้ว

การอัปเดตโดยไม่มีดราม่า downtime

เมื่อคุณเปลี่ยนโค้ดหรืออัป aiogram:

cd ~/tgbot && source venv/bin/activate
pip install -U aiogram          # หากอัปเกรดไลบรารี
sudo systemctl restart tgbot
journalctl -u tgbot -n 30 --no-pager   # ยืนยันมันกลับมาสะอาด

การรีสตาร์ทกะพริบบอทหนึ่งถึงสองวินาที สำหรับบอท polling นั่นมองไม่เห็นต่อผู้ใช้ — Telegram คิวอัปเดตและส่งเมื่อบอทเชื่อมต่อใหม่

polling กับ webhook — ฉบับตรงไปตรงมา

นี่คือการตัดสินใจที่คนคิดมากเกิน นี่คือฉบับตรง:

Polling (start_polling ที่โค้ดข้างต้นใช้) ให้บอทถาม Telegram "มีอะไรใหม่ไหม?" บนการเชื่อมต่อที่อยู่ยาว มันไม่ต้องการอะไรนอกจากอินเทอร์เน็ตขาออก — ไม่มีโดเมน ไม่มี TLS ไม่มีพอร์ตขาเข้าเปิด มันรันหลัง NAT ได้ สำหรับบอทส่วนใหญ่นี่ถูกต้องและคุณควรหยุดที่นี่

Webhook ให้ Telegram push อัปเดตมายังคุณ ซึ่งหมายถึงคุณต้องเปิด endpoint HTTPS สาธารณะ นั่นต้องการโดเมนและพอร์ตขาเข้าที่เข้าถึงได้ — ดังนั้น IP สาธารณะแบบเฉพาะหรือ reverse proxy ข้างหน้า ตั้งค่ามากกว่า สิ่งที่พังมากกว่า ผลตอบแทนคือ latency ต่ำกว่าและ overhead น้อยกว่าในขนาดใหญ่ — ผู้ใช้พร้อมกันหลายพัน ปริมาณอัปเดตหนัก

กฎเชิงปฏิบัติ: เริ่มด้วย polling บนแพ็กเกจ NAT ย้ายไป webhook เฉพาะเมื่อคุณโตเกิน polling จริง — และหากคุณทำ นั่นคือเมื่อ dedicated IP ได้ที่ยืน เพราะคุณต้องการ endpoint HTTPS ขาเข้านั้น

มันมีต้นทุนเท่าไรที่จะรัน

บอท polling เบา มันว่างอยู่บน long-poll ของ Telegram และตอบสนองข้อความ ดังนั้นเครื่องส่วนใหญ่รอ:

การสมัครใช้อีเมลเท่านั้นและคุณจ่ายด้วย USDC หรือ USDT บน Base หรือ Ethereum — ไม่มีบัตร ไม่มี ID บัตรทำงานด้วย แต่ on-ramp มีขั้นต่ำ ~$27 ดังนั้นสำหรับแพ็กเกจ $3 ราบรื่นกว่าที่จะเติมยอดคงเหลือเล็กครั้งเดียวและให้การต่ออายุดึงจากมัน มันเป็น CPU-only ดาต้าเซ็นเตอร์เดียวในเยอรมนี — ไม่เป็นปัญหาสำหรับบอท ควรรู้หากคุณต้องการ GPU หรือภูมิภาคเจาะจง

บรรทัดสุดท้ายที่ตรงไปตรงมา

บอท Telegram คือหนึ่งในสิ่งที่ถูกที่สุดที่คุณโฮสต์เองได้: เครื่อง $3, systemd unit และ polling ให้คุณบอทที่ออนไลน์ผ่านแครชและรีบูตโดยคุณไม่ต้องเลี้ยงดู คว้า webhook และแพ็กเกจใหญ่กว่าเฉพาะเมื่อขนาดบังคับจริง — ไม่ใช่เพราะบทเรียนบอกคุณว่า webhook "ดีกว่า" คว้าเครื่องเล็ก เก็บโทเคนในไฟล์ env ให้ systemd จัดการอัปไทม์ และ — ก่อนอะไรอื่น — รันเช็กลิสต์ความปลอดภัย VPS ใหม่เพื่อให้เครื่องเองถูกล็อก


พร้อมโฮสต์ของคุณไหม? บอท Telegram แทบไม่ใช้ทรัพยากร — แพ็กเกจ Nano ($3/เดือน) รันมัน 24/7 โดยไม่ยุ่งยาก

FAQ

polling หรือ webhook — ฉันควรใช้อันไหน?

เริ่มด้วย polling มันทำงานจากเครื่องใดที่มีอินเทอร์เน็ตขาออก — ไม่มีโดเมน ไม่มีพอร์ตเปิด ไม่มี TLS — และเพียงพอสำหรับบอทส่วนใหญ่ เปลี่ยนไป webhook เฉพาะเมื่อคุณรันในขนาดใหญ่ (ผู้ใช้หลายพัน) หรือต้องการ latency ต่ำที่สุด webhook ต้องการ endpoint HTTPS สาธารณะ ซึ่งหมายถึงโดเมนและพอร์ตขาเข้าที่เข้าถึงได้ (dedicated IP หรือ reverse proxy) ดังนั้นมันมีชิ้นส่วนเคลื่อนที่มากกว่า สำหรับ 95% ของบอท polling บน VPS เล็กคือคำตอบที่ถูกต้อง

ฉันต้องมี dedicated IP หรือโดเมนสำหรับบอท Telegram ไหม?

ไม่สำหรับ polling — บอททำเฉพาะการเรียกขาออกไปยัง Telegram ดังนั้นแพ็กเกจ NAT ที่ forward พอร์ต SSH เพียงพอ คุณต้องการ endpoint HTTPS สาธารณะ (โดเมน + พอร์ตขาเข้า คือ dedicated IP หรือ reverse proxy) เฉพาะหากคุณเปลี่ยนเป็นโหมด webhook บอทส่วนใหญ่ไม่เคยต้องการมัน

บอท aiogram ต้องการ VPS ขนาดใด?

เล็กที่สุด บอท polling ส่วนใหญ่รอ long-poll ของ Telegram ดังนั้น 1 vCPU / 1 GB (Nano $3) จัดการบอทส่วนใหญ่ได้สบาย ขยายขึ้นเฉพาะเมื่อบอทเองทำงานหนัก — ฐานข้อมูล การประมวลผลสื่อ หรือโมเดลในเครื่อง — ซึ่งดันคุณไปที่ 2 GB ($5) หรือมากกว่า

ฉันเก็บบอทให้รันหลัง log out อย่างไร?

รันมันเป็นบริการ systemd ด้วย Restart=always เปิดใน terminal มันตายเมื่อ SSH ปิด ใต้ systemd มันรอด log out รีสตาร์ทเมื่อแครช และกลับมาหลังรีบูต นั่นคือเส้นระหว่างเดโมและสิ่งที่คุณพึ่งได้

← กลับไปบล็อกดูแพ็กเกจและราคา →

ความคิดเห็น

ยังไม่มีความคิดเห็น เป็นคนแรกสิ

แสดงความคิดเห็น

ความคิดเห็นจะถูกตรวจสอบก่อนแสดง