Сегодня я расскажу где и как бесплатно разместить своего телеграм-бота. Способ, который я опишу, требует ровно ноль денежных вложений, и обещает таковым оставаться. Я пользуюсь им уже больше полугода, у него есть свои особенности, но с моими задачами он справляется на 100%.
Кому это будет полезно #
Часто в группах по разработке под телеграмм я вижу вопросы о том, где запускать ботов, как хранить данные, какой хостинг самый лучший. Люди, задающие эти вопросы, как правило, хотят просто захостить свой небольшой проект где угодно и нагрузка на таких ботов - минимальна. Выделенный сервер, который в таких случаях обычно советуют, большую часть времени будет простаивать, но всё равно требовать, пусть небольшой, но регулярной оплаты. Я готов предложить несколько иное, но зато совершенно бесплатное решение.
Магическое слово Deta #
Пару слов о самом сервисе. Deta.space даёт возможность хостить веб-приложения, хранить данные в no-sql базе, а также дёргать функции на регулярной основе по аналогии с cron. Это довольно молодой сервис, поэтому я не рекомендую его для коммерческого использования, однако, сам я, обложившись мониторингами рискнул, и за полгода поймал только один сбой.
Переходим к делу: главное — не перепутать страпон и бутстрап #
Эта часть будет посвящена настройке необходимого окружения и запуску минимального рабочего примера. Во многом информация здесь будет дублировать документацию, так что если хотите - можете воспользоваться первоисточником на английском и перейти сразу ко второй части.
Для начала работы с Deta.space необходимо выполнить следующие шаги:
- зарегистрироваться на https://deta.space/
- Установить тулзу для взаимодействия с сервисом по ссылке
- Получить Access Token в настройках вашего профиля
- Выполнить команду
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. Для запуска бота нужно выполнить следующие шаги:
- Склонировать репозиторий
- Выполнить в нём команду
space new
- Далее выполнить команду
space push
- С помощью команды
space open
открыть в браузере страничку своего проекта, найти там раздел Develop (сверху) -> Configuration -> Environment Variables, и вписать в поле BOT_TOKEN (внезапно) токен бота - После задания токена вернуться в раздел Overview и нажать большую красную кнопку
Open Builder Instance
. Она откроет ваш сайт (который на самом деле бот, но про это потом) и скажет серверам телеграма куда отправлять обновления.
Если всё сделано верно, то вы можете открыть в телеграме чат со своим ботом и увидеть как он реагирует на команду /start
. Победа!
Как это работает #
Итак, барабанная дробь, занавес раскрыт, на самом деле телеграм-бот из примера - это веб-сервер. Маленький, всего с двумя хэндлерами, но гордый.
В нём используется метод получения обновлений, альтернативный поллингу (который использовался во всех предыдущих моих заметках), и имя ему - вебхук.
Когда мы открыли корневой адрес Builder Instance
, сработал дефолтный хэндлер, который отправил в телеграм свой собственный полный адрес, по которому второй хэндлер будет ожидать обновления
в виде POST-запросов. Эти запросы скармливаются в объект Dispatcher-а, а дальше всё происходит так же, как и в случае работы через поллинг.
Перейдём от теоретического минимума к коду.
Из чего состоит шаблон:
main.py
: базовый файл, создающий все необходимые сущности. Без большой необходимости при дальнейшем расширении бота вам скорее всего не потребуется вносить сюда изменения- вспомогательные функции
get_webhook_path
иget_webhook_url
, формирующие пути для хэндлера и вебхука соответственно setup_dispatcher
, отвечающий за создание объектов диспетчера обновлений и ботаsetup_app
, создающий объект фреймворка FastAPI, который принимает на себя первичную обработку поступающих запросов. Также, внутри этого метода происходит создание хэндлеровbot_webhook
иsetup
, отвечающих за задание адреса вебхука и приём обновлений от телеграма- переменная
app
- инстанс приложения FastAPI, созданная вышеупомянутой функцией, живёт в глобальном скоупе, потому что этого от нас ожидает Deta
- вспомогательные функции
config.py
:class Settings
- отвечает за удобное получение параметров запуска, коих в нашем случае всего два - токен бота и хостнейм приложения (то же, что адрес билдера), почему я предпочитаю такой способ работы с конфигами я рассказывал в другой моей заметке.
basic_handlers.py
:router
- сущность, объединяющая внутри себя хэндлеры событий, докаstart_handler
- функция-обработчик команды/start
Код бота сведён до минимально репрезентативного, в дальнейших заметках я расскажу как его можно расширить, чтобы добавить в него больше полезного в любом проекте функционала.
Ограничения и особенности deta.space #
Поговорим немного про ложку дёгтя — минусы данной платформы, с которыми я успел столкнуться:
Забудьте про удобные логи #
Да, на вкладке Develop есть окошка с Runtime Logs. Не рассчитывайте на него. С модулем logging оно не работает, только print-ы, и то не сразу. Легче придумать какой-то другой способ отладки, чем рассчитывать на этот.
Ограничения #
Запустить программу в Deta.space - это не то же самое, что запустить её у себя на локальной машине или на выделенном серваке. Deta работает поверх Amazon Lambda, что приводит к закономерным ограничениям:
- Версия питона всегда будет немного отставать. На текущий момент последним доступным рантаймом является python 3.9, не фатально, но имейте ввиду.
- Не работают события on_startup и on_shutdown. Ауч. Это уже более существенно, приходится извращаться, но тоже не очень страшно.
- Время работы хэндлера не может превышать 15 секунд. Самое неприятное. Майнить биткойны не получится, процессить видео - тоже. Попарсить не гигантскую страничку и прислать ответ - вполне.
- Stateles. Каждый запусх хэндлера - считай перезапуск программы с нуля. Если между разными хэндлерами хочется передать данные - необходимо их где-то сохранить. Deta предоставляет возможности для этого, о них я расскажу в следующей статье.
P.S. Если у вас что-то не будет работать - делитесь в чате, возможно я дополню статью вашей болью, а может у меня будет для неё решение, и поэтому я её здесь не упомянул. Ссылка внизу.
Заключение #
С Deta.space местами непросто, как и с любым молодым проектом, который ещё не оброс всеми возможными примерами решения базовых проблем, но он подкупил меня полнотой решаемых задач, относительной надёжностью, и возможностью потыкать что-то новое абсолютно бесплатно. Также, у них есть приятное коммьюнити в дискорде и чатик в Телеграме где могут помочь разобраться в ситуации, когда сервис ведёт себя неочевидно.
После того как я разобрался с некоторыми ломающими мозг моментами, мне начало казаться, что этот сервис крайне недооценён в телеграмной тусовке ботостроителей, что и подтолкнуло меня к созданию этого гайда. Сейчас я использую deta для большинства моих ботов и вполне доволен возможностями, которые она предоставляет, чего и вам желаю.🖖