آموزش سرور

راه‌اندازی ربات تلگرام پایتون روی سرور مجازی؛ از صفر تا اجرای دائمی

تهیه: کلودیفای (نگارش با کمک هوش مصنوعی) · انتشار: · زمان مطالعه: ۵ دقیقه

آموزش سرورراه‌اندازی ربات تلگرامپایتون روی سرور مجازی؛از صفر تا اجرای دائمیمجلهٔ کلودیفایclodify.net/blog
پاسخ کوتاه

برای اجرای دائمی ربات تلگرام، یک سرور خارج ارزان (۱ هسته و ۰٫۵ تا ۱ گیگ رم برای اغلب ربات‌ها کافی است) بسازید، Python و محیط مجازی venv را نصب کنید، توکن را در فایل محیطی نگه دارید و ربات را به‌صورت سرویس systemd با Restart=always اجرا کنید تا پس از خطا یا ری‌استارت سرور خودکار بالا بیاید. لاگ‌ها را با journalctl ببینید.

کدام سرور برای ربات تلگرام مناسب است؟

  • سرور خارج: API تلگرام از داخل ایران به‌طور پایدار در دسترس نیست؛ پس ربات را روی سرور خارج اجرا کنید.
  • منابع: برای ربات‌های معمولی ۱ هسته و ۰٫۵ تا ۱ گیگ رم کافی است. اگر دیتابیس یا پردازش سنگین دارید، ۲ گیگ رم.
  • لوکیشن: اروپا (آلمان، هلند) یا آمریکا؛ برای ربات تفاوت چندانی ندارد.

ارزان‌ترین سرور خارج کلودیفای امروز ۳٬۱۰۰ تومان در ساعت است. سرورهای خارج

گام ۱: آماده‌سازی سرور

پس از ساخت سرور (Ubuntu 24.04) و اجرای چک‌لیست امنیتی:

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

یک کاربر جدا برای ربات بسازید:

sudo adduser --system --group --home /opt/mybot mybot

گام ۲: انتقال کد

با git:

sudo -u mybot git clone https://github.com/USER/REPO.git /opt/mybot/app

یا با scp از رایانهٔ خودتان:

scp -r ./mybot root@SERVER_IP:/opt/mybot/app
sudo chown -R mybot:mybot /opt/mybot

گام ۳: محیط مجازی و وابستگی‌ها

cd /opt/mybot
sudo -u mybot python3 -m venv venv
sudo -u mybot ./venv/bin/pip install -r app/requirements.txt

گام ۴: توکن و متغیرهای محیطی

توکن ربات را هرگز داخل کد ننویسید. فایل /opt/mybot/.env بسازید:

BOT_TOKEN=123456:ABC-YOUR-TOKEN
sudo chown mybot:mybot /opt/mybot/.env
sudo chmod 600 /opt/mybot/.env

در کد پایتون: os.environ["BOT_TOKEN"].

گام ۵: سرویس systemd

فایل /etc/systemd/system/mybot.service:

[Unit]
Description=My Telegram Bot
After=network-online.target
Wants=network-online.target

[Service]
User=mybot
WorkingDirectory=/opt/mybot/app
EnvironmentFile=/opt/mybot/.env
ExecStart=/opt/mybot/venv/bin/python bot.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

فعال‌سازی:

sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo systemctl status mybot
اجرا و پایشاتصالsystemdRestart=alwaysربات پایتونvenvAPI تلگرامpolling یا webhookاجرا و پایشاتصالsystemdRestart=alwaysربات پایتونvenvAPI تلگرامpolling یا webhook
شکل ۱ systemd ربات را بعد از ری‌بوت یا کرش دوباره بالا می‌آورد.

گام ۶: لاگ‌ها

journalctl -u mybot -f
journalctl -u mybot --since "1 hour ago"
root@server: ~
$ sudo systemctl enable --now mybot$ systemctl status mybot   Active: active (running)$ journalctl -u mybot -f$ 
شکل ۲ فعال‌سازی دائمی سرویس و دنبال کردن زندهٔ لاگ‌ها.

گام ۷: به‌روزرسانی ربات

cd /opt/mybot/app && sudo -u mybot git pull
sudo -u mybot ../venv/bin/pip install -r requirements.txt
sudo systemctl restart mybot

Webhook یا Polling؟

  • Polling: ساده‌ترین روش؛ نیازی به دامنه و SSL ندارد. برای اغلب ربات‌ها کافی است.
  • Webhook: برای ربات‌های پرترافیک بهینه‌تر است؛ به دامنه، Nginx و گواهی SSL نیاز دارد.

خلاصهٔ مراحل

  1. ساخت سرور خارج ارزان با Ubuntu و اجرای چک‌لیست امنیتی.
  2. نصب Python، venv و git و ساخت کاربر جدا برای ربات.
  3. انتقال کد و نصب وابستگی‌ها در محیط مجازی.
  4. ذخیرهٔ توکن در فایل .env با دسترسی محدود.
  5. ساخت سرویس systemd با Restart=always و فعال‌سازی آن.
  6. بررسی لاگ‌ها با journalctl.

نمونهٔ ربات حداقلی برای تست

اگر هنوز کدی ندارید و می‌خواهید کل مسیر را تست کنید، این ربات ساده با کتابخانهٔ python-telegram-bot پیام‌ها را برمی‌گرداند:

# /opt/mybot/app/bot.py
import os
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, ContextTypes, filters

async def start(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("سلام! ربات روی سرور اجرا می‌شود.")

async def echo(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text(update.message.text)

app = Application.builder().token(os.environ["BOT_TOKEN"]).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
app.run_polling()
# requirements.txt
python-telegram-bot>=21

راه‌اندازی Webhook با Nginx (اختیاری)

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

location /tg-webhook-SECRET {
    proxy_pass http://127.0.0.1:8443;
    proxy_set_header Host $host;
}

در کد، به‌جای run_polling از run_webhook با listen="127.0.0.1"، port=8443 و آدرس عمومی https://bot.example.com/tg-webhook-SECRET استفاده کنید. بخش SECRET را یک رشتهٔ تصادفی بگذارید تا آدرس قابل حدس نباشد.

اجرای ربات با Docker (روش جایگزین)

اگر چند ربات یا سرویس روی یک سرور دارید، Docker مدیریت را ساده‌تر می‌کند:

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "bot.py"]
# docker-compose.yml
services:
  bot:
    build: .
    env_file: .env
    restart: unless-stopped

نصب داکر در راهنمای Docker روی Ubuntu 24.04 آمده است. در این روش restart: unless-stopped همان نقش Restart=always در systemd را دارد.

پایش و نگه‌داری

  • مصرف منابع: با systemctl status mybot مصرف رم سرویس را ببینید؛ اگر مدام بالا می‌رود، احتمال نشت حافظه وجود دارد (رفع مشکل پر شدن رم).
  • حجم لاگ: لاگ‌های journald به‌مرور بزرگ می‌شوند؛ با sudo journalctl --vacuum-size=200M حجم را محدود کنید.
  • بکاپ دیتابیس ربات: اگر ربات از SQLite یا دیتابیس دیگری استفاده می‌کند، بکاپ روزانه با cron بگیرید.
  • امنیت توکن: توکن را هرگز در گیت‌هاب یا مخزن عمومی قرار ندهید؛ اگر لو رفت، از BotFather توکن جدید بگیرید.

هزینهٔ نگه‌داری ربات

بیشتر ربات‌های متوسط با یک سرور خارج کوچک (۱ گیگ رم) به‌خوبی اجرا می‌شوند. ارزان‌ترین سرور خارج کلودیفای ۳٬۱۰۰ تومان در ساعت است؛ برای مقایسهٔ گزینه‌ها صفحهٔ سرور برای ربات تلگرام را ببینید.

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

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

دسترسی سرورهای داخل ایران به API تلگرام پایدار نیست. ربات را روی سرور خارج اجرا کنید.

ربات بعد از ری‌استارت سرور خودکار اجرا می‌شود؟

بله؛ با systemctl enable سرویس هنگام بوت اجرا می‌شود و با Restart=always پس از خطا هم دوباره بالا می‌آید.

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

تا زمانی که رم و پردازنده کافی باشد، هر تعداد؛ برای هر ربات یک سرویس systemd جدا بسازید.

Polling بیشتر از Webhook منابع مصرف می‌کند؟

Polling مدام از تلگرام می‌پرسد «پیام جدید داری؟»؛ اما مصرف آن برای ربات‌های معمولی ناچیز است. تفاوت فقط در ربات‌های بسیار پرترافیک محسوس می‌شود.

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

بسته به رم و بار هر ربات. برای هر ربات یک سرویس systemd یا کانتینر جدا بسازید؛ ربات‌های سبک هر کدام معمولاً چند ده مگابایت رم مصرف می‌کنند.

ربات Node.js را هم همین‌طور اجرا کنم؟

بله؛ در فایل سرویس، ExecStart را به /usr/bin/node /opt/mybot/app/index.js تغییر دهید. بقیهٔ مراحل یکسان است.

آماده‌اید؟ سرورتان را بسازید.

از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی

سرورتان را همین حالا بسازید.

ساعتی بپردازید. هر وقت خواستید حذف کنید.