Как бесплатно захостить своего телеграм-бота

· nikoontelegram's blog


Сегодня я расскажу где и как бесплатно разместить своего телеграм-бота. Способ, который я опишу, требует ровно ноль денежных вложений, и обещает таковым оставаться. Я пользуюсь им уже больше полугода, у него есть свои особенности, но с моими задачами он справляется на 100%.

Кому это будет полезно #

Часто в группах по разработке под телеграмм я вижу вопросы о том, где запускать ботов, как хранить данные, какой хостинг самый лучший. Люди, задающие эти вопросы, как правило, хотят просто захостить свой небольшой проект где угодно и нагрузка на таких ботов - минимальна. Выделенный сервер, который в таких случаях обычно советуют, большую часть времени будет простаивать, но всё равно требовать, пусть небольшой, но регулярной оплаты. Я готов предложить несколько иное, но зато совершенно бесплатное решение.

Магическое слово Deta #

Пару слов о самом сервисе. Deta.space даёт возможность хостить веб-приложения, хранить данные в no-sql базе, а также дёргать функции на регулярной основе по аналогии с cron. Это довольно молодой сервис, поэтому я не рекомендую его для коммерческого использования, однако, сам я, обложившись мониторингами рискнул, и за полгода поймал только один сбой.

Переходим к делу: главное — не перепутать страпон и бутстрап #

Эта часть будет посвящена настройке необходимого окружения и запуску минимального рабочего примера. Во многом информация здесь будет дублировать документацию, так что если хотите - можете воспользоваться первоисточником на английском и перейти сразу ко второй части.

Для начала работы с Deta.space необходимо выполнить следующие шаги:

  1. зарегистрироваться на https://deta.space/
  2. Установить тулзу для взаимодействия с сервисом по ссылке
  3. Получить Access Token в настройках вашего профиля
  4. Выполнить команду space login и ввести туда полученный токен.

Теперь вы обладаете всем необходимым, чтобы создать свой первый проект.

В пустой папке создаём файлы main.py и requirements.txt со следующим содержимым:

main.py #

1from fastapi import FastAPI
2
3app = FastAPI()
4
5
6@app.get("/")
7def root():
8    return "Hello from Space! 🚀"

requirements.txt #

1fastapi
2uvicorn

Наличие этих файлов позволит CLI определить, какого типа проект мы хотим разместить.

Далее открываем консоль и вводим там команду space new, вводим любое имя проекта (можно оставить по-умолчанию), подтверждаем, что проект питонный и получаем в нашей папке несколько дополнительных файлов. Скрытая папка .space необходима для связи вашего локального проекта и его представления в облаке, особого интереса для нас не представляет. А вот Spacefile уже гораздо интереснее и буквально предназначен чтобы влезть туда и что-нибудь сломать настроить. Пока что нас устроят настройки по-умолчанию, а подробнее про них можно прочитать тут.

Если все предыдущие команды завершились успешно, то я вас поздравляю, вы на финишной прямой. Осталось только выполнить команду space push которая после некоторых раздумий выдаст вам ссылку помеченную как Builder instance, перейдя по которой вы увидите в браузере заветный Hello world.

Это значит, что с первым этапом вы успешно справились.

При чём здесь боты? #

...может спросить меня наблюдательный читатель и будет абсолютно прав. Исправляемся. В репозитории по ссылке вы можете найти пример бота, написанного с использованием aiogram3==v3.0b7. Для запуска бота нужно выполнить следующие шаги:

Если всё сделано верно, то вы можете открыть в телеграме чат со своим ботом и увидеть как он реагирует на команду /start. Победа!

Как это работает #

Итак, барабанная дробь, занавес раскрыт, на самом деле телеграм-бот из примера - это веб-сервер. Маленький, всего с двумя хэндлерами, но гордый. В нём используется метод получения обновлений, альтернативный поллингу (который использовался во всех предыдущих моих заметках), и имя ему - вебхук. Когда мы открыли корневой адрес Builder Instance, сработал дефолтный хэндлер, который отправил в телеграм свой собственный полный адрес, по которому второй хэндлер будет ожидать обновления в виде POST-запросов. Эти запросы скармливаются в объект Dispatcher-а, а дальше всё происходит так же, как и в случае работы через поллинг. Перейдём от теоретического минимума к коду.

Из чего состоит шаблон:

Код бота сведён до минимально репрезентативного, в дальнейших заметках я расскажу как его можно расширить, чтобы добавить в него больше полезного в любом проекте функционала.

Ограничения и особенности deta.space #

Поговорим немного про ложку дёгтя — минусы данной платформы, с которыми я успел столкнуться:

Забудьте про удобные логи #

Да, на вкладке Develop есть окошка с Runtime Logs. Не рассчитывайте на него. С модулем logging оно не работает, только print-ы, и то не сразу. Легче придумать какой-то другой способ отладки, чем рассчитывать на этот.

Ограничения #

Запустить программу в Deta.space - это не то же самое, что запустить её у себя на локальной машине или на выделенном серваке. Deta работает поверх Amazon Lambda, что приводит к закономерным ограничениям:

P.S. Если у вас что-то не будет работать - делитесь в чате, возможно я дополню статью вашей болью, а может у меня будет для неё решение, и поэтому я её здесь не упомянул. Ссылка внизу.

Заключение #

С Deta.space местами непросто, как и с любым молодым проектом, который ещё не оброс всеми возможными примерами решения базовых проблем, но он подкупил меня полнотой решаемых задач, относительной надёжностью, и возможностью потыкать что-то новое абсолютно бесплатно. Также, у них есть приятное коммьюнити в дискорде и чатик в Телеграме где могут помочь разобраться в ситуации, когда сервис ведёт себя неочевидно.

После того как я разобрался с некоторыми ломающими мозг моментами, мне начало казаться, что этот сервис крайне недооценён в телеграмной тусовке ботостроителей, что и подтолкнуло меня к созданию этого гайда. Сейчас я использую deta для большинства моих ботов и вполне доволен возможностями, которые она предоставляет, чего и вам желаю.🖖


Мой канал про разработку под телеграм: @NikoOnTelegram