คุณเขียนบอท 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 และตอบสนองข้อความ ดังนั้นเครื่องส่วนใหญ่รอ:
- Nano $3 (1 vCPU / 1 GB) — โอเคสำหรับบอทส่วนใหญ่ แม้ที่ค่อนข้างช่างพูด
- Micro $5 (2 vCPU / 2 GB) — เมื่อบอทเก็บฐานข้อมูล (SQLite/Postgres) จัดการสื่อ หรือให้บริการผู้ใช้จำนวนมาก
- สูงกว่าเฉพาะหากบอทเองทำงานจริง — การประมวลผลภาพ โมเดลในเครื่อง ตรรกะต่อข้อความหนัก
การสมัครใช้อีเมลเท่านั้นและคุณจ่ายด้วย 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 โดยไม่ยุ่งยาก
ความคิดเห็น
ยังไม่มีความคิดเห็น เป็นคนแรกสิ