سرور مجازی مناسب ربات تلگرام چه مشخصاتی دارد؟
ربات تلگرام یک سرویس سبک اما همیشهروشن است. این مقاله میگوید چه مشخصاتی برایش لازم است، کجا معمولاً به مشکل میخورد و چطور آن را پایدار اجرا کنید.
ربات تلگرام از نظر منابع یک سرویس سبک است، اما یک ویژگی دارد که انتخاب زیرساخت را تعیین میکند: باید همیشه روشن بماند. همین یک نیاز است که هاست اشتراکی و کامپیوتر خانگی را از گزینهها خارج میکند و سرور مجازی را به انتخاب طبیعی تبدیل میکند. اگر با خود سرور مجازی آشنا نیستید، سرور مجازی چیست را ببینید.
چه مقدار منابع لازم است؟
برای اکثر رباتها، کوچکترین پلن کافی است:
- 1 هسته پردازنده — ربات بیشتر وقتش را منتظر پیام میماند، نه در حال پردازش.
- 1 گیگابایت حافظه — برای یک ربات ساده روی لینوکس کافی است.
- 20 گیگابایت فضا — برای کد و لاگ کافی است.
از این نقطه بالاتر بروید اگر:
- ربات پایگاه داده دارد و تعداد کاربرانش زیاد است.
- ربات فایل پردازش میکند — تصویر، صدا، ویدئو. این کار حافظه و پردازنده میخواهد.
- چند ربات را روی یک سرور اجرا میکنید.
- سرور Bot API محلی را خودتان اجرا میکنید (پایینتر توضیح داده شده) که فایلها را روی دیسک خود سرور نگه میدارد.
اگر بین دو اندازه مردد هستید، سرور مجازی با رم 1 یا 2 گیگابایت معیار انتخاب را با دستورهای اندازهگیری توضیح میدهد.
سقف واقعی ربات، محدودیتهای تلگرام است
برای بیشتر رباتها، پیش از آنکه پردازنده یا حافظه سرور کم بیاید، به محدودیتهای خود تلگرام میرسید. طبق پرسشهای متداول رسمی رباتها:
- ربات در حالت عادی نمیتواند بیش از حدود 30 پیام در ثانیه بهصورت انبوه بفرستد (مگر با فعال کردن ارسال انبوه پولی در BotFather که شرایط خودش را دارد).
- در یک گفتگوی خصوصی، بهتر است بیش از یک پیام در ثانیه نفرستید.
- در یک گروه، ربات نمیتواند بیش از 20 پیام در دقیقه بفرستد.
پس اگر ربات شما برای هزاران کاربر پیام همگانی میفرستد، سرور قویتر آن را سریعتر نمیکند؛ باید ارسال را در صف بگذارید و آهستهتر بفرستید.
محدودیت حجم فایل هم مهم است: طبق مستندات Bot API، ربات از طریق سرورهای تلگرام حداکثر فایلهای حدود 20 مگابایتی را دانلود و حدود 50 مگابایتی را آپلود میکند. اگر ربات شما فایل بزرگتر جابهجا میکند، باید سرور Bot API محلی را اجرا کنید که دانلود بدون سقف و آپلود تا 2000 مگابایت را ممکن میکند — و آنوقت فضای دیسک و ترافیک سرور اهمیت پیدا میکند.
polling یا webhook؟
دو روش برای دریافت پیام وجود دارد و انتخابشان روی نیاز سرور اثر میگذارد. طبق مستندات Bot API این دو روش با هم قابل استفاده نیستند و پیامهای دریافتنشده حداکثر 24 ساعت روی سرور تلگرام نگه داشته میشوند؛ اگر ربات بیش از یک روز خاموش بماند، پیامهای قدیمیتر از دست میروند.
polling (متد getUpdates) یعنی ربات مدام از تلگرام میپرسد پیام جدیدی هست یا نه. راهاندازیاش سادهتر است، آدرس عمومی قابل دسترس و گواهی TLS لازم ندارد و پشت هر اتصالی کار میکند.
webhook (متد setWebhook) یعنی تلگرام خودش پیام را به آدرس شما میفرستد. کارآمدتر است، اما شرایطی دارد:
- آدرس باید HTTPS باشد و فقط روی یکی از پورتهای
443،80،88یا8443. - گواهی TLS لازم است. گواهی معتبر روی یک دامنه سادهترین راه است؛ تلگرام گواهی خودامضا را هم میپذیرد به شرط اینکه فایل کلید عمومیاش را هنگام
setWebhookبارگذاری کنید. - با پارامتر
secret_tokenمیتوانید رمزی تعیین کنید که تلگرام در سربرگX-Telegram-Bot-Api-Secret-Tokenهر درخواست میفرستد؛ درخواستهایی را که این سربرگ را ندارند رد کنید.
برای شروع، polling معمولاً انتخاب منطقیتری است. اگر تعداد پیامها زیاد شد، به webhook مهاجرت کنید.
یک دام رایج: تا وقتی webhook تنظیم شده باشد، getUpdates کار نمیکند. اگر ربات را از webhook به polling برگرداندهاید و پیامی نمیرسد، اول webhook را حذف کنید (متد deleteWebhook).
موقعیت سرور
ربات با سرورهای تلگرام حرف میزند، نه مستقیم با کاربران. پس سرور باید جایی باشد که بدون وقفه به api.telegram.org دسترسی دارد، و موقعیتش را بر اساس مسیر شبکه تا سرویسهای تلگرام انتخاب کنید، نه بر اساس محل کاربران ربات. سرورهای مجازی تاپگیفت در دو موقعیت آمریکا و ترکیه عرضه میشوند. راهنمای انتخاب کشور این موضوع را بیشتر باز میکند.
اولین آزمایش روی سرور
قبل از اجرای کد ربات، مطمئن شوید سرور به تلگرام میرسد و توکن درست است. متد getMe اطلاعات ربات را برمیگرداند:
curl -s "https://api.telegram.org/bot$BOT_TOKEN/getMe"
(قبلش توکن را در متغیر BOT_TOKEN گذاشته باشید.) اگر پاسخ با "ok":true شروع شد، مسیر شبکه و توکن هر دو درستاند. برای دیدن اینکه webhook تنظیم شده یا نه:
curl -s "https://api.telegram.org/bot$BOT_TOKEN/getWebhookInfo"
اگر فیلد url خالی نیست، webhook فعال است و polling کار نخواهد کرد.
چطور پایدار نگهش دارم؟
این مهمترین بخش است و بیشتر رباتهایی که «گاهی قطع میشوند» دقیقاً همین را ندارند. اجرای ربات با python main.py داخل ترمینال یعنی با بسته شدن جلسه SSH، ربات هم میرود.
راه درست، تبدیل ربات به یک سرویس سیستمی است تا:
- بعد از راهاندازی مجدد سرور خودش بالا بیاید،
- اگر خطا داد دوباره اجرا شود،
- و لاگهایش جایی ثبت شود که بعداً بشود خواند.
توکن را در یک فایل جدا با دسترسی محدود بگذارید، مثلاً /home/deploy/mybot/.env با یک خط BOT_TOKEN=... و دسترسی chmod 600، و در فایل سرویس systemd آن را با EnvironmentFile= معرفی کنید. در کد پایتون هم با os.environ["BOT_TOKEN"] بخوانیدش. مراحل کامل ساخت سرویس، از محیط مجازی تا لاگ، را در اجرای پروژه پایتون روی سرور مجازی لینوکس نوشتهایم.
بخش اصلی فایل سرویس برای یک ربات پایتونی این شکلی است (مسیرها را با پوشه پروژه خودتان عوض کنید):
[Service]
User=deploy
WorkingDirectory=/home/deploy/mybot
EnvironmentFile=/home/deploy/mybot/.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/home/deploy/mybot/.venv/bin/python /home/deploy/mybot/bot.py
Restart=always
RestartSec=5
Restart=always ربات را بعد از هر خروج — مثلاً وقتی برنامه بهخاطر قطع موقت شبکه با خطا متوقف شود — پنج ثانیه بعد دوباره اجرا میکند.
فقط یک نسخه اجرا کنید. اگر دو نسخه از ربات با یک توکن همزمان polling کنند — مثلاً یکی روی سرور و یکی روی لپتاپ برای آزمایش — تلگرام یکی را با خطای Conflict: terminated by other getUpdates request رد میکند. برای آزمایش، یک ربات جداگانه با توکن جدا بسازید.
چند اشتباه رایج
- توکن ربات در کد. توکن را در متغیر محیطی بگذارید، نه داخل فایلی که ممکن است در مخزن عمومی قرار بگیرد. طبق راهنمای رسمی رباتها، هر کسی توکن را داشته باشد میتواند ربات را کنترل کند؛ اگر لو رفت، از BotFather توکن تازه بگیرید تا توکن قبلی باطل شود.
- لاگ بدون چرخش. فایل لاگی که مدام بزرگ میشود، بالاخره دیسک را پر میکند و سرور را از کار میاندازد. اگر از ژورنال سیستم استفاده کنید، چرخش لاگ از قبل مدیریت میشود.
- بدون پشتیبانگیری از پایگاه داده. اگر ربات داده کاربران را نگه میدارد، پشتیبانگیری منظم لازم است و نسخه پشتیبان باید بیرون از همان سرور نگه داشته شود.
- ارسال بدون صف. ارسال همگانی بدون رعایت سقف پیامها باعث خطای محدودیت نرخ از طرف تلگرام میشود؛ پیامها را در صف بگذارید.
- سرور بدون امنسازی اولیه. کارهای اولیه بعد از خرید را انجام دهید.
قوانین استفاده
استفاده از سرور باید با قوانین تاپگیفت، شرایط تأمینکننده و قوانین خود تلگرام سازگار باشد. رباتی که پیام انبوه ناخواسته میفرستد یا شرایط استفاده از سرویس را نقض میکند، میتواند باعث محدود شدن سرور شود.
پلنهای در دسترس با مشخصات کامل در صفحه خرید سرور مجازی است.