گرمای تابستان — همه‌چیز آب می‌شود، حتی قیمت‌های ما.−25%−۲۵٪ روی هر پلن سالانه، تا ۳۱ اوتدیدن پلن‌ها
EQVPS

چطور یک ربات تلگرام را روی VPS میزبانی کنیم (و آن را همیشه فعال نگه داریم)

25 خرداد 1405 · 3 دقیقه مطالعه · EQVPS Team

رباتی که فقط تا وقتی لپ‌تاپ‌تان باز است اجرا می‌شود در واقع در حال کار نیست — فقط دارد نمایش می‌دهد. برای اینکه واقعاً آنلاین باشد، ساعت ۳ بامداد پاسخ بدهد و از ری‌بوت‌های شما و کرش‌های خودش جان سالم به در ببرد، باید روی یک سرور زندگی کند. اینجا کل مسیر را از ابتدا تا انتها، همراه با دستورها، مرور می‌کنیم.

اول خبر خوب: یک ربات بار کاری بسیار کوچکی است. بیشتر وقت‌ها بیکار می‌ماند و منتظر پیام است، پس ارزان‌ترین سرور هم به‌راحتی از پس آن برمی‌آید — نه IP اختصاصی، نه دامنه، هیچ چیز خاصی.

۱. گرفتن توکن از BotFather

در تلگرام به @BotFather پیام بدهید، /newbot بفرستید و یک نام و نام‌کاربری انتخاب کنید. توکنی به شما می‌دهد که شبیه 12345:AAH... است. با آن مثل یک رمز عبور رفتار کنید — هرکس آن را داشته باشد ربات شما را کنترل می‌کند.

۲. یک ربات کوچک

با SSH به سرور وصل شوید و پایتون و کتابخانه را نصب کنید:

sudo apt update && sudo apt install -y python3-venv
mkdir ~/mybot && cd ~/mybot
python3 -m venv venv && source venv/bin/activate
pip install python-telegram-bot

یک ربات که پاسخ می‌دهد — ~/mybot/bot.py:

import os
from telegram.ext import ApplicationBuilder, CommandHandler

async def start(update, ctx):
    await update.message.reply_text("Alive and on a server. 🟢")

app = ApplicationBuilder().token(os.environ["BOT_TOKEN"]).build()
app.add_handler(CommandHandler("start", start))
app.run_polling()

توجه کنید که توکن را از یک متغیر محیطی می‌خواند — نه به صورت هاردکد. این در مرحله بعد اهمیت پیدا می‌کند.

۳. بخشی که واقعاً آن را فعال نگه می‌دارد: systemd

اگر فقط python bot.py را اجرا کنید، لحظه‌ای که SSH را ببندید از بین می‌رود. یک سرویس systemd چیزی است که باعث می‌شود از خروج، کرش و ری‌بوت جان سالم به در ببرد. فایل /etc/systemd/system/mybot.service را بسازید:

[Unit]
Description=Telegram bot
After=network-online.target

[Service]
WorkingDirectory=/home/youruser/mybot
Environment=BOT_TOKEN=12345:AAH...your-token
ExecStart=/home/youruser/mybot/venv/bin/python bot.py
Restart=always
RestartSec=5
User=youruser

[Install]
WantedBy=multi-user.target

سپس:

sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo systemctl status mybot      # باید active (running) نشان دهد
journalctl -u mybot -f           # لاگ‌های زنده

Restart=always خطی است که کار اصلی را انجام می‌دهد — کرش می‌کند و ظرف ۵ ثانیه برمی‌گردد. enable یعنی بعد از ری‌بوت هم بالا می‌آید. همین کل تفاوت میان «یک بار رباتی را اجرا کردم» و «ربات من بالاست» است.

۴. چرا نه دامنه و نه پورت باز

ربات از long polling استفاده می‌کند — خودش برای گرفتن به‌روزرسانی‌ها به سمت تلگرام دست دراز می‌کند، پس هیچ چیزی لازم نیست به داخل برسد. نه URL عمومی، نه قانون فایروال ورودی، نه IP اختصاصی. دقیقاً به همین دلیل است که یک VPS با NAT (‏IP مشترک، ‏SSH روی یک پورت) خانه‌ای مناسب و ارزان برای یک ربات است. webhookها برای حجم بسیار بالا وجود دارند، اما تقریباً مطمئناً برای شروع به آن‌ها نیازی ندارید.

هشدارهای صادقانه

همین. اول سرور را با چک‌لیست امنیتی محکم کنید، سرویس را جا بیندازید، و ربات‌تان چه شما آنلاین باشید چه نباشید آنلاین می‌ماند. روی یک VPS که با رمزارز پرداخت شده، می‌توانید یک دقیقه پس از تصمیم‌گیری آن را در حال اجرا داشته باشید.

سؤالات متداول

برای یک ربات تلگرام به چه VPS ای نیاز دارم؟

کوچک‌ترین گزینه. یک ربات تلگرام بیشتر وقت‌ها بیکار است و منتظر به‌روزرسانی‌ها می‌ماند، پس ۱ گیگابایت RAM و ۲ هسته برای بیشتر ربات‌ها کاملاً کافی است — حتی برای ربات‌های نسبتاً پرترافیک. تنها زمانی به منابع بیشتر نیاز دارید که خودِ ربات کار سنگینی انجام دهد (پردازش تصویر، یک مدل محلی، یک پایگاه‌داده بزرگ).

چطور ربات تلگرام را بعد از بستن SSH فعال نگه دارم؟

آن را به صورت یک سرویس systemd اجرا کنید. برخلاف اجرا در ترمینال، systemd آن را بعد از خروج شما زنده نگه می‌دارد، در صورت کرش دوباره اجرایش می‌کند و بعد از ری‌بوت هم دوباره راهش می‌اندازد. همین تفاوتِ یک اسباب‌بازی با چیزی است که واقعاً پابرجا می‌ماند.

چرا وقتی قطع می‌شوم ربات من متوقف می‌شود؟

چون آن را در نشست SSH خود اجرا کرده‌اید، پس با پایان آن نشست از بین می‌رود. آن را در یک سرویس systemd بپیچید (یا برای یک تست سریع در tmux) تا مستقل از ورود شما اجرا شود.

آیا برای یک ربات تلگرام به دامنه یا webhook نیاز دارم؟

نه. long polling (getUpdates) به هیچ URL عمومی، دامنه یا پورت ورودی نیاز ندارد — این ربات است که به سمت تلگرام دست دراز می‌کند. به همین دلیل یک VPS با NAT و بدون IP اختصاصی برای یک ربات کاملاً مناسب است. webhookها یک بهینه‌سازی اختیاری برای حجم بالا هستند.

آیا قرار دادن توکن ربات روی VPS امن است؟

بله، اگر با آن مثل یک رمز عبور رفتار کنید: آن را در یک متغیر محیطی یا فایلی که فقط کاربر ربات می‌تواند بخواند نگه دارید، هرگز آن را در git کامیت نکنید و سرور را با کلیدهای SSH محکم کنید. اگر توکنی لو رفت، آن را در BotFather باطل کنید و یکی جدید بگیرید.

← بازگشت به وبلاگ← پلن‌ها و قیمت‌ها

نظرات

هنوز نظری نیست. اولین نفر باشید.

یک نظر بگذارید

نظرات پیش از نمایش بررسی می‌شوند.