اگر تا امروز برای پاسخ به یک دستور سادهی /start، مجبور بودید یک VPS اجاره کنید و با تنظیمات پیچیده وبهوک کلنجار بروید، دوران «مالکیت سرور» برای رباتهای تلگرامی به پایان رسیده است. این تحول یعنی حذف کامل هزینهها و دردسرهای مدیریتی برای هر کسی که میخواهد یک ابزار کاربردی در تلگرام بسازد.
به نقل از مستندات رسمی، تلگرام در ۱۵ ژوئیه ۲۰۲۶ سرویس Telegram Serverless را عرضه کرد؛ لایهای از زیرساخت که اجازه میدهد ماژولهای جاوا اسکریپت مستقیماً روی سرورهای تلگرام مستقر شوند. این اقدام یعنی لایهی میانی بین کد توسعهدهنده و Bot API بهطور کامل حذف شده است. دیگر نیازی به تامین سرور، زنده نگه داشتن کانتینرها یا مدیریت مقیاسپذیری (Scaling) نیست.
سالها بود که سازندگان ربات باید «لولهکشی» برنامههایشان را مدیریت میکردند؛ از اجاره سرور و آپدیت سیستمعامل گرفته تا پیکربندی Webhookها تا بتوانند تعاملات پایه با کاربر را مدیریت کنند. تلگرام با ادغام محیط اجرا و ذخیرهسازی دادهها در یک بسته، اکوسیستم رباتها را به پلتفرمی مدیریتشده شبیه به Vercel یا Netlify تبدیل کرده است، با این تفاوت که این پلتفرم بهطور عمیقی با سیستمهای داخلی اپلیکیشن پیامرسان تلگرام جفت شده است. اگر تا به حال برای پاسخ دادن به یک دستور ساده، رباتی را به یک VPS یا پنل هاست متصل کردهاید، این دقیقاً همان بخشی است که دیگر نیازی به انجام آن ندارید. همانطور که در تحلیلهای قبلی ما دربارهی بهینهسازی هزینههای استنتاج اشاره کردیم، حذف لایههای زائد در معماری، کلید افزایش سرعت و کاهش هزینه در مقیاس است.
معماری سندباکس V8
قلب این سیستم یک سندباکس V8 (V8 Sandbox) — که شبیه به یک اتاق ایزوله و سریع برای اجرای کد است تا امنیت سیستم اصلی به خطر نیفتد — است که دقیقاً در کنار Bot API قرار دارد. این نزدیکی باعث میشود درخواستهای ارسال پیام یا پرسوجوی دادهها با کمترین تأخیر (Latency) انجام شود. هر فراخوانی در یک ایزولهی سبک اجرا میشود که بر اساس حجم ترافیک ربات، بهطور خودکار مقیاس میگیرد.
توسعهدهندگان با سه جزء اصلی تعامل دارند که بهطور منظم با یکدیگر متناظر هستند:
- پوشه پروژه: ماژولهای محلی جاوا اسکریپت شامل هندلرها، کتابخانههای مشترک و طرحواره (Schema) پایگاهداده. این جایی است که شما فایلها را ویرایش کرده و کنترل نسخه (Version Control) را مدیریت میکنید.
- ابر (Cloud): نسخهی مستقر شده از آن ماژولها، بهعلاوه پایگاهداده پایدار ربات شما که بر پایه SQLite است. این رویکرد یادآور تغییر پارادایم در ابزارهایی است که مدیریت کد را از چتهای ساده به محیطهای ابری منتقل کردهاند تا بهرهوری افزایش یابد.
- tgcloud CLI: ابزار ارتباطی یا پل ارتباطی که تفاوتها را نمایش داده و تغییرات محلی را از طریق دستوراتی مانند
npx tgcloud pushبا ابر همگامسازی میکند.
با این سازوکار، نیاز به دسترسی SSH به ماشینهای سرور کاملاً حذف شده است. یک پروژه صرفاً یک پوشه ساده در سیستم شخصی است. شما فایلها را ویرایش میکنید، تغییرات دقیق را میبینید و بهصورت اتمیک (Atomic) منتشر میکنید. ترافیک ربات شما توسط ماژولهای مستقر شده مدیریت میشود، در حالی که پایگاهداده وضعیت (State) را بین فراخوانیهای مجزا حفظ میکند. این حذف وابستگی به SSH، تغییر رویکردی است که در دسترسی به عاملهای خودکار نیز مشاهده شده تا لایههای کنترل مستقیم جایگزین شوند.
مدیریت پایگاهداده و طرحواره
هر ربات یک پایگاهداده مبتنی بر SQLite دریافت میکند که از طریق یک Query Builder روان بر پایه Drizzle ORM در دسترس است. برای جلوگیری از پاک شدن تصادفی دادهها، تلگرام فرآیند استقرار دو مرحلهای سختگیرانهای را اجرا میکند: ارسال کد از طریق CLI منطق برنامه را بهروز میکند، اما تغییرات پایگاهداده نیازمند دستور مجزای npx tgcloud migrate است. این اطمینان میدهد که یک استقرار کد، توسعهدهنده را با یک مهاجرت دادهای (Data Migration) غیرمنتظره غافلگیر نکند.
جزئیات فنی دیتابیس عبارتند از:
تعریف جداول (Table Definitions)
- زبان تعریف طرحواره (Schema DSL): جداول در یک فایل
schema.jsبه عنوان خروجیهای نامگذاری شده (Named Exports) تعریف میشوند. انواع دادههای پشتیبانی شده عبارتند از:integer()،text()،boolean()،real()،numeric()،blob()(برای Uint8Array) وjson(). - تغییردهندههای ستونی (Column Modifiers): توسعهدهندگان میتوانند متدهایی مانند
.primaryKey({ autoIncrement: true })،.notNull()،.unique()،.default()و.generatedAlwaysAs()برای ستونهای ذخیره شده یا مجازی را به هم زنجیر کنند. برای مثال، یک slug را میتوان به صورتsqllower(name)`` تولید کرد. - اندکسها (Indexes): محدودیتها در یک callback اضافی تعریف میشوند و از
unique()،check()،index()وuniqueIndex()پشتیبانی میکنند. همچنین اندکسهای عبارتی مانندindex('idx_lower').on(sqllower(${t.email})) و اندکسهای جزئی با استفاده از.where()(مثلاًindex('idx_active').on(t.userId).where(sqldone = 0)`) پشتیبانی میشوند.
محدودیتهای دادهای (Data Constraints)
- عدم پشتیبانی از کلیدهای خارجی: محیط اجرا با دستور
PRAGMA foreign_keys offعمل میکند. اگر از.references()یاforeignKey()استفاده شود، DSL صراحتاً خطا میدهد. یکپارچگی دادهها باید در لایهی کد برنامه مدیریت شود (مثلاً حذف فرزندان قبل از والدین) و دادههای یتیم (Orphans) را میتوان با یکLEFT JOIN ... WHERE parent.id IS NULLپاکسازی کرد. - تبدیل حالت (Mode Conversion): گزینه
modeتبدیل JS به SQLite را مدیریت میکند. برای مثال،mode: 'timestamp'اعداد صحیح SQLite را به اشیاء Date در جاوا اسکریپت تبدیل میکند؛mode: 'json'عملیات Stringification و Parsing را انجام میدهد. نوعblob()دادههایUint8Arrayرا میخواند و مینویسد، زیرا محیط اجرا Node Buffer ندارد. - اصلاحکنندههای جدول: جداول را میتوان با متدهایی مثل
.strict()،.withoutRowid()و.deprecated('reason')دقیقتر تعریف کرد.
منطق مهاجرت (Migration Logic)
ابزار میگریشن، تغییرات را به چهار دسته تقسیم میکند:
safe(ایمن): تغییرات افزایشی (جداول یا ستونهای جدید) که در یک مرحله با هم اعمال میشوند.warning(هشدار): تغییراتی که احتمالاً مخرب یا کند هستند (مانند حذف ستونها یا ایجاد اندکس روی جداول بسیار بزرگ) و باید یکییکی تأیید شوند.manual(دستی): تغییرات نوع داده که به دلیل محدودیتهای SQLite نیازمند دخالت مستقیم با Raw SQL هستند.undocumented(مستند نشده): اشیائی که در دیتابیس وجود دارند اما در طرحواره محلی تعریف نشدهاند.
برای حذف یک جدول یا ستون، توسعهدهندگان باید ابتدا آن را با .deprecated('reason') علامتگذاری کنند. این کار باعث میشود قبل از حذف نهایی، وضعیت warning در طول میگریشن فعال شود. دستور npx tgcloud migrate تفاوت بین schema.js و دیتابیس زنده را محاسبه میکند. این دستور با پرچمهایی مانند --dry-run (فقط چاپ تغییرات)، --safe (اعمال خودکار تغییرات ایمن)، --yes (اعمال خودکار ایمنها و هشدارها) یا --local (مقایسه با طرحواره محلی) قابل اجرا است.
جریان کاری توسعهدهنده و SDK
کدها در سه منطقه تخصصی سازماندهی میشوند:
handlers/: نقاط ورود. هر فایل متناظر با یک نوع Update تلگرام است (مثلاًhandlers/message.jsیاhandlers/callback_query.js). اینها دایرکتوریهای تخت (Flat) هستند. اگر هندلری برای یک نوع آپدیت خاص گم شود یا خالی باشد، تلگرام صرفاً آن آپدیتها را نادیده میگیرد تا از اجرای کدهای غیرضروری جلوگیری شود.lib/: منطق مشترک و ماژولهای کمکی. این تنها دایرکتوری است که اجازه ساخت زیرپوشه دارد (مثلاًlib/internal/util.jsیاlib/payments/stripe.js).schema.js: یک تکفایل در ریشه پروژه که تمام جداول پایگاهداده را تعریف میکند.
برای حفظ امنیت و سرعت (کاهش Cold-start)، استفاده از پکیجهای npm، دسترسی مستقیم به سیستم فایل یا مسیرهای نسبی (Relative Paths) در Importها ممنوع است. مسیرهایی مانند ./schema یا ../schema کامپایل نخواهند شد. در عوض، همه چیز از طریق یک SDK یکپارچه با استفاده از Importهای نام ساده (Bare Name Imports) دسترسیپذیر است (مثلاً import { db } from 'sdk').
اجزای SDK:
api: دسترسی مستقیم به تمام متدهای فعلی و آتی Bot API از طریقapi.<method>(params). پوششهای پاسخ (Response Envelopes) بهطور خودکار باز میشوند؛ برای مثال،getMe()مستقیماً شیء کاربر را برمیگرداند. پارامترها از snake_case استفاده میکنند (مثلاًchat_id). خطاها یکBotApiErrorپرتاب میکنند که شامل.code(کد خطای Bot API)،.description،.methodو.parameters(مانندretry_afterبرای خطاهای ۴۲۹) است.db: ابزار پرسوجوی مشابه Drizzle که از.select()،.insert()،.update()و.delete()پشتیبانی میکند. متدهای نهایی مانند.all()،.get()،.values()و.run()را شامل میشود. همچنین از Projectionهای پیچیده با Aggregateهایی مثلcount()،sum()،avg()،min()وmax()پشتیبانی میکند. Raw SQL از طریق تگsqlپشتیبانی میشود وdb.runبرای نوشتن وdb.allیاdb.getبرای خواندن به کار میروند.fetch: یک کلاینت HTTP تخصصی برای فراخوانی APIهای شخص ثالث. از کمککنندههای بدنه مانندfetch.body.json()،fetch.body.form()وfetch.body.text()پشتیبانی میکند. استریم افزایشی از طریقfor await (const chunk of res.body)ممکن است، هرچند حجم کل پاسخ تا ۳۲ مگابایت محدود شده است. Payloadهای باینری پشتیبانی نمیشوند و محتوای پاسخ باید متنی باشد. این قابلیت دسترسی به APIهای خارجی، شباهتی به رویکردهای خودکارسازی ابزارهای ایجنتیک از طریق مهندسی معکوس APIها دارد تا رباتها بتوانند با دنیای بیرون تعامل داشته باشند.
تست و توسعه با کمک هوش مصنوعی
برای تسریع چرخه توسعه، پلتفرم دستور npx tgcloud run را معرفی کرده است. این دستور به توسعهدهندگان اجازه میدهد یک هندلر را روی پلتفرم با استفاده از فایلهای محلی و یک Payload به فرمت JSON5 اجرا کنند، بدون اینکه نیاز به استقرار نسخه کامل باشد. برای مثال، اجرای npx tgcloud run handlers/message '{ chat: { id: 1 }, text: "hi" }' یک Payload شبیهسازی شده را به هندلر میفرستد. همچنین میتوان یک شیء Context را با پرچم --ctx ارسال کرد (مثلاً --ctx '{ update: { update_id: 1 } }'). این دستور لاگهای console.* را با پیشوندهای رنگی، مقدار بازگشتی و زمان اجرا چاپ میکند.
تلگرام این محیط را به عنوان محیطی «AI-Native» معرفی میکند. پروژههای جدید با فایلهای AGENTS.md و docs/tgcloud-sdk.md آماده میشوند که مخصوصاً برای خوانده شدن توسط دستیارهای کدنویسی AI مانند Cursor یا Claude Code طراحی شدهاند. این کار تضمین میکند که ایجنتهای هوش مصنوعی از کنوانسیونهای پلتفرم پیروی کنند:
- استفاده از Bare Name Imports (بدون پسوند .js).
- اجتناب از استفاده از کلیدهای خارجی.
- اجرای جریان دو مرحلهای
push/migrate. - نوشتن تنها یک هندلر برای هر نوع آپدیت.
ارکستراسیون پروژه و CLI
ابزار tgcloud CLI به عنوان پل ارتباطی اصلی عمل میکند و به Node.js نسخه ۱۸ یا جدیدتر نیاز دارد. این ابزار را میتوان بهصورت جهانی با npm install -g @tgcloud/cli یا بهصورت محلی با npx نصب کرد.
دستورات ضروری عبارتند از:
npx tgcloud login: اتصال پروژه با استفاده از توکن دسترسی CLI (app<id>:<secret>) که از @BotFather دریافت میشود. این توکن در.tgcloud/credentialsذخیره میشود و در git-ignore قرار میگیرد.npx tgcloud statusوdiff: انجام مقایسههای آفلاین بین فایلهای محلی و کپی مرجع در ابر. دستور status دربارهی فایلهای.jsپراکنده در ریشه پروژه هشدار میدهد.npx tgcloud push: استقرار ماژولها در یک دسته اتمیک. اگر همکارتان نسخه جدیدتری را مستقر کرده باشد، برای جلوگیری از بازنویسی خاموش، push رد میشود مگر اینکه پرچم--forceاستفاده شود.npx tgcloud webhook sync: بازتنظیم وبهوک و بازسازی لیستallowed_updatesبر اساس هندلرهای مستقر شده. پرچم--drop-pendingمیتواند آپدیتهای در صف را در هنگام همگامسازی دور بریزد.npx tgcloud add <target>: ساخت یک ماژول جدید. برای هندلرها، نام را با انواع آپدیتهای پشتیبانی شده تلگرام اعتبارسنجی میکند.npx tgcloud pullوreset: دستور pull فایلهای محلی را با ابر همراستا میکند؛ reset تغییرات محلی را دور میریزد تا آخرین وضعیت شناخته شده در ابر را بازیابی کند.
مدیریت موبایلی از طریق BotFather
برای توسعهدهندگانی که از کیبورد دور هستند، تمام پروژه سرورلس در @BotFather آینه شده است. کاربران میتوانند به مسیر ربات $\rightarrow$ Serverless بروند تا به موارد زیر دسترسی داشته باشند:
- Handlers: ایجاد، ویرایش و اجرای تست هندلرهای آپدیت. BotFather وبهوک را بهطور خودکار همگام نگه میدارد.
- Library: مدیریت ماژولهای مشترک
lib/روی صفحه لمسی. - Database: ویرایش
schema.jsبا سینتکس مشابه Drizzle، بررسی تغییرات در انتظار و اعمال آنها. - CLI Access: دریافت توکن دسترسی CLI برای استفاده در کامپیوتر.
هر تغییری که از طریق BotFather ایجاد شود، میتواند با استفاده از npx tgcloud pull به لپتاپ محلی بازگردانده شود. همچنین اجرای یک هندلر در محیط BotFather، خروجی کنسول آن را مستقیماً در چت نمایش میدهد.
تحلیل: اقتصاد جدید رباتها
این انتقال بهطور بنیادی تحلیل هزینه-فایده را برای توسعهدهندگان ربات تغییر میدهد. با حذف «مالیات سرور» (حداقل هزینه ماهانه یک VPS)، تلگرام مانع ورود برای رباتهای پیچیده، حالتدار (Stateful) و مبتنی بر هوش مصنوعی را پایین آورده است. گنجاندن یک پایگاهداده داخلی به این معنی است که تداوم وضعیت پیچیده برای هر کاربر اکنون رایگان و بدون زحمت است و احتمالاً منجر به موجی از Mini Appهای پیشرفته، تابلوهای امتیازات (Leaderboards) و هوش مصنوعی مکالمهای میشود.
علاوه بر این، محدودیت عمدی در استفاده از پکیجهای npm و دسترسی به سیستم فایل نشاندهنده اولویت تلگرام است: عملکرد فوقالعاده در شروع سرد (Cold-start) و امنیت. با کنترل محیط اجرا از طریق سندباکسهای ایزوله V8 و حذف نیاز به کانتینرها، آنها تضمین میکنند که رباتها صرفنظر از مقیاس موج آپدیتهای ورودی، پاسخگو باقی بمانند. این کار عملاً بکاند رباتها را تبدیل به یک کالای عمومی (Commoditize) کرده و ارزش را از «چگونه میزبانی کنیم» به «ربات واقعاً چه کاری انجام میدهد» منتقل میکند.
اگر در حال حاضر رباتی را روی یک نمونه ابری مجزا نگه میدارید، ممکن است بخواهید هزینههای زیرساختی خود را بررسی کنید و ببینید آیا مهاجرت به سندباکس بومی سرورلس میتواند هزینههای ماهانه شما را حذف کند یا خیر.
گام بعدی شما
- اگر رباتی دارید که هزینه VPS ماهانهاش برای شما زیاد است، کدها را به ساختار
handlers/وlib/منتقل کنید. - برای مدیریت دیتابیس، ابتدا طرحواره خود را در
schema.jsبنویسید و سپس باnpx tgcloud migrateآن را تست کنید. - از
npx tgcloud runبرای تست سریع پیامها بدون نیاز به آپلود روی سرور استفاده کنید.
اما داستان بهینهسازی سختافزاری این تحول حتی شگفتانگیزتر است؛ برای درک نحوه اجرای این ایزولهها در مقیاس میلیاردی، به تحلیل ما دربارهی معماری توزیعشدهی تلگرام مراجعه کنید.




گفتگو