Бесплатное размещение бота
с WebHook

Новиков М.Г.
01.04.2016

Вступление

После создания и отладки бота возникает вопрос, где его разместить на постоянной основе. IDE Cloud9 позволяет разрабатывать и тестировать ботов, но сервер автоматически отключается через некоторое время после выхода из IDE. Давайте рассмотрим варианты размещения.

Heroku

Существует бесплатный облачный хостинг Heroku. К сожалению, бесплатный тарифный план этого хостинга подразумевает 18-часовую работу сервера и 6-часовой простой за сутки, что вполне подходит для обучения созданию ботов, их тестирования и даже начального периода его эксплуатации среди друзей. Но, к сожалению, для широкого выхода на люди нужны другие условия, не ограничивающие бота по длительности работы.

Непременным условием для работы бота через WebHook является защищённый канал передачи данных между сервером мессенджера и сервером хостера. Защищённый канал реализуется протоколом передачи данных https. Для установки этого протокола нужно установить на сайт, где будет работать код бота, ключи SSL. К сожалению, почти все бесплатные хостинги не разрешают установку SSL, и позволяют работать только по http.

Google Cloud Platform

Что я могу сказать про Google Cloud Platform? Это сложнейшая облачная система, внутри которой есть сервис App Engine для создания и размещения приложений на языках Python, PHP, Go, Ruby, Java и JavaScript (Node.js). Но у неё есть минус — в бесплатном варианте файловая система сервиса закрыта для записи, то есть, сайт не может сохранять у себя файлы, а без промежуточного сохранения у меня не получилось заставить бота отдавать пользователю изображения, скаченные с другого, внешнего ресурса.

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

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

Итак, для развёртывания приложения я скачал файлы созданного в App Engine проекта к себе на диск (с файлом настроек проекта app.yaml) и специальную утилиту Google App Engine SDK for PHP. Утилита написана на языке Python, поэтому требует его предварительной установки на компьютер. В процессе инсталляции будет предложено скачать его по ссылке и установить. При установке Python обязательно отметьте для установки компонент «Add python.exe to Path». После установки языка можно продолжить установку утилиты.

После завершения установки запускаем Google App Engine Launcher, добавляем в него скаченный ранее, существующий в App Engine проект, и теперь можем его разворачивать кнопкой Deploy. Редактирование файлов проекта (за исключением файла app.yaml) утилита не осуществляет, так что всё делаем в любом внешнем редакторе, и внутрь страшного App Engine можем больше не возвращаться.

Если после успешного развёртывания браузер не видит изменений, проверьте внутри App Engine в разделе Compute в пункте Versions, весь ли трафик направлен на вашу последнюю версию. Все старые версии лучше удалить (на бесплатном тарифе нельзя создавать больше 10 версий).

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

Бесплатный хостинг
    + бесплатный домен 2-го уровня
    + бесплатная CDN

Неуёмная жажда халявы, поистине, двигает горы. Она же привела меня к обнаружению очень интересного бесплатного сервиса — CloudFlare. CloudFlare представляет собой сервис доставки контента с кешированием и защитой по SSL. Оказывается, можно перенаправить весь трафик к своему сайту через специальную сеть, по пути шифруя его по протоколу https, и для этого не нужны SSL-сертификаты на сайте! Таким образом, весь код бота можно разместить на любом бесплатном хостинге, и легко сделать его видимым для серверов Telegram по https!

Дальнейшее изучение вопроса показало, что для работы этой системы нужно, чтобы у сайта было доменное имя 2-го уровня вида «имя.рф». Однако, все бесплатные хостинги дают имена 3-го уровня типа «имя.хостинг.рф». Но они обычно позволяют линковать к сайтам внешние доменные имена. То есть, можно приобрести отдельно домен 2-го уровня и бесплатно прилинковать его к сайту на бесплатном хостинге.

В принципе, домены 2-го уровня стоят относительно недорого. Так, домен в зоне .ru вообще можно купить всего за 99 рублей, и продлевать его за ту же цену каждый год. Но зачем платить, если есть халява, а она есть! Некоторые небольшие страны, желая популяризовать себя в мире, предлагают бесплатную регистрацию доменного имени 2-го уровня в доменной зоне своей страны. Так почему бы не воспользоваться этим? Это можно сделать на сайте freenom.com за несколько минут. Там предлагаются домены в зонах .tk (острова Токелау), .ml (Мали), .ga (Габона), .cf (Центральноафриканская Республика) и .gq (Экваториальная Гвинея).

Регистрировать домены бесплатно можно на срок до 12 месяцев. Через год, за 2 недели до истечения срока, вам по почте придёт напоминание о его продлении, которое производится фактически одним кликом мышки.

Если вы уже имеете аккаунт на freenom.com с зарегистрированными доменными именами, но при попытке добавления нового домена возникает ошибка «Error code 0x0116a» с надписью «At this moment we are unable to register any domains or other services in this account», что в переводе означает «На данный момент мы не можем зарегистрировать любые домены или другие услуги в этом аккаунте», просто создайте другой аккаунт. Замечено, что при регистрации не все E-mail’ы могут подойти. Так, у меня каким-то образом засветились там все мои адреса на mail и yandex, и второй аккаунт я регистрировал уже на новый gmail.

Итак, схема построения бесплатного размещения бота для мессенджера Telegram приблизительно определилась. Осталось её осуществить и протестировать. Итак, последовательность наших действий будет такова:

  1. Ищем бесплатный хостинг, поддерживающий языки программирования, позволяющие писать на диск. Язык JavaScript по этой причине не подойдёт, но, например, PHP сейчас поддерживается практически на любом бесплатном хостинге. Также, наш потенциальный хостер должен предоставлять возможность линковать к нашему сайту внешние доменные имена. Эта услуга тоже есть практически у любого бесплатного хостера. Регистрируемся, заходим в панель управления хостингом, ищем раздел управления доменами, и копируем оттуда имена двух первых DNS-серверов. Они нам пригодятся при перенаправлении будущего доменного имени на наш сайт.

  2. Переходим на сайт freenom.com, регистрируемся там и регистрируем желаемое доменное имя второго уровня на максимальный бесплатный срок (12 месяцев). Затем переходим там в Domains -> My Domains, напротив нашего нового домена нажимаем кнопку Manage Domain, переходим в Managment Tools -> Nameservers, переключаем кнопку выбора в положение Use custom nameservers и вбиваем в два верхних поля скопированные нами ранее имена DNS-серверов хостера. Сохраняем изменения. Несмотря на предупреждение, что доменное имя заработает в течение 24 часов, обычно оно начинает работать уже в течение несколько минут.

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

  4. Теперь переходим на сайт CloudFlare, регистрируемся, указываем там новое доменное имя нашего сайта, и действуем далее согласно указаниям на сайте. В конце нам выдаётся два новых имени DNS-сервера, которыми надо заменить соответствующие имена на freenom.com, скопированные у нашего хостера. Замечу, что переключение на https обещается в течение 24 часов, но у меня опять же заработало уже через несколько минут.

  5. Переходим на сайт freenom.com, открываем уже знакомую нам страницу с DNS-серверами, и меняем там имена, скопированные у хостера, именами, выданными сервисом CloudFlare. Если поля имён DNS-серверов неактивны и не позволяют себя редактировать, просто переключим туда-обратно опцию выбора Use custom nameservers. Всё сохраняем и выходим. Всё!

Теперь наш новый сайт на бесплатном хостинге можно открывать по защищённому протоколу https! Замечу, что на CloudFlare нужно включить настройку SSL не в Full, а в Flexible режим. Что означает этот режим? Он означает, что поскольку у нас настоящий сертификат SSL на сайте не установлен, то шифрование будет происходить только в промежутке от сервера Telegram до CloudFlare. Далее, от CloudFlare до нашего сайта канал останется незашифрованным. Но сервер Telegram этого не увидит и будет работать, как положено.

Как уже было отмечено, служба CloudFlare является также кеширующим прокси-сервером, ускоряющим загрузку страниц сайта. Но если вы находитесь в России и используете российский хостинг, то я не думаю, что выигрыш в скорости будет заметен — ведь все данные будут идти через серверы, расположенные вне страны, поэтому возможно даже замедление открытия страниц сайта, хотя и не обязательно. Но ведь у нас другая цель, верно? Кстати, кеширование можно отключить, включив на CloudFlare режим разработчика (Development Mode). Это полезно, если вы вносите изменения на статических страницах вашего сайта, и хотите при обновлении сразу видеть результат в браузере. Также полезно оставить включенной функцию Always Online, которая будет отдавать запрошенные страницы из кеша даже если наш сайт вдруг временно отключится. Это предотвратит блокировку нашего бесплатного доменного имени, которая может произойти в случае его неиспользования.

Теперь несколько слов о блокировках некоторых IP-адресов CloudFlare Роскомнадзором. Периодически эта тема всплывает в российских СМИ (особенно актуальна она была в 2013 году), но нас она не затрагивает. Серверы Telegram, как и серверы CloudFlare, расположены не в России, и блокировка последних роскомнадзором нам не страшна — они всё равно будут запрашиваться серверами Telegram извне России. Гораздо хуже, если заблокируют сам Telegram, о возможности чего тоже не раз проскакивало в СМИ. Но я не думаю, что до этого дойдёт.

Заключение

Для себя я остановился на последнем варианте. Если такая конструкция будет относительно устойчивой в течение длительного периода времени, то её вполне можно будет широко использовать для полноценного бесплатного размещения ботов для Telegram.