TürkiyeVPS

اجرای ربات تلگرام ۲۴ ساعته روی سرور مجازی با systemd

ربات شما نباید با خاموش شدن لپ‌تاپ از کار بیفتد. آموزش قدم‌به‌قدم اجرای ربات تلگرام پایتون به‌صورت ۲۴ ساعته روی سرور مجازی اوبونتو ۲۴.۰۴ با systemd.

7 دقیقه مطالعه

ربات تلگرامتان را نوشته‌اید و روی کامپیوتر خودتان تست کرده‌اید و درست کار می‌کند. مشکل اینجاست که تا لپ‌تاپ به خواب برود، اینترنت قطع شود یا ویندوز برای آپدیت ری‌استارت کند، ربات هم ساکت می‌شود و کاربران بی‌جواب می‌مانند. در این مقاله اجرای ربات تلگرام ۲۴ ساعته روی سرور مجازی را به روش درست توضیح می‌دهیم: یک کاربر جداگانه، محیط مجازی پایتون، توکنی که داخل کد نیست و یک سرویس systemd که اگر ربات کرش کند، خودش دوباره آن را بالا می‌آورد. دستورها برای اوبونتو ۲۴.۰۴ نوشته شده‌اند و روی دبیان ۱۲ هم همین‌طور کار می‌کنند.

چرا سرور مجازی و نه کامپیوتر خانگی؟

  • روشن بودن دائمی: VPS روی سروری در دیتاسنتر اجرا می‌شود که هیچ‌وقت خاموش نمی‌شود. قطعی برق خانه یا ری‌استارت مودم روی ربات اثری ندارد.
  • اتصال و IP پایدار: IP اینترنت خانگی عوض می‌شود و اتصال گاهی قطع می‌شود؛ اتصال سرور بسیار قابل‌پیش‌بینی‌تر است.
  • کامپیوتر شما آزاد می‌ماند: لازم نیست لپ‌تاپ را شبانه‌روز روشن بگذارید.
  • هزینهٔ کم: یک ربات ساده منابع بسیار کمی مصرف می‌کند و یک سرور مجازی برای ربات تلگرام در بیشتر موارد کاملاً کافی است.

روش کلی اجرای برنامه‌های پایتون روی سرور را در مقالهٔ اجرای برنامهٔ پایتون روی VPS توضیح داده‌ایم. اینجا مشخصاً سراغ ربات تلگرام و systemd می‌رویم.

قدم ۱: ساخت ربات با BotFather و گرفتن توکن

در تلگرام حساب @BotFather را باز کنید، دستور /newbot را بفرستید و یک نام و یک نام کاربری که به _bot ختم می‌شود انتخاب کنید. BotFather یک توکن شبیه این به شما می‌دهد:

123456789:AAF...a-long-random-string

توکن در حکم رمز عبور ربات است. آن را داخل کد ننویسید، در گیت‌هاب منتشر نکنید و در اسکرین‌شات نشان ندهید. اگر لو رفت، با دستور /revoke در BotFather توکن جدید بگیرید.

قدم ۲: آماده‌سازی سرور

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

sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-venv python3-pip git

ساخت کاربر جداگانه برای ربات

اجرای ربات با کاربر root ریسک بی‌دلیلی است؛ یک باگ در کد شما یا یکی از کتابخانه‌ها می‌تواند کل سرور را در اختیار مهاجم بگذارد. به‌جای آن یک کاربر سیستمی بدون امکان ورود می‌سازیم:

sudo adduser --system --group --home /opt/telegram-bot botuser

این دستور کاربر botuser را بدون رمز و بدون شِل ورود، به‌همراه پوشهٔ /opt/telegram-bot می‌سازد.

قدم ۳: محیط مجازی (venv) و کتابخانه

ربات محیط مجازی خودش را دارد و به پایتون سیستم دست نمی‌زنیم. اوبونتو ۲۴.۰۴ اصلاً اجازهٔ pip install سراسری نمی‌دهد، پس venv راه درست است:

sudo -u botuser python3 -m venv /opt/telegram-bot/venv
sudo -u botuser /opt/telegram-bot/venv/bin/pip install --upgrade pip
sudo -u botuser /opt/telegram-bot/venv/bin/pip install "python-telegram-bot>=21"

کتابخانهٔ python-telegram-bot از نسخهٔ ۲۰ به بعد کاملاً async است. مثال زیر برای نسخهٔ ۲۱ و بالاتر نوشته شده است.

قدم ۴: نوشتن یک ربات ساده

فایل را بسازید:

sudo nano /opt/telegram-bot/bot.py

این کد را داخلش بگذارید:

import logging
import os

from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes, MessageHandler, filters

logging.basicConfig(
    format="%(asctime)s %(levelname)s %(name)s: %(message)s",
    level=logging.INFO,
)

TOKEN = os.environ["BOT_TOKEN"]


async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await update.effective_message.reply_text("سلام! این ربات ۲۴ ساعته روی یک VPS اجرا می‌شود.")


async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await update.effective_message.reply_text(update.effective_message.text)


def main() -> None:
    app = Application.builder().token(TOKEN).build()
    app.add_handler(CommandHandler("start", start))
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
    app.run_polling(allowed_updates=Update.ALL_TYPES)


if __name__ == "__main__":
    main()

مالکیت فایل را به کاربر ربات بدهید:

sudo chown botuser:botuser /opt/telegram-bot/bot.py

دقت کنید که توکن داخل کد نیست و از متغیر محیطی BOT_TOKEN خوانده می‌شود.

قدم ۵: نگهداری توکن در یک فایل محافظت‌شده

sudo nano /etc/telegram-bot.env

فقط یک خط، بدون گیومه:

BOT_TOKEN=123456789:AAF...your-token

فایل را فقط برای root قابل‌خواندن کنید:

sudo chown root:root /etc/telegram-bot.env
sudo chmod 600 /etc/telegram-bot.env

systemd هنگام شروع سرویس این فایل را با دسترسی root می‌خواند و متغیر را به ربات می‌دهد؛ حتی خود botuser هم نمی‌تواند فایل را مستقیم بخواند.

قدم ۶: ساخت سرویس systemd

قلب کار همین‌جاست. systemd ربات را هنگام بوت اجرا می‌کند، در صورت خطا دوباره راه می‌اندازد و خروجی‌اش را در ژورنال ثبت می‌کند.

sudo nano /etc/systemd/system/telegram-bot.service
[Unit]
Description=Telegram bot
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=botuser
Group=botuser
WorkingDirectory=/opt/telegram-bot
EnvironmentFile=/etc/telegram-bot.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/telegram-bot/venv/bin/python /opt/telegram-bot/bot.py
Restart=always
RestartSec=5

# Basic hardening
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/telegram-bot

[Install]
WantedBy=multi-user.target

خط‌های مهم:

  • Restart=always و RestartSec=5: ربات به هر دلیلی متوقف شود، ۵ ثانیه بعد دوباره اجرا می‌شود.
  • PYTHONUNBUFFERED=1: خروجی پایتون بدون تأخیر وارد لاگ می‌شود.
  • ProtectSystem=strict و ReadWritePaths: ربات نمی‌تواند روی فایل‌های سیستم بنویسد و فقط به پوشهٔ خودش دسترسی نوشتن دارد. دیتابیس SQLite و فایل‌های داده را در /opt/telegram-bot نگه دارید.
  • NoNewPrivileges=true: پروسه هرگز نمی‌تواند دسترسی بیشتری به دست بیاورد.

قدم ۷: اجرای سرویس و دیدن لاگ‌ها

sudo systemctl daemon-reload
sudo systemctl enable --now telegram-bot
sudo systemctl status telegram-bot

اگر active (running) دیدید، در تلگرام به ربات /start بفرستید. برای دیدن زندهٔ لاگ‌ها:

sudo journalctl -u telegram-bot -f

برای ۱۰۰ خط آخر از sudo journalctl -u telegram-bot -n 100 --no-pager استفاده کنید. دستورهای کاربردی دیگر را در مقالهٔ دستورهای مدیریت سرور جمع کرده‌ایم.

می‌خواهید مطمئن شوید ربات خودش برمی‌گردد؟ پروسه را به‌زور ببندید و چند ثانیه بعد وضعیت را ببینید:

sudo systemctl kill telegram-bot
sleep 6
sudo systemctl status telegram-bot

به‌روزرسانی کد

اگر کدتان در گیت است، مخزن را با کاربر botuser داخل /opt/telegram-bot کلون کنید. به‌روزرسانی فقط دو دستور است:

sudo -u botuser git -C /opt/telegram-bot pull
sudo systemctl restart telegram-bot

اگر کتابخانهٔ جدیدی اضافه کرده‌اید، اول آن را نصب کنید:

sudo -u botuser /opt/telegram-bot/venv/bin/pip install -r /opt/telegram-bot/requirements.txt

هر بار هم که خود فایل سرویس را تغییر دادید، sudo systemctl daemon-reload را فراموش نکنید.

Polling یا Webhook؟

ربات بالا با روش polling کار می‌کند: مرتب از سرورهای تلگرام می‌پرسد «پیام جدیدی هست؟». مزیتش این است که لازم نیست هیچ پورتی را به بیرون باز کنید و به دامنه یا گواهی SSL هم نیازی ندارید. برای بیشتر ربات‌ها ساده‌ترین و کافی‌ترین روش همین است.

در روش webhook تلگرام هر پیام جدید را به یک آدرس HTTPS روی سرور شما می‌فرستد. برای ربات‌های پرترافیک مناسب است، اما به دامنه، گواهی معتبر و یک وب‌سرور نیاز دارد. راهنمای نصب Nginx و SSL رایگان Let's Encrypt این بخش را پوشش می‌دهد.

همین روش برای ربات‌های Node.js و دیسکورد

برای systemd زبان برنامه مهم نیست. در ربات Node.js فقط خط ExecStart عوض می‌شود:

ExecStart=/usr/bin/node /opt/telegram-bot/index.js

ربات‌های دیسکورد، سلف‌بات‌ها و اسکریپت‌های زمان‌بندی‌شدهٔ کوچک هم به همین شکل اجرا می‌شوند. برای هر ربات یک فایل سرویس جدا (مثلاً discord-bot.service) و یک فایل env جدا بسازید.

ربات چقدر منابع لازم دارد؟

یک ربات سادهٔ «دستور و پاسخ» معمولاً چند ده مگابایت رم مصرف می‌کند و تقریباً باری روی پردازنده نمی‌گذارد؛ پس یک VPS پایه برای بیشتر ربات‌ها کافی است. اگر ربات شما تصویر پردازش می‌کند، فایل‌های بزرگ دانلود می‌کند، زیاد به API هوش مصنوعی درخواست می‌فرستد یا دیتابیس دارد، رم بیشتری در نظر بگیرید. مصرف رم و CPU هر سرور در پنل کاربری قابل مشاهده است.

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

اگر ربات کرش کند چه می‌شود؟

به لطف Restart=always، systemd در چند ثانیه دوباره آن را اجرا می‌کند. بعد از ری‌استارت سرور هم چون سرویس enable شده، ربات خودکار بالا می‌آید. علت خطا را با journalctl -u telegram-bot پیدا کنید.

می‌توانم چند ربات روی یک سرور اجرا کنم؟

بله. برای هر ربات پوشه، فایل env و فایل سرویس جداگانه بسازید (bot1.service، bot2.service و…). فقط مصرف کل رم را زیر نظر داشته باشید.

screen یا tmux کافی نیست؟

برای تست سریع کافی است، اما بعد از ری‌استارت سرور ربات خودش برنمی‌گردد و اگر کرش کند کسی دوباره اجرایش نمی‌کند. برای اجرای دائمی، systemd بسیار مطمئن‌تر است.

سروری برای ربات شما

سرور مجازی ترکیه از TürkiyeVPS در استانبول قرار دارد و از ماهی $0.89 شروع می‌شود؛ با اوبونتو ۲۴.۰۴ یا دبیان ۱۲، دسترسی کامل root و ترافیک نامحدود. پس از تأیید پرداخت، سرور به‌صورت خودکار راه‌اندازی می‌شود و می‌توانید فوراً از ترمینال وب پنل کاربری به آن وصل شوید. در حال حاضر پرداخت با تتر (USDT روی شبکهٔ TRC20) انجام می‌شود؛ یعنی خرید VPS با تتر بدون نیاز به کارت بانکی بین‌المللی ممکن است. اگر سؤالی داشتید، از چت آنلاین سایت یا با ثبت تیکت پشتیبانی با ما در تماس باشید.