Как все начиналось

Мне 43 года и я профессиональный юрист. Неуемная интеллектуальная энергия и неудовлетворенность основной профессией 2,5 года назад привели меня в IT. Да-да, вот так – взрослая тетя с гуманитарным образованием решила попробовать себя на ниве программирования и замахнулась аж на такой язык как… JAVA!

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

Оглянувшись по сторонам и не встретив направленных на меня глаз, я поняла – все эти глаза устремлены в гаджеты! Месседжеры и социальные сети правят умами. Значит, надо действовать через них.

И тут я вспомнила, что самый частый юридический вопрос, с которым ко мне обращаются друзья/знакомые – это просьба дать ту или иную форму документа (договора, расписки, заявления, доверенности и т.д.). Эврика! – нужна несложная мобильная программа с формами самых востребованных документов, чтобы их оставалось просто скачать и наполнить необходимыми сведениями. И тут самым коротким путем к конечному пользователю мне представился telegram-бот.

Поскольку на курсах таким тонкостям не учили, вооружившись статьями и видеороликами из всемирной паутины, закатав рукава я принялась создавать свою первую «взрослую» программу-помощника человечеству!

Про регистрацию бота через BotFather, структуру кода и возможности Telegram Bot Api создано достаточно статей и видео-уроков, чтобы новичок самостоятельно написал программу, прекрасно функционирующую в среде разработки (у меня это IntelliJ IDEA Community Edition).

Но вот с какими трудностями я столкнулась после того, как мой бот стал отвечать на команды и успешно присылать в чат формы документов:

  1. Бот должен сохранять посетителей в базе данных для последующего использования статистики его востребованности независимо от того, на каком оборудовании этот бот запущен;

  2. Бот должен жить сам по себе, не завися от работоспособности и активности моего ноутбука.

Да, есть Docker, который позволит собрать программу со всеми зависимостями и взаимодействиями с другими приложениями. Но, как новичку, использование Dockerа в такой простой программе как telegram-бот мне показалось несопоставимо сложно (особенно, если учесть специфику Windows 10 Home (кто знает, о чем речь, тот поймет, как «устают ноги в танцах с бубнами» при установке Docker на эту операционную систему). Поэтому нужен был какой-то более просто инструмент.

Трудности были также в вопросе деплоя и запуска программы – основная масса статей и инструкций, помогающих новичку дать независимую жизнь своему боту, касается ботов, написанных на Python, а также посвящены платформам Heroku и DigitalOcean hosting, которые с марта 2022 года практически недоступны российскому пользователю (если через VPN доступ к самим ресурсам еще возможен, то оплатить их услуги во сто крат сложнее, чем установить Docker на Windows 10 Home).

Выход найден!

Для решения своих проблем я решила использовать один из хостингов, без проблем функционирующих в России, поддерживающих использование баз данных MySQL и управление ими, а также предоставляющий в аренду виртуальный VPS, куда можно выгрузить и запустить своего бота!

Для создания исполняемого jar-файла (для запуска его на виртуальных ресурсах), я использовала плагин Apache Assembly (build моего файла pom.xml):

Процесс выгрузки telegram-бота на VPS (после регистрации и создания виртуального сервера Ubuntu 22.04 с SSL-сертификатом):

1. Для общения с VPS установить клиент удалённого доступа (у меня - PuTTY) , открыть его и подключиться к своему серверу. Все требуемые данные для входа предоставляются провайдером после аренды VPS (в т.ч. присылаются на электронную почту).

2. В открывшемся терминале ввести имя пользователя и пароль.

Установить необходимые пакеты, введя команды:

  • Для обновления: apt update

  • Для установки нужного пакета Java (в моем в проекте использована 11-я версия): apt-get install openjdk-11-jdk.

  • Для проверки, установилась ли нужная версия, ввести: java -version.

  • Для установки утилиты screen (консольная утилита, позволяющая в действующей SSH сессии открывать виртуальные терминалы, чтобы после завершения удалённого подключения бот продолжал работать в независимом режиме): install screen.

  • Перенести бот на сервер: для передачи на сервер файлов бота установить FTP-клиент (у меня – FileZilla), в котором активироваться (данные для входа те же, что предоставил провайдер для сервера),  

  1. после чего полностью перенести всю директорию с приложением в root (вместе с исполняемым jar-файлом)

 5. Запустить бота на сервере:

  • в терминале PuTTY выполнить команду, создающую screen, который будет поддерживать непрерывную работу приложения: screen -S docBot (где docBot - имя директории с проектом).

  • в этом скрине перейти в директорию, где расположен исполняемый jar-файл: cd /root/docBot/out/artifacts/docBot_jar,

  • запустить jar-файл, для чего ввести: java -jar docBot.jar

  • В случае успеха в терминале PuTTY отобразятся те же процессы, что и в консоли среды разработки. После можно выйти из клиента.

 Отдельно следует обратить внимание на такой нюанс: функционал моего бота был основан на отправке пользователю готовых форм документов в формате word. Такие формы хранились в соответствующей папке в директории /src/main/resources/…

После переноса бота на удаленный сервер и его запуска, при кажущейся беспроблемной самостоятельной жизни программы у меня перестали отправлять файлы пользователю, вместо этого в терминале PuTTY стала выдаваться ошибка: "I/O exception (java.io.FileNotFoundException) caught when processing request to {s}->https://api.telegram.org:443: src/main/resources/… (No such file or directory)"

При этом в среде разработки все по-прежнему функционировало без проблем.

За пару часов кипящего мозга ко мне пришло озарение, что «ларчик открывается очень просто»: поскольку директорию с ботом мы перенесли в root сервера, путь к файлам изменился, и необходимо внести соответствующие корректировки в тех местах кода, где указан путь к файлам (у меня это были классы пакета handler, содержащие в наименовании «… PathsConst.java», где в константе, определяющей начало пути до файла, я дополнительно указала расположение «/root/docBot/src/…»).

Пересобрала бот, перезалила его на сервер через все тот же FileZilla, закрыла предыдущий screen (сперва использовала команду screen -ls, чтобы найти имя сеанса, который хочу закрыть, после чего ввела команду screen -X -S "sessionname" quit), открыла новый и запустила jar-файл обновленного бота.

И, вуаля, все чудесным образом работает уже какой день.

Заключение

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

В конце концов без статей других энтузиастов и альтруистов для таких it-малышей как я не было бы и моего бота)).

Если интересно, код бота с демонстрацией функционала выложен: GitHub.

Адрес бота: Формы документов

Комментарии (7)


  1. FanatPHP
    00.00.0000 00:00
    +6

    Интересная публикация. От нее так веет энтузиазмом неофита, что рука не поднимается придираться к таким мелочам как работа из-под рута, использование скрина для демонизации или использование почему-то именно имени директории с проектом в качестве имени сеанса в скрине :)


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


  1. KongEnGe
    00.00.0000 00:00
    +4

    взрослая тетя с гуманитарным образованием решила попробовать себя на ниве программирования

    Такая тетя должна быть у каждого!


  1. kwazar1471
    00.00.0000 00:00
    +1

    Вдохновляет!


  1. Keirichs
    00.00.0000 00:00

    Таких статей нехватает хабру=) лайк однозначно,
    прошу прощения, немного побурчу,
    было бы круто немного сократить введение, а в саму статью бы добавить
    немного кода дружбы api телеграмма и java, ну и хотябы ссылки на подключение бота к JVM.
    Если не сложно, можете скинуть в ответ к коментарию? =)


    1. Polesmih Автор
      00.00.0000 00:00

      Дружба api телеграмма и java прописана в pom.xml файле проекта, ссылка на который есть в конце статьи (GitHub).

      Из кода проекта на GitHub также, мне кажется, наглядно видно подключение бота, его функционирование (там только в ресурсном файле config.properties реальные name и token затерты).


  1. citykot
    00.00.0000 00:00
    +1

    Очень вдохновляющая и мотивирующая статья! Сам такой "неофит". К сожалению, не хватает кармы для того, чтобы поставить лайк, но хоть в комменте поддержу.


    1. Polesmih Автор
      00.00.0000 00:00

      Спасибо за поддержку! - это очень важно для подпитки вдохновения и мотивации))