כתבתם בוט 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 מינימלי שקורא את הטוקן שלו מהסביבה, לא ממחרוזת מקודדת-קשיח:
# 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, חריגה לא-מטופלת, OOM — מחזירה את הבוט תוך שלוש שניות במקום להשאיר אותו מת עד שאתם שמים לב. צפו בו חי:
journalctl -u tgbot -f
זו כל הגדרת ה-logging שלכם. ללא קבצי לוג לסובב, ללא כלים נוספים — journald כבר יש את זה.
עדכון ללא דרמת downtime
כשאתם משנים את הקוד או מעלים את aiogram:
cd ~/tgbot && source venv/bin/activate
pip install -U aiogram # if upgrading the library
sudo systemctl restart tgbot
journalctl -u tgbot -n 30 --no-pager # confirm it came back clean
ה-restart מבליח את הבוט לשנייה-שתיים. לבוט polling זה בלתי-נראה למשתמשים — Telegram מתייג עדכונים ומוסר אותם ברגע שהבוט מתחבר מחדש.
polling מול webhook — הגרסה הכנה
זו ההחלטה שאנשים חושבים עליה יותר מדי. הנה הגרסה הפשוטה:
polling (start_polling, מה שהקוד למעלה משתמש בו) גורם לבוט לשאול את Telegram "משהו חדש?" על חיבור ארוך-חיים. הוא לא צריך שום דבר חוץ מאינטרנט יוצא — ללא דומיין, ללא TLS, ללא פורטים נכנסים פתוחים. הוא רץ בסדר מאחורי NAT. לרוב הגדול של הבוטים, זה נכון וכדאי שתעצרו כאן.
webhook גורם ל-Telegram לדחוף עדכונים אליכם, מה שאומר שאתם חייבים לחשוף נקודת קצה HTTPS ציבורית. זה דורש דומיין ופורט נכנס נגיש — אז או IP ציבורי ייעודי או reverse proxy מלפנים. יותר הגדרה, יותר דברים שנשברים. התמורה היא השהיה נמוכה יותר ופחות overhead בקנה-מידה גדול — אלפי משתמשים בו-זמניים, נפח עדכונים כבד.
הכלל המעשי: התחילו עם polling על תוכנית NAT. עברו ל-webhook רק כשבאמת גדלתם מעבר ל-polling — ואם כן, זה כאשר IP ייעודי מרוויח את מקומו, כי אתם צריכים את נקודת הקצה HTTPS הנכנסת הזו.
מה זה עולה להריץ
בוט polling קל. הוא בטל על ה-long-poll של Telegram ומגיב להודעות, אז הארגז בעיקר מחכה:
- $3 Nano (1 vCPU / 1 GB) — בסדר לרוב הבוטים, אפילו פטפטנים למדי.
- $5 Micro (2 vCPU / 2 GB) — כשהבוט מחזיק מסד נתונים (SQLite/Postgres), מטפל במדיה, או משרת הרבה משתמשים.
- גבוה יותר רק אם הבוט עצמו עושה עבודה אמיתית — עיבוד תמונות, מודל מקומי, לוגיקה כבדה לכל-הודעה.
ההרשמה באימייל-בלבד ואתם משלמים ב-USDC או USDT ב-Base או Ethereum — ללא כרטיס, ללא תעודה. כרטיס עובד גם, אבל ל-on-ramp יש מינימום של ~$27, אז לתוכנית של $3 חלק יותר לטעון יתרה קטנה פעם אחת ולתת לחידושים למשוך ממנה. זה CPU-בלבד, דאטה-סנטר אחד בגרמניה — לא-עניין לבוט, שווה לדעת אם הייתם צריכים GPU או אזור ספציפי.
השורה התחתונה הכנה
בוט Telegram הוא אחד הדברים הזולים ביותר שאתם יכולים לאחסן-בעצמכם: ארגז של $3, unit של systemd, ו-polling נותן לכם בוט שמקוון דרך קריסות ואתחולים בלי שתעשו לו בייביסיטר. הושיטו יד ל-webhook ולתוכנית גדולה יותר רק כשקנה-מידה באמת מכריח — לא כי מדריך אמר לכם ש-webhooks "טובים יותר". השיגו את הארגז הקטן, שמרו את הטוקן בקובץ env, תנו ל-systemd לטפל בזמן הפעילות, ו — לפני הכל — הריצו את רשימת התיוג לאבטחת VPS חדש כך שהארגז עצמו נעול.
מוכנים לארח את שלכם? בוט Telegram בקושי משתמש במשאבים — תוכנית Nano ($3/חודש) מריצה אותו 24/7 ללא טרחה.
תגובות
אין עדיין תגובות. היו הראשונים.