ساخت ربات تلگرام بدون سرور؛ آموزش کامل Telegram Serverless

ربات سرورلس تلگرام؛ بررسی tgcloud و جایگزین‌ها

اگر تجربه توسعه ربات رو داشته باشید، احتمالا با دردسرهای همیشگی آن هم آشنا هستید؛ از خرید و راه‌اندازی VPS گرفته تا تنظیم SSL، مدیریت Webhook و نگرانی بابت از دسترس خارج شدن سرور.

تلگرام حالا با معرفی Telegram Serverless و ابزار tgcloud تلاش کرده این دردسرها رو تا حد زیادی حذف کنه. ما به شما نشان می‌دهیم که این سرویس دقیقا چگونه کار می‌کنه، چه مزایا و محدودیت‌هایی دارد و در چه شرایطی هنوز استفاده از سرویس‌هایی مثل Cloudflare Workers انتخاب بهتری است. هدف این راهنما این است که با شناخت هر دو روش، بتوانید مناسب‌ترین گزینه را برای پروژه خود انتخاب کنید.

Telegram Serverless چیست؟

Telegram Serverless سرویس رسمی تلگرام برای اجرای کدهای بک‌اند ربات‌ها و مینی‌اپ‌ها روی زیرساخت خود تلگرام است. یعنی دیگه لازم نیست برای اجرای ربات، سرور مجزا تهیه کنید یا درگیر تنظیمات هاست شوید.

در این معماری:

  • کدهای جاوااسکریپت داخل محیطی ایزوله به نام V8 Sandbox اجرا می‌شوند.
  • این محیط در کنار سرورهای Bot API و پایگاه‌داده داخلی مبتنی بر SQLite قرار گرفته است؛ بنابراین ارتباط بین بخش‌های مختلف با کمترین تأخیر انجام می‌شود.
  • برای انتشار نسخه جدید پروژه هم کافی است دستور npx tgcloud push را اجرا کنید. بعد از آن، کد مستقیما روی زیرساخت تلگرام قرار می‌گیرد و دیگر خبری از کانتینر، VPS یا تنظیمات پیچیده هاست نیست.

قبل از اینکه تلگرام این سرویس را معرفی کند، وقتی از ربات سرورلس صحبت می‌شد، معمولا منظور اجرای ربات روی سرویس‌هایی مثل Cloudflare Workers یا AWS Lambda بود. این روش هنوز هم کاملا کاربردی است و در ادامه مقاله آن را با راهکار رسمی تلگرام مقایسه می‌کنیم.

چرا خیلی از توسعه‌دهنده‌ها از سرورهای سنتی خسته شده‌اند؟

اگه تا امروز حتی یک ربات تلگرامی توسعه داده باشید، احتمالا این مراحل برایتان آشناست:

  1. خرید یا اجاره یک VPS و پرداخت هزینه ماهانه.
  2. نصب Node.js و آماده کردن محیط اجرا.
  3. راه‌اندازی دامنه، دریافت SSL و تنظیم Webhook.
  4. نصب و مدیریت یک پایگاه‌داده مجزا.
  5. استفاده از ابزارهایی مثل PM2 برای اینکه ربات همیشه فعال بماند.
  6. رسیدگی به مشکلاتی مثل قطعی سرور، پر شدن فضای دیسک یا افزایش ناگهانی ترافیک.

برای پروژه‌های کوچک یا استارتاپی، بخش زیادی از زمان صرف مدیریت زیرساخت می‌شه؛ زمانی که می‌تونه صرف توسعه قابلیت‌های اصلی ربات بشه.

به همین دلیل، راهکارهای Serverless محبوب شدند. امروز هم دو مسیر اصلی پیش روی توسعه‌دهنده‌ها قرار داره:

  • راهکار رسمی تلگرام که کد رو مستقیما روی زیرساخت خود تلگرام اجرا می‌کند.
  • راهکارهای شخص ثالث مثل Cloudflare Workers یا AWS Lambda که سال‌هاست برای اجرای ربات‌های تلگرامی استفاده می‌شوند.

در ادامه هر دو روش رو بررسی می‌کنیم تا مشخص شه هر کدام برای چه نوع پروژه‌ای مناسب‌تر هستند.

Telegram Serverless چگونه کار می‌کند؟

بر اساس مستندات رسمی تلگرام، این سرویس چند بخش اصلی داره که کنار هم اجرای ربات را ساده‌تر می‌کنند.

اجرای کد با V8 Isolate

هر بار که کاربر پیامی ارسال می‌کنه، کد ربات داخل یک محیط سبک و ایزوله اجرا می‌شه؛ محیطی که از نظر ساختار، شباهت زیادی به موتور اجرای Cloudflare Workers یا مرورگر Chrome داره.

از اونجایی که این محیط داخل زیرساخت تلگرام قرار گرفته، ارتباط با Bot API و پایگاه‌داده با کمترین میزان تأخیر انجام می‌شه.

دسترسی مستقیم به Bot API

دیگر نیازی نیست تنظیمات اولیه پیچیده یا مدیریت دستی توکن‌ها رو انجام بدید. SDK رسمی تلگرام دسترسی به Bot API رو ساده کرده و می‌توانید با دستوراتی مانند api.sendMessage پیام ارسال کنید.

پایگاه‌داده داخلی SQLite

برای هر ربات یک پایگاه‌داده SQLite اختصاصی در نظر گرفته می‌شه که اطلاعات رو به‌صورت دائمی نگهداری می‌کنه. برای اجرای کوئری‌ها هم یک DSL در اختیار توسعه‌دهنده قرار گرفته که از نظر تجربه کاربری شباهت زیادی به ORMهایی مثل Drizzle داره.

ارتباط با سرویس‌های خارجی

اگه لازم باشه ربات به سرویس‌هایی مثل OpenAI یا هر API دیگری متصل شه، می‌تونید از قابلیت fetch موجود در SDK استفاده کنید و درخواست‌های HTTP رو بدون نیاز به کتابخانه اضافه ارسال کنید.

ابزار خط فرمان tgcloud

ساخت پروژه، بررسی تغییرات فایل‌ها، انتشار نسخه جدید و حتی مدیریت تغییرات پایگاه‌داده، همگی از طریق ابزار tgcloud انجام می‌شه. در نتیجه بخش زیادی از فرایند استقرار پروژه ساده‌تر از قبل خواهد بود.

مدیریت از طریق BotFather

برخی تنظیمات مدیریتی، مثل دسترسی‌های پروژه، وضعیت Handlerها یا اطلاعات پایگاه‌داده، از طریق BotFather هم در دسترس هستند و بدون ورود به پنل جداگانه می‌توان آن‌ها رو مدیریت کرد.

جریان داده در Telegram Serverless

				
					کاربر پیام ارسال می‌کند
        │
        ▼
سرورهای تلگرام
(مدیریت خودکار Webhook)
        │
        ▼
Telegram Serverless Runtime
(V8 Isolate)
        │
        ▼
پایگاه‌داده داخلی SQLite
        │
        ▼
Bot API داخلی
        │
        ▼
ارسال پاسخ به کاربر
				
			

تفاوت مهم با روش‌های قدیمی

یکی از تغییرات مهم Telegram Serverless اینه که دیگه لازم نیست خودتون آدرس Webhook رو ثبت یا به‌روزرسانی کنید. بعد از انتشار پروژه، تلگرام به‌صورت خودکار هندلرهای تعریف‌شده رو شناسایی و Webhook رو بر همون اساس مدیریت می‌کنه.

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

وضعیت انتشار؛ آیا الان می‌توان از Telegram Serverless استفاده کرد؟

معماری Telegram Serverless و نحوه اجرای ربات بدون سرور

اگر بخواهیم واقع‌بین باشیم، هنوز نه برای همه کاربران.

تلگرام مستندات این سرویس رو منتشر کرده و ابزارهای موردنیاز هم در دسترس هستند، اما فعال‌سازی Telegram Serverless به‌صورت مرحله‌ای انجام می‌شود. یعنی ممکن است این قابلیت برای یک حساب کاربری فعال باشد، اما برای حساب دیگری هنوز نمایش داده نشه.

بخشوضعیت
مستندات رسمی Telegramدر دسترس برای همه
ابزار خط فرمان tgcloudبدون محدودیت قابل نصب و استفاده 
دستور tgcloud loginاجرا می‌شه و منتظر دریافت کلید دسترسی می‌مونه
منوی Serverless در BotFatherهنوز برای بسیاری از کاربران فعال نشده 
دریافت CLI Access Tokenفقط زمانی امکان‌پذیر است که منوی Serverless در BotFather برای حساب شما فعال باشد.
دسترسی کامل به سرویس در حال عرضه مرحله‌ای (Gradual Rollout) است.

تجربه ما از تست این قابلیت

ما این سرویس رو با چند ربات و چند حساب کاربری مختلف آزمایش کردیم. ابزار tgcloud بدون مشکل نصب و اجرا شد و فرآیند ورود نیز تا مرحله دریافت توکن پیش رفت، اما منوی Serverless هنوز در BotFather برای حساب‌های ما نمایش داده نشد.

بنابراین اگi شما هم هنگام اجرای tgcloud login متوقف شدید و نتونستید توکن دریافت کنید، احتمالا مشکل از تنظیمات پروژه یا سیستم شما نیست. کافی است منتظر بمونید تا تلگرام این قابلیت رو برای حساب کاربری‌تان فعال کند.

دو توکن متفاوت که نباید با هم اشتباه گرفته شوند

یکی از اشتباه‌های رایج هنگام کار با Telegram Serverless، یکسان در نظر گرفتن Bot API Token و CLI Access Token است؛ در حالی که این دو کاربرد کاملا متفاوتی دارند.

ویژگیBot API TokenCLI Access Token
قالب123456:AA...app<id>:<secret>
کاربردارسال پیام و استفاده از Bot APIاتصال ابزار tgcloud به زیرساخت تلگرام
محل دریافتBotFather → API TokenBotFather → Serverless → CLI Access
محل نگهداریمتغیرهای محیطی یا محیط امنفایل .tgcloud/credentials
استفاده در CI/CDمتغیرهای دلخواهمتغیر TGCLOUD_TOKEN

یک تفاوت مهم

اگر از Telegram Serverless استفاده کنید، معمولا هنگام نوشتن هندلرهای ربات نیازی به وارد کردن Bot API Token ندارید. SDK رسمی به‌صورت خودکار شیء api رو در اختیار شما قرار می‌ده و ارتباط با Bot API برقراره.

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

ساختار پروژه در Telegram Serverless

بعد از اجرای دستور زیر:

				
					npm create @tgcloud/bot my-bot
				
			

پروژه‌ای مشابه ساختار زیر ایجاد می‌شود:

				
					example_bot/
├─ docs/
│  └─ tgcloud-sdk.md
├─ handlers/
│  ├─ message.js
│  └─ callback_query.js
├─ lib/
│  └─ internal/util.js
├─ AGENTS.md
├─ package.json
├─ schema.js
└─ .tgcloud/
				
			

هر بخش چه کاری انجام می‌ده؟

پوشه handlers

این مهم‌ترین بخش پروژه است. هر فایل داخل این پوشه مسئول رسیدگی به یک نوع رویداد در تلگرام است.

برای مثال:

  • message.js پیام‌های متنی را مدیریت می‌کنه.
  • callback_query.js درخواست‌های مربوط به دکمه‌های شیشه‌ای (Inline Keyboard) رو پردازش می‌کنه.

اگه برای یک نوع رویداد هندلری تعریف نکرده باشید، تلگرام اون رویداد رو اجرا نمی‌کنه و هیچ پردازشی انجام نمی‌شه.

پوشه lib

کدهای مشترک پروژه در این بخش قرار می‌گیرند؛ مثل توابع کمکی، ابزارهای عمومی یا منطق‌هایی که قراره در چند هندلر استفاده بشه.

برخلاف پوشه handlers، داخل lib می‌تونید هر تعداد زیرپوشه که نیاز دارید ایجاد کنید.

فایل schema.js

در این فایل ساختار پایگاه‌داده تعریف می‌شه؛ یعنی جدول‌ها، ستون‌ها و ارتباط بین داده‌ها. تمام تغییرات مربوط به دیتابیس از همین بخش مدیریت می‌شه.

پوشه .tgcloud

مسیر پردازش پیام در Telegram Serverless از کاربر تا Bot API

این پوشه شامل اطلاعات موردنیاز ابزار tgcloud؛ مثل فایل‌های تنظیمات، کش و اطلاعات ورود. بهتره فایل‌های داخل این پوشه رو به‌صورت دستی تغییر ندید و اون رو به سیستم مدیریت نسخه (Git) هم اضافه نکنید.

محدودیت استفاده از پکیج‌های npm

یکی از تفاوت‌های Telegram Serverless با اجرای ربات روی یک سرور معمولی، محدودیت در استفاده از پکیج‌های زمان اجرا است.

در این محیط نمی‌تونید هر کتابخانه‌ای رو از npm وارد پروژه کنید. در عمل، بیشتر کدها باید با استفاده از SDK رسمی تلگرام و فایل‌های داخلی پروژه نوشته شوند.

برای مثال، import کردن فایل‌هایی مثل موارد زیر مشکلی نداره:

				
					import { db } from "schema";
import { cart } from "lib/cart";
				
			

اما استفاده از بسیاری از کتابخانه‌های سنگین npm در زمان اجرا پشتیبانی نمی‌شه. این محدودیت باعث شده محیط اجرای Telegram Serverless سبک‌تر، سریع‌تر و قابل پیش‌بینی‌تر باشه.

دیتابیس داخلی SQLite؛ بدون نیاز به نصب و راه‌اندازی

یکی از امکانات کاربردی Telegram Serverless، پایگاه‌داده داخلی SQLite است. هر رباتی که ایجاد می‌کنید، یک دیتابیس اختصاصی خودش رو داره و دیگر لازم نیست برای پروژه‌های کوچک و متوسط سراغ نصب MySQL، PostgreSQL یا سرویس‌های جداگانه برید.

برای تعریف جدول‌ها و اجرای کوئری‌ها هم تلگرام یک API طراحی کرده که از نظر ظاهر و نحوه استفاده، شباهت زیادی به Drizzle ORM داره. به همین دلیل اگه قبلا با ORMها کار کرده باشید، یادگیری اون زمان زیادی از شما نمی‌گیره.

تعریف جدول و ذخیره اطلاعات

در مثال زیر یک جدول برای شمارش تعداد پیام‌های هر کاربر تعریف شده است.

فایل schema.js

				
					import { table, integer } from 'sdk/db';

export const counters = table('counters', {
  chatId: integer('chat_id').primaryKey(),
  seen: integer('seen').notNull().default(0),
});
				
			

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

فایل handlers/message.js

				
					import { api, db } from 'sdk';
import { counters } from 'schema';
import { sql } from 'sdk/db';

export default async function (message) {
  const [row] = await db
    .insert(counters)
    .values({
      chatId: message.chat.id,
      seen: 1,
    })
    .onConflictDoUpdate({
      target: counters.chatId,
      set: {
        seen: sql`${counters.seen} + 1`,
      },
    })
    .returning()
    .run();

  await api.sendMessage({
    chat_id: message.chat.id,
    text: `سلام! تا الان ${row.seen} تا پیام برام فرستادی.`,
  });
}
				
			

نکته جالب اینجاست که برای ارسال پیام، نیازی به وارد کردن Bot API Token داخل کد نیست و SDK این ارتباط را به‌صورت خودکار مدیریت می‌کند.

چرا push و migrate دو دستور جدا هستند؟

یکی از تصمیم‌های هوشمندانه تلگرام اینه که انتشار کد و تغییر ساختار دیتابیس را از هم جدا کرده.

در بسیاری از پروژه‌ها، تغییر یک جدول امکان داره باعث از بین رفتن اطلاعات شه. به همین دلیل Telegram Serverless اجازه نمی‌ده هر بار که کد جدید منتشر می‌شه، ساختار دیتابیس هم بدون بررسی تغییر کنه.

در عمل، هر دستور وظیفه مشخصی داره:

  • npx tgcloud push فقط نسخه جدید کد رو منتشر می‌کنه. اگر تغییری در ساختار دیتابیس وجود داشته باشه، صرفا به شما اطلاع می‌ده.
  • npx tgcloud migrate تغییرات مربوط به دیتابیس را روی نسخه اصلی اعمال می‌کند.

این جداسازی باعث می‌شه کنترل بیشتری روی تغییرات داشته باشید و احتمال از دست رفتن اطلاعات به حداقل برسه.

تلگرام تغییرات دیتابیس را چطور دسته‌بندی می‌کند؟

ساختار پوشه‌ها و فایل‌های پروژه در Telegram Serverless

هنگام اجرای Migration، سیستم تغییرات را بر اساس میزان ریسک به سه گروه تقسیم می‌کنه.

Safe

تغییرات کم‌خطر مثل:

  • ایجاد جدول جدید
  • اضافه کردن ستون جدید

این دسته معمولا بدون مشکل اجرا می‌شه.

Warning

تغییراتی که ممکن است باعث حذف اطلاعات شوند؛ مانند:

  • حذف ستون
  • حذف ایندکس

در این شرایط، سیستم قبل از اعمال تغییر از شما تأیید می‌گیره.

Manual

بعضی تغییرات رو سیستم نمی‌تونه به‌صورت خودکار انجام بده. در این حالت، Telegram Serverless فقط راهکار پیشنهادی رو نمایش می‌دهد و اجرای تغییرات بر عهده خود توسعه‌دهنده است.

یک محدودیت مهم

اگه قبلا با SQLite یا دیتابیس‌های رابطه‌ای کار کرده باشید، احتمالا انتظار دارید بتونید از Foreign Key استفاده کنید. اما در Telegram Serverless این قابلیت پشتیبانی نمی‌شه.

یعنی اگر بین جدول‌های پروژه رابطه‌ای وجود داره، باید اون رو  در منطق برنامه مدیریت کنید و نباید روی محدودیت‌های دیتابیس برای حفظ این ارتباط حساب باز کنید.

این تصمیم احتمالا برای سبک نگه داشتن محیط اجرا و افزایش سرعت پردازش گرفته شده است. برای بیشتر ربات‌های تلگرامی هم معمولا مشکل خاصی ایجاد نمی‌کنه، اما اگر پروژه شما ساختار داده پیچیده‌ای داره، بهتر است این محدودیت رو از همان ابتدا در طراحی دیتابیس در نظر بگیرید.

توسعه ربات با کمک هوش مصنوعی (AI)

یکی از ویژگی‌های جالب Telegram Serverless اینه که از همان ابتدا برای همکاری با ابزارهای برنامه‌نویسی مبتنی بر هوش مصنوعی طراحی شده. اگه از دستیارهایی مثل کلاد کد و کرسر یا ابزارهای مشابه استفاده می‌کنید، این پلتفرم تجربه روان‌تری نسبت به بسیاری از فریم‌ورک‌های دیگه در اختیارتان قرار می‌ده.

استفاده از دستیارهای کدنویسی

بعد از ساخت پروژه، چند فایل به‌صورت خودکار ایجاد می‌شه که فقط برای مستندسازی نیستند؛ این فایل‌ها به ابزارهای هوش مصنوعی کمک می‌کنند ساختار پروژه رو بهتر درک کنند.

برای مثال:

  • AGENTS.md شامل قوانین، ساختار پروژه و دستورالعمل‌های توسعه است.
  • فایل‌های داخل پوشه docs هم مستندات SDK و متدهای قابل استفاده رو در اختیار ابزارهای هوش مصنوعی قرار می‌ده.

در نتیجه، وقتی از ابزارهایی مثل Cursor یا Claude Code کمک می‌گیرید، پیشنهادهای آن‌ها بیشتر با ساختار Telegram Serverless هماهنگ خواهد بود و معمولا نیاز به اصلاحات کمتری دارند.

اتصال به مدل‌های زبانی (LLM)

tgcloud CLI Commands for Telegram Bots

اگه قصد دارید یک چت‌بات مبتنی بر هوش مصنوعی بسازید، Telegram Serverless زیرساخت مناسبی برای این کار فراهم کرده است.

با استفاده از قابلیت fetch داخل SDK می‌توانید درخواست‌های HTTP رو به سرویس‌هایی مثل OpenAI یا سایر مدل‌های زبانی ارسال کنید.

یکی از مزیت‌های این SDK، پشتیبانی از Stream Reading است. یعنی پاسخ مدل می‌تونه به‌صورت تدریجی (توکن‌به‌توکن) دریافت شه؛ درست شبیه تجربه‌ای که هنگام استفاده از ChatGPT مشاهده می‌کنید.

البته این بخش محدودیت‌هایی هم دارد. در حال حاضر ارسال یا دریافت فایل‌های باینری حجیم پشتیبانی نمی‌شود و حجم پاسخ‌ها هم نباید از ۳۲ مگابایت بیشتر باشد.

دستورات پرکاربرد tgcloud

در استفاده روزمره، بیشتر کارها با همین چند دستور انجام می‌شود:

				
					npx tgcloud --version
npx tgcloud login
npx tgcloud push
npx tgcloud migrate
				
			

هر کدام از این دستورها وظیفه مشخصی داره:

دستورکاربرد
--versionنمایش نسخه نصب‌شده ابزار
loginاتصال پروژه محلی به حساب Telegram Serverless
pushانتشار نسخه جدید پروژه
migrateاعمال تغییرات دیتابیس

سایر دستورهای کاربردی

علاوه بر چهار دستور اصلی، tgcloud ابزارهای دیگه‌ای هم در اختیار توسعه‌دهنده قرار می‌ده.

دستورکاربرد
initایجاد ساختار اولیه پروژه
addساخت فایل‌های جدید مثل Handlerها
statusبررسی فایل‌هایی که تغییر کرده‌اند
diffنمایش تفاوت نسخه محلی و نسخه منتشرشده
runاجرای محلی پروژه برای تست
fetch / pullدریافت آخرین نسخه پروژه از فضای ابری
resetحذف تغییرات محلی و بازگشت به آخرین نسخه منتشرشده
webhookبررسی وضعیت Webhook پروژه

محدودیت‌های Telegram Serverless

با وجود امکانات جدید، این سرویس هنوز محدودیت‌هایی داره که بهتره قبل از شروع پروژه از اون‌ها مطلع باشید.

فقط JavaScript

در حال حاضر محیط اجرا بر پایه موتور V8 است و فقط از JavaScript پشتیبانی می‌کنه. بنابراین اگه پروژه شما با زبان‌هایی مثل Python، Go یا Rust نوشته شده باشه، نمی‌تونید همون کد رو مستقیما روی Telegram Serverless اجرا کنید.

محدودیت در استفاده از پکیج‌های npm

برخلاف اجرای پروژه روی Node.js، در این محیط امکان استفاده از بسیاری از پکیج‌های رایج npm وجود نداره. در عمل باید بیشتر منطق پروژه رو با استفاده از SDK رسمی تلگرام و فایل‌های داخلی خود پروژه پیاده‌سازی کنید.

محدودیت در کار با فایل‌ها

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

قیمت‌گذاری هنوز مشخص نیست

مقایسه Telegram Serverless، Cloudflare Workers، VPS و AWS Lambda

در حال حاضر محیط اجرا بر پایه موتور V8 است و فقط از JavaScript پشتیبانی می‌کند. بنابراین اگر پروژه شما با زبان‌هایی مثل Python، Go یا Rust نوشته شده باشد، نمی‌توانید همان کد را مستقیماً روی Telegram Serverless اجرا کنید.

Vendor Lock-in؛ نکته‌ای که نباید نادیده بگیرید

Telegram Serverless بسیاری از کارهای زیرساختی رو از دوش توسعه‌دهنده برمی‌داره، ولی این راحتی یک هزینه هم داره.

اگر پروژه رو بر پایه SDK اختصاصی تلگرام و دیتابیس داخلی آن توسعه دهید، مهاجرت به یک سرور شخصی یا حتی یک سرویس ابری دیگر ساده نخواهد بود.

به‌خصوص بخش مربوط به دیتابیس و دسترسی به APIها احتمالا نیاز به بازنویسی خواهد داشت. بنابراین اگه از همان ابتدا احتمال می‌دهید پروژه در آینده روی زیرساخت دیگری اجرا شود، بهتره این موضوع رو در طراحی معماری در نظر بگیرید.

اگر نخواهید از Telegram Serverless استفاده کنید

Telegram Serverless تنها گزینه موجود نیست. اگر به هر دلیلی مثلا نیاز به استفاده از کتابخانه‌های npm، زبان‌های برنامه‌نویسی دیگه یا محدودیت‌های دسترسی نتونید از سرویس رسمی تلگرام استفاده کنید، همچنان می‌تونید از سرویس‌های Serverless عمومی استفاده کنید. رایج‌ترین گزینه‌ها عبارت‌اند از:

  • Cloudflare Workers
  • Vercel Functions
  • AWS Lambda

در این روش، ربات روی زیرساخت یکی از این سرویس‌ها اجرا می‌شود و تلگرام فقط از طریق Webhook درخواست‌ها را برای آن ارسال می‌کند.

معماری سنتی در برابر Serverless

				
					معماری سنتی (VPS)

تلگرام
   │
   ▼
Webhook
   │
   ▼
سرور همیشه روشن
   │
   ▼
دیتابیس جداگانه


────────────────────────────


معماری Serverless

تلگرام
   │
   ▼
Runtime سرورلس
(در زمان درخواست اجرا می‌شود)
   │
   ▼
دیتابیس داخلی یا ابری
				
			

مقایسه دو معماری

ویژگیVPSServerless
راه‌اندازینیاز به پیکربندی سرورانتشار با چند دستور
هزینهپرداخت ماهانه ثابتپرداخت بر اساس میزان استفاده
مقیاس‌پذیرینیازمند مدیریت زیرساختافزایش ظرفیت به‌صورت خودکار
امنیتمدیریت با توسعه‌دهندهمدیریت توسط ارائه‌دهنده سرویس
Cold Startنداردممکن است چند میلی‌ثانیه تأخیر ایجاد شود

نمونه ربات روی Cloudflare Workers

اگه بخواهید از Cloudflare Workers استفاده کنید، ساختار پروژه کمی متفاوت خواهد بود. ابتدا یک جدول در دیتابیس D1 ایجاد می‌کنید:

				
					CREATE TABLE IF NOT EXISTS messages (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  chat_id INTEGER NOT NULL,
  text TEXT,
  created_at INTEGER NOT NULL
);
				
			

سپس داخل Worker، درخواست‌های ارسالی تلگرام را دریافت می‌کنید، اطلاعات موردنیاز را در D1 ذخیره می‌کنید و پاسخ را از طریق Bot API برمی‌گردانید.

				
					export default {
  async fetch(request, env) {
    if (request.method !== "POST") {
      return new Response("Only POST is supported");
    }

    const update = await request.json();
    const message = update.message;

    if (!message) {
      return new Response("OK");
    }

    const chatId = message.chat.id;
    const text = message.text ?? "";

    await env.DB.prepare(
      "INSERT INTO messages (chat_id, text, created_at) VALUES (?, ?, ?)"
    )
      .bind(chatId, text, Date.now())
      .run();

    await fetch(
      `https://api.telegram.org/bot${env.BOT_TOKEN}/sendMessage`,
      {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          chat_id: chatId,
          text: `پیام شما ذخیره شد: ${text}`,
        }),
      }
    );

    return new Response("OK");
  },
};
				
			

این مثال نشون می‌ده که معماری Serverless فقط به Telegram Serverless محدود نیست و با سرویس‌هایی مثل Cloudflare Workers هم می‌شه ربات‌های مقیاس‌پذیر و کم‌هزینه توسعه داد. تفاوت اصلی اینجاست که در Cloudflare مدیریت Webhook، توکن ربات و بخش‌هایی از زیرساخت همچنان بر عهده خود شما خواهد بود، در حالی که Telegram Serverless بخش زیادی از این مسئولیت‌ها را به‌صورت خودکار مدیریت می‌کنه.

مقایسه Telegram Serverless با سایر گزینه‌های میزبانی

اگر قصد دارید یک ربات تلگرامی جدید راه‌اندازی کنید یا زیرساخت پروژه فعلی‌تان رو تغییر دهید، احتمالا بین چند گزینه مختلف مردد خواهید بود. هر کدوم از این سرویس‌ها نقاط قوت و محدودیت‌های خودشان رو دارند و انتخاب بهترین گزینه به نیاز پروژه بستگی داره.

ویژگیTelegram ServerlessCloudflare WorkersVercelAWS Lambda
محیط اجراV8 Sandbox اختصاصی تلگرامV8 IsolateNode.js و Edge Runtimeکانتینرهای مبتنی بر زبان‌های مختلف
راه‌اندازی Webhookکاملاً خودکارنیاز به تنظیم دستینیاز به تنظیم دستینیاز به تنظیم دستی
دیتابیسSQLite داخلیD1 و سایر دیتابیس‌های Cloudflareسرویس‌های دیتابیس جداگانهDynamoDB و سرویس‌های AWS
پشتیبانی از پکیج‌هامحدود به SDK رسمیبسیاری از پکیج‌های سازگار با Edgeتقریباً بدون محدودیتبدون محدودیت
هزینههنوز اعلام نشدهاقتصادی با پلن رایگان مناسبپلن رایگان مناسبپرداخت بر اساس میزان مصرف
وابستگی به سرویسزیادمتوسطمتوسطکم تا متوسط

چه زمانی مهاجرت کنیم؟

پاسخ این سؤال برای همه پروژه‌ها یکسان نیست. بهتر است قبل از تصمیم‌گیری، وضعیت فعلی پروژه را در نظر بگیرید.

اگر ربات روی VPS اجرا می‌شود

اگه ربات شما فقط درخواست‌های کاربران رو پردازش می‌کنه و پردازش‌های طولانی یا سنگین مثل تبدیل ویدئو، پردازش تصویر یا محاسبات پیچیده نداره، مهاجرت به یک معماری Serverless می‌تواند هزینه نگهداری و دردسر مدیریت سرور رو تا حد زیادی کاهش ده.

چه Telegram Serverless رو انتخاب کنید و چه Cloudflare Workers، دیگه نیازی به مدیریت دائمی سرور، مانیتورینگ و به‌روزرسانی سیستم‌عامل نخواهید داشت.

اگر از Cloudflare Workers استفاده می‌کنید

در این حالت عجله‌ای برای مهاجرت وجود نداره. Cloudflare Workers سال‌هاست به بلوغ رسیده، مستندات کاملی داره و اکوسیستم اون پایداره. علاوه بر این، آزادی عمل بیشتری برای استفاده از کتابخانه‌ها و معماری‌های مختلف در اختیار شما قرار می‌ده.

اگر Telegram Serverless برای حساب شما فعال شده، می‌تونید ابتدا اون رو روی پروژه‌های آزمایشی امتحان کنید و بعد درباره مهاجرت پروژه‌های اصلی تصمیم بگیرید.

اگر ربات روی هاست اشتراکی اجرا می‌شود

این گروه بیشترین سود رو از مهاجرت می‌بره. هاست‌های اشتراکی معمولا برای اجرای دائمی ربات‌های تلگرامی طراحی نشدند و مشکلاتی مثل محدودیت منابع، قطعی سرویس یا توقف پردازش‌ها در اون‌ها بیشتر دیده می‌شه.

در چنین شرایطی، استفاده از یک سرویس Serverless معمولا انتخاب منطقی‌تری خواهد بود.

خط پایان مقاله

Telegram Serverless نشان می‌ده که توسعه ربات‌های تلگرامی به سمت ساده‌تر شدن حرکت می‌کنه. بسیاری از کارهایی که قبلا باید به‌صورت دستی انجام می‌شد، مثل مدیریت Webhook، نگهداری سرور یا راه‌اندازی دیتابیس، حالا توسط خود تلگرام انجام می‌شه.

البته این سرویس هنوز در ابتدای مسیر است و محدودیت‌هایی مثل پشتیبانی فقط از JavaScript، وابستگی بالا به اکوسیستم تلگرام و مشخص نبودن مدل قیمت‌گذاری را هم باید در نظر گرفت.

اگه دسترسی Telegram Serverless برای حساب شما فعال شده، فرصت خوبی است تا اون رو روی یک پروژه کوچک یا آزمایشی امتحان کنید و با نحوه کار آن آشنا شوید.

اما اگه هنوز این قابلیت برایتان فعال نشده یا پروژه شما به انعطاف بیشتری نیاز داره، Cloudflare Workers همچنان یکی از بهترین گزینه‌های Serverless برای توسعه ربات‌های تلگرامی محسوب می‌شه؛ هم اکوسیستم بالغ‌تری داره و هم برای بسیاری از پروژه‌ها، پلن رایگان اون کاملا کافی است.

پیشنهاد عملی: اگه امروز می‌خواهید توسعه یک ربات جدید را شروع کنید، ابتدا وضعیت دسترسی Telegram Serverless را در BotFather بررسی کنید. اگر این قابلیت برای حساب شما فعال بود، ارزش دارد آن را آزمایش کنید. در غیر این صورت، می‌توانید بدون نگرانی پروژه را روی Cloudflare Workers شروع کنید و در آینده، در صورت نیاز، درباره مهاجرت تصمیم بگیرید.

تجربه ما از ساخت ربات تلگرامی؛ تایم‌کلیک

رزرو آنلاین نوبت آرایشگاه

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

یکی از پروژه‌هایی که توسط تیم وینگزنوا توسعه داده شده، تایم‌کلیک است؛ یک سامانه رزرو آنلاین نوبت آرایشگاه که از طریق ربات تلگرامی به کاربران امکان می‌ده بدون تماس تلفنی، زمان موردنظر خود را انتخاب و رزرو کنند.

البته ایده استفاده از ربات تلگرامی برای خدمات رزرو نوبت موضوع جدیدی نیست و پیش از این هم سرویس‌هایی در این حوزه فعالیت داشته‌اند؛ اما چالش اصلی همیشه ارائه یک تجربه ساده، پایدار و قابل اتکا برای کسب‌وکارها بوده است.

در تایم‌کلیک تلاش کردیم این مسیر رو کاربردی‌تر کنیم؛ به‌گونه‌ای که آرایشگاه‌ها بتوانند یک سیستم نوبت‌دهی خودکار داشته باشند و کاربران هم بدون پیچیدگی‌های اضافه، از طریق تلگرام نوبت خود را ثبت کنند.

تجربه ساخت چنین محصولی نشان داد که انتخاب معماری مناسب برای ربات‌ها اهمیت زیادی دارد. بسته به نوع پروژه، تعداد کاربران و نیازهای فنی، ممکن است VPS سنتی، Cloudflare Workers یا راهکارهای جدیدی مثل Telegram Serverless انتخاب مناسب‌تری باشند.

اشتراک بگذارید:

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *