Как бесплатно развернуть телеграм-бота на node.js в Яндекс.Облаке при помощи фреймворка Serverless
Подробный гайд: как быстро и бесплатно развернуть бота в облаке при помощи фреймворка serverless
448 открытий2К показов
Выясним, где лучше развернуть бота, подключимся к облаку через CLI, осуществим деплой нашего бота в облако при помощи фреймворка serverless.
В конце я расскажу о своём травматическом опыте пользования облачным сервисом. Надеюсь, это поможет кому-то избежать ошибок.
Поехали!
Где можно развернуть телеграм-бота?
Многое зависит от вашего опыта и бюджета, поэтому сначала разберёмся, где лучше всего развернуть сервис:
Локально
Обычно сервис разворачивают локально на домашнем компьютере или ноутбуке. Это удобно на первых этапах разработки, когда код активно пишется и тестируется.
Плюсы:
- бесплатно;
- минимум настроек;
- быстрая проверка изменений.
Минусы:
- В случае, если у вас выбьет пробки при одновременном включении пылесоса и чайника, пользователи потеряют доступ к вашему сервису 🙂
Вывод: локальный сервер хорош для обучения, тестирования, небольших учебных задач и домашних проектов.
На сервере
Сервис разворачивают на удалённом сервере, когда нужно предоставить бесперебойный круглосуточный доступ пользователям.
Также хостинг предоставляет базовый набор вспомогательных сервисов: база данных, почтовый сервер, админ-панель, система создания и управления сайтом, бекапы и т.д.
Плюсы:
- низкий порог входа;
- хостинг берёт на себя обслуживание серверной части;
- можно быстро и легко развернуть типовое решение — сайт на wordpress или простой микро-сервис;
- фиксированная ежемесячная оплата позволяет спрогнозировать стоимость обслуживания.
Минусы:
- ограниченный выбор сервисов для инфраструктуры проекта;
- морально устаревший инфраструктурный стэк;
- вы платите за мощности, которые не используете, когда сервер простаивает без нагрузки;
- ваши мощности ограничены выбранным планом.
Вывод: сервис на выделенном сервере подходит для публичных или коммерческих проектов. При его использовании вы должны уметь рассчитать нагрузку так, чтобы правильно выбрать тариф и не переплачивать в конечном итоге.
В облаке
Сервис разворачивается в облаке по тем же причинам, что и на удалённом сервере.
Но, в отличии от сервера, сервис в облаке легко масштабируется и обладает высокой отказоустойчивостью.
Также облако предоставляет современную инфраструктуру для вашего сервиса: CDN, DNS, мониторинг, балансировка, очереди задач и т.д.
Плюсы:
- облако может взять на себя обслуживание серверной части (IaaS);
- облако может полностью закрыть потребности в инфраструктуре (PaaS);
- вы платите только за то, что используете;
- есть бесплатные лимиты.
Минусы:
- требуется базовое понимание основы облачных вычислений;
- можно потеряться в большом выборе внутренних сервисов;
- требуются навыки систем-дизайна;
- при активном использовании сложно спрогнозировать стоимость обслуживания: сервис может стать популярным или просто попасть под DDOS, в конце концов можно допустить ошибку в коде, из-за чего нагрузка кратно увеличится, и за это вам придётся заплатить.
Вывод: Облако хорошо подходит для развертывания сервисов с непостоянной нагрузкой, особенно если предполагается их дальнейшее активное развитие и масштабирование.
Итого
Несмотря на высокий порог входа и отсутствие необходимости в масштабировании, нам вполне подойдет облако, и вот почему:
- Для работы бота достаточно двух базовых сервисов: Cloud Functions и API Gateway
- Фреймворк serverless полностью возьмет на себя создание функции, маршрутизацию бекенда и деплой кода в облако
Cloud Functions (облачные функции) — сервис для запуска кода в облаке. Функции запускаются при помощи HTTP-запроса или при срабатывании событий, например, записи в базу данных.
API Gateway (API-шлюз) — сервис для создания и управления доступом к API, который выступает единой точкой входа, основная задача которой это маршрутизация запросов между сервисами.
Какое выбрать облако, чтобы развернуть бота?
Из наиболее популярных облаков (AWS, Google Cloud, Яндекс, VK Cloud) я решил использовать Яндекс.Облако, и вот почему:
- проработанная документация и комьюнити на русском языке;
- удобная админ-панель, видно, что разработчики делают для разработчиков;
- бесплатные лимиты;
- нет рисков блокировки.
Что будет делать развёрнутый бот?
В качестве примера мы создадим бота, который будет принимать название крипто-тикера и возвращать его текущую цену.
Подготовительные этапы
Перед началом разработки нам нужно выполнить несколько подготовительных шагов:
- Создать аккаунт в Яндекс.Облаке
- Установить Yandex Cloud CLI
- Авторизоваться в облаке через Yandex Cloud CLI
- Создать телеграм-бота через @botfather и получить его токен
Важно: После успешного создания аккаунта вам нужно зайти в админ-панель облака и создать платёжный аккаунт. Шаг с привязкой карты можно пропустить. Далее Яндекс.Облако предоставит вам бесплатно 1 000 000 вызовов функций в месяц.
Когда вы завершите все подготовительные этапы, можно приступать к развёртыванию проекта.
Разворачиваем стартовый проект
Клонируйте репозиторий для быстрого старта, он включает в себя:
- Сборщик JavaScript (vite)
- Зависимости для бота (telegraf, node-fetch)
- Команды (build, deploy)
Как только репозиторий будет клонирован, зайдите в проект и поставьте зависимости.
Вначале глобально установим фреймворк serverless:
Serverless — фреймворк для автоматизации развёртывания бессерверных приложений. Он позволяет быстро загружать код в облако без ручной конфигурации.
Далее поставим зависимости проекта:
Деплоим проект в облако
Теперь мы готовы выполнить тестовый деплой, для этого нужно запустить команду:
Команда деплоя запустит фреймворк serverless, который прочитает кинфиг в корне проекта:
В конфиге указаны параметры создания нашей облачной функции: имя, память и таймаут.
Как создается и управляется функция без фреймворка можно посмотреть в документации.
После успешного деплоя зайдите в админку облака и откройте раздел Функции. Там вы найдете облачную функцию, созданную согласно указанным параметрам — serverless-dev-crypto-bot
Так как функция будет вызываться вне облака (из телеграма), функцию нужно обязательно сделать публичной:
Для проверки доступности перейдите по ссылке. Если ссылка доступна, функция вернёт вам ответ:
Связываем облачную функцию и телеграм
Чтобы телеграм-бот отправлял запросы пользователей в нашу функцию, мы должны связать их с помощью специального веб-хука.
В хуке нужно указать токен бота и ссылку для вызова облачной функции:
При успешной привязке бота к функции, хук вернет вам ответ:
Теперь можно приступать к бизнес-логике нашего бота.
Создаём облачную функцию
Код облачной функции будет запускаться каждый раз, когда по ссылке для вызова будет приходить запрос.
В нашем случае в запросе будут приходить сообщения от телеграм-пользователей. Для их получения и последующей обработки создадим хэндлер:
Это бойлерплейт-код, вносить в него изменения больше не потребуется.
Пишем бизнес логику
Далее напишем функцию для получения полного списка криптовалют и их цен с API Binance:
Затем создадим команды, которые пользователи будут отправлять в наш бот:
/start — команда для запуска бота
/tickers — получить список доступных тикеров
/price {ticker} — получить цену криптовалютной пары по тикеру
Теперь задеплоим новую версию нашей функции в облако:
При выполнении команды фреймворк сам загрузит в облако новый код и создаст новую версию функции. Как только деплой будет закончен, можно протестировать бота.
Тестируем бота в продакшене
Открываем бота в телеграме и отправляем ему наши текстовые команды:
/start
/tickers
/price <ticker>
Поздравляю 🎉
Вы успешно создали и задеплоили бота в Яндекс.Облако при помощи фреймворка serverless.
Полный код проекта доступен в репозитории на GitHub
Травматический опыт автора
Во время активной разработки вы можете совершить ошибку в коде или поймать трафик выше ожидаемого, в худшем случае — нарваться на DDOS.
Об этом следует помнить.
Когда-то давно я решил сделать парсер прогнозов по акциям. Нашёл отличное открытое API — данные обновлялись каждые 10 минут, история за несколько лет. Просто идеально!
По стандарту сервис облачных функций от Firebase даёт 540 секунд на выполнение функции. Мне этого не хватало, чтобы обойти все акции, поэтому я пошёл на хитрость.
Моя функция запоминала последний обработанный элемент, как только она падала с таймаутом, рекурсивно запускала сама себя, передавая элемент, на котором закончила.
Два-три месяца всё работало идеально. Данные собирались, я радовался, трафик на приложение рос. Я расслабился и перестал заходить в админ-панель Firebase.
Затем, в один прекрасный день, мне пришло уведомление от Firebase — он попытался снять с меня 26 842 рубля за Cloud Functions.
Оказалось, я не предусмотрел крайний кейс выхода из рекурсии при ошибке, из-за чего стэк обработанных элементов не мог до конца очиститься и функция выполнялась бесконечно.
Какие выводы я сделал из этой ситуации?
- Надо быть готовым к непредвиденной нагрузке, иначе она придёт и заберет ваши деньги.
- Важно знать ежедневную среднюю нагрузку, это поможет выставить безопасные лимиты бюджета на ежедневные вычисления.
- Писать тесты — не пустая трата времени 🙂
Заключение
Развернуть телеграм-бота в облаке можно быстро, легко и без лишних вложений.
Бесплатные лимиты позволят ему беззаботно существовать, пока ботом не начнут активно пользоваться настоящие пользователи.
Однако важно помнить — облачные решения требуют внимательности. Без настройки лимитов и бюджетных правил можно столкнуться с непредвиденными расходами.
Чтобы избежать подобных ситуаций, старайтесь тестировать код и временами следить за детализацией биллинга.
Облака дают гибкость и масштабируемость, но ответственность за контроль расходов лежит только на вас!
Какие сервисы вам было бы интересно реализовать на serverless-технологиях? Поделитесь идеями в комментариях! 👇
Спасибо ✨
448 открытий2К показов












