Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

Будуємо телеграм чат-бот на Java: від ідеї до деплою. Частина 2

Усі статті, обговорення, новини для початківців — в одному місці. Підписуйтеся на телеграм-канал!

Всім привіт! У попередній частині ми побудували простого чат-бота на Java.

У цій статті зробимо його доступним 24/7. Для цього задеплоїмо його на платформу Heroku, а також налаштуємо мінімальний процес CI/CD, використовуючи BitBucket.

Коли я писав вступ до цієї статті, то зрозумів, що вона також буде корисною і тим, кому цікаво як можна досить швидко і просто задеплоїти будь-яку Java-аплікацію на віддалений сервер.

Вважаю спосіб з Heroku найпростішим з відомих мені, який не вимагає багато знать по клауду, все максимально просто. На Heroku можна деплоїти і аплікації написані на Python, Node.js, PHP, і т. д. (загальний список можна знайти тут). Великим плюсом використання Heroku є дуже хороша і якісна документація і гуглиться все також дуже легко.

Стаття складатиметься з двох головних частин — це налаштування Heroku і конфігурація СI/CD з використанням BitBucket.

Налаштовуємо Heroku

1. Реєструємося на Heroku.

2. Додаємо банківську карточку до акаунту

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

3. Заходимо на Dashboard → New → Create new app.

4. Додаємо назву (наприклад, volunteer-dou-bot). У полі «Регіон» рекомендую залишити «United states», оскільки він дає ширші можливості в межах безкоштовних лімітів.

5. Тиснемо «Сreate app».

6. Тепер підключимо логер. Заходимо на вкладку «Resources» і в пошуку обираємо Papertail. Як на мене, це один із найзручніших агрегаторів для візуального відображення логів для Heroku, він має також непоганий безкоштовний тариф.

Цей плагін також дає круті можливості щодо створення алертів, візуального фільтрування, гнучкого пошуку логів. Безкоштовний план має певні обмеження, оскільки дозволяє відображати логи лише за останні два дні, проте для невеликих проєктів цього буде цілком достатньо.

7. Додаємо в корінь проекту два конфігураційні файли (використовуємо проєкт з попередньої статті), ці файли можна знайти в GitHub-репозиторії в окремій гілці — «deployable»).

system.properties:

java.runtime.version=11

Procfile

web: java -Dserver.port=$PORT $JAVA_OPTS -jar target/*.jar

Якщо з system.properties все зрозуміло, то Procfile використовується для того, щоб задати startup-команду. Цей файл також задає тип процесу для Dyno (Dyno — це свого роду контейнер в термінах Heroku).

Також обов’язково додамо у pom.xml плагін для створення виконуваного jar-файлу:

<build>
   <plugins>
       <plugin>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-maven-plugin</artifactId>
       </plugin>
   </plugins>
</build>

Налаштовуємо процес деплойменту

Варіант, який пропонує Heroku з використанням CLI & Git

1. На вкладці «Deploy» є інформація про те, як це можна зробити за допомогою Heroku cli.

Тобто ідея наступна: Heroku на кожну аплікацію створює новий репозиторій, і вам достатньо зробити пуш у цей репозиторій, щоб запустити автоматичний деплой.

2. Виконуємо наступні кроки, за прикладом.

Зверніть увагу: цей і наступний кроки можна буде автоматизувати за допомогою BitBucket pipelines і тим самим не встановлювати Heroku CLI. Детальніше описано в наступному розділі, проте навіть якщо ви плануєте використовувати BitBucket pipelines, все одно ознайомтеся з цим і наступним кроком для розуміння процесу.

3. Після виконання пушу в репозиторій, Heroku використає файлики, які ми додали перед цим (Procfile, system.properties), і запустить аплікацію на віддаленому сервері.

У логах ви побачите, що запуститься побудова проєкту на сервері Heroku.

Зверніть увагу на версію JDK, яка виведеться у консолі. Вона повинна співпадати з тією версією, яку ми перед цим прописали y «system.properties».

4. Перевіряємо логи, і якщо все успішно — значить аплікація задеплоїлася на Heroku.

Поширені помилки на цьому етапі

Помилка «invalid target release: 11»

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project volunteer-bot: Fatal error compiling: invalid target release: 11 -> [Help 1]

Якщо у вас виникає дана помилка при виконанні пушу в репозиторій, то скоріш за все, у логах ви побачите наступне (це означатиме, що Heroku не зумів знайти system.properties і за замовчуванням використовуватиме Java 8).

Щоб виправити це, необхідно звернути увагу на гілку, на якій ви знаходитеся. А якщо ви локально не на гілці «master», то потрібно виконати команду:

git push heroku your_branch_name:master 

або

git push heroku HEAD:master

Помилка «failed to push some refs to»

Щоб виправити цю помилку, виконуємо «force push» (це дозволить перезаписати історію і виконувати деплой з різних гілок з різною історією комітів, в тому числі ми зможемо заливати попередні версії аплікації).

git push --force heroku master

Помилка «unable to find jar», «unable to detect main class».

Щоб виправити її, перевірте, чи ви не забули додати у «pom.xml» плагін «spring-boot-maven-plugin» (який необхідно було додати на одному з попередніх етапів).

5. Переходимо далі. Після успішого виконання попередніх команд, на сторінці аплікації в Heroku ми побачимо що деплой відбувся.

І на вкладці «Resources» з’явиться інформація про контейнер (необхідно перезавантажити сторінку і зачекати 1-2 хв, тому що іноді інформація про контейнер з’являється з затримкою).

  • Зверніть увагу на команду на скріншоті вище (її ми прописували у «Procfile»).
  • Також за допомогою перемикача ми можемо запускати/зупиняти аплікацію, коли необхідно.

6. Переходимо у логер і перевіряємо, чи не виникло помилок при старті.

7. Якщо ви налаштували так, щоб bot.token, bot.username передавалися як Environment variables, то необхідно додати їх на Heroku.

Це можна зробити на вкладці Settings → Config vars.

Cюди додамо bot token, bot username, а також вкажемо часовий пояс «TZ» (це важливо для коректного відображення часу в логах, і загалом, щоб працювати з очікуваним часом).

8. Якщо все прописали правильно, то мої вітання, ви задеплоїли чат-бота на сервер і він готовий вести діалог з користувачем 😉

Автоматизуємо кроки 2 і 3 з використанням BitBucket pipelines

Для цього підключаємо СI/CD від BitBucket — «BitBucket pipelines». Плюс цього варіанту в тому, що потім можна буде запускати деплой простим натисканням однієї кнопки, при цьому використовуватимемо ту ж ідею з пушем в репозиторій Heroku. Конфігурація, яку ми додамо для цього, буде мінімальною.

1. Створюємо репозиторій на BitBucket і заливаємо туди проєкт.

2. В корінь проєкту (там де лежить pom.xml) додаємо файл.

bitbucket-pipelines.yml

#!yml
image: maven:3.6.1
pipelines:
  custom:
	deploy:
  	- step:
      	script:
        	- git push --force https://heroku:[email protected]/$HEROKU_APP_NAME.git HEAD:master
  • Зверніть увагу на поле script: воно містить команду, яка виконає пуш в репозиторій Heroku.
  • Також у цьому скрипті використовуються змінні  HEROKU_APP_NAME і HEROKU_API_KEY, в наступних кроках ми додамо їх до налаштувань репозиторію.

3. В налаштуваннях репозиторію на BitBucket включаємо пайплайни:

Repository settings → Pipelines → Settings → Enable pipelines

4. Також необхідно додати змінні репозиторію  HEROKU_APP_NAME і HEROKU_API_KEY в Repository settings → Pipelines → Repository variables.

  • Heroku token можна отримати в налаштуваннях аккаунту на Heroku.
  • App name — це назва, яку ми дали аплікації на етапі її створення на Heroku.

5. Після цього на вкладці «Branches» в контекстному меню має з’явитися пункт «Run pipeline for branch», який дозволить запустити пайплайн.

Зверніть увагу на ліміти bitbucket pipelines — не більше ніж 50 хв. на місяць. Але цього буде достатньо для більшості цілей.

6. Після запуску пайплайну, статус можна буде переглянути на відповідній вкладці у BitBucket.

Додаткові важливі налаштування Heroku

Засинаючі аплікації

Безкоштовні аплікації на Heroku засинають, якщо вони не отримують запитів протягом 30 хв. (саме веб-запитів через REST ендпоінти).

Якщо повернутися трохи вище до додавання Procfile, то побачимо, що там ми задали наступне налаштування (зверніть увагу, що воно починається з «web»):

web: java -Dserver.port=$PORT $JAVA_OPTS -jar target/*.jar

А оскільки аплікація на безкоштовному плані, вона засинатиме і чатбот не зможе відповідати на повідомлення.
Щоб аплікація не засинала, будемо її час від часу «пінгати». Це можна зробити через сторонні health-check сервіси, або ж використати наступний варіант з Heroku Scheduler.

Для цього додамо до аплікації spring-boot-starter-actuator, який додасть ендпоінт /actuator/health. Не забуваємо також додати spring-boot-starter-web.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

Далі переходимо в Heroku і додаємо плагін «Heroku Scheduler».

В налаштуваннях Scheduler задаємо команду:

curl -X GET https://<app-name>.herokuapp.com/actuator/health

Автоматичне перезавантаження Dyno

Heroku автоматично перезавантажує контейнери хоча б раз на день (це стосується контенерів усіх видів, платних у тому числі), але наперед невідомо, о котрій годині це відбудеться. І хоча перезапуск це, по суті, досить швидка дія, проте можуть виникнути проблеми, якщо ви використовуєте заплановані або відкладені завдання в аплікації. В цьому разі може виникнути ситуація коли неочікуваний рестарт помішає логіці роботи аплікації.

Проте ми можемо уникнути цього і вручну перезавантажити контейнер в зручний і очікуваний для нас час, і тоді Heroku не буде їх чіпати.

Використовуючи Heroku Scheduler, додамо нову команду, що автоматично «вимикатиме» контейнер, і після цього контейнер зразу ж перезапуститься.

curl -X DELETE https://api.heroku.com/apps/volunteer-dou-bot/dynos -H "Content-Type:application/json" -H "Accept: application/vnd.heroku+json; version=3" -H "Authorization: Bearer <token>"
  • У команді вказуємо правильний url з назвою аплікації, а також API-токен, який можна отримати тут: Heroku → Manage account → Applications → Authorizations
  • Також вказуємо час, коли ми хочемо перезапустити аплікацію.

Підключення бази даних на Heroku

Якщо необхідно підключити базу даних, то наприклад, для PostgreSQL додаємо плагін «Heroku Postgres» — він автоматично дозволить створити базу даних і приєднати її до аплікації.

Якщо ви використовуєте Spring Boot, то його автоконфігурація разом з автоконфігурацією Heroku зробить свою магію і автоматично підключить аплікацію до цієї бази даних (детальніше тут).

Зверніть увагу на дата-сервіси, які підтримує Heroku. Щодо баз даних, то найбільшу підтримку і можливості вони надають саме для Postgres.

Також зверніть увагу на ліміти безкоштовного плану для бази даних. Якщо коротко, то це:

  • Максимум 10 000 записів на всю базу даних.
  • Максимум 1GB даних.

Проте в більшості випадків вам буде достатньо і цих лімітів.

Зупинка контейнера

Зупинити аплікацію можна на вкладці Resources.

Перезапуск аплікації

Перезапустити аплікацію можна в меню «more → restart all dynos».

Інформація про Dyno-hours і ліміти

З поточними лімітами можна ознайомитися на вкладі Billing →Free dyno usage.

При додаванні банківської карточки, Heroku дозволяє безкоштовно збільшити ці ліміти до 1000 dyno hour.

Що таке «dyno hour»?

Використання Heroku обчислюється в годинах, протягом яких аплікація запущена. Тобто якщо ви запустили аплікацію о 15:00 і зупинили о 19:30, це означатиме, що ви використали 4.5 dyno hours.
Якщо ми хочемо, щоб аплікація була доступна 24/7, то на місяць нам потрібно мінімум 31*24 = 744 dyno-hour.

Поради щодо деплойменту і розробки

При розробці чат-ботів зручно створювати окремі енвайрменти, і окремих ботів:

  • наприклад, для dev цілей — створити бота — volunteer_dev_bot і створити додаткову аплікацію на Heroku під цього бота;
  • а для того щоб локально працювати — створити бота — volunteer_local_bot.

Тут є важливий момент, Telegram API не дозволяє одночасну роботу двох екзеплярів одного і того ж чат-бота. Тобто в конкретний момент часу може бути запущений лише один «слухач запитів». Інакше отримуватимемо помилки такого плану:

Error getting updates: [409] Conflict: terminated by other getUpdates request; make sure that only one bot instance is running

Налаштування логера Papertrail

Якщо необхідно налаштувати часову зону...

... це можна зробити в «Settings → Profile».

Вимкнути показ дати і часу і додатково налаштувати відображення логів можна тут:

Alerts в Papertrail

На вкладці «Alerts» у головному вікні Papertrail можна налаштувати сповіщення на пошту/Slack і т д. у разі появи логів, які містять певний текст.

Наприклад, можна налаштувати, щоб у разі появи «Exception» чи «Error» ви отримували емейл. На цьому прикладі — Papertrail моніторитиме запит щохвилини і у випадку появи цих логів, відправить емейл отримувачам.

Переривання зв’язку з сервером телеграму

Час від часу (раз у день або раз у кілька днів) можуть з’являтися переривання у інтернет-з’єднанні на Heroku, тому ви можете отримувати схожі помилки від телеграму в логах, як на скріншоті з емейлу вище. Ми їх отримуємо, бо використовуємо Long polling механізм для отримання повідомлень від телеграму, який означає те, що ми тримаємо постійний зв’язок з телеграмом і будь-яке переривання інтернету буде одразу ж помітно у логах.

Проте оскільки перебої тривають лише 1-2 секунди, то для нас це просто означатиме наступне: якщо в цей момент бот комунікував з користувачем (що досить малоймовірно), то користувач отримає цю відповідь з затримкою в 1-2 секунди. А це, в свою чергу, не є проблемою для більшості випадків (окрім високозавантажених систем, для яких необхідно вже використовувати платні тарифи Heroku або інші клауд-рішення, які дозволять уникнути схожих помилок).

Висновки

Отож, у цій статті ми побачили, як можна швидко налаштувати віддалений сервер, цим самим зробивши чат-бота доступним 24/7. Звісно, прийшлося зробити додаткові налаштування для роботи з лімітами, проте в більшості випадків цих лімітів для роботи чат-бота буде достатньо. А якщо не вистачатиме ресурсів, тоді можна розглянути переїзд на інші клауд-платформи, такі як AWS (але які вже вимагатимуть більше налаштувань), або ж використовувати платні плани від Heroku.

Код проєкту разом з файлами налаштуваннь Heroku і BitBucket можна знайти тут.

Думаю, стаття була корисною, залишайте в коментарях ваші думки, радий буду почути і відповісти.

Мій телеграм: @tarasvv

update August 30, 2022: heroku закриває безкоштовні плани, деталі і обговорення альтернатив в коментарях тут
update November 20, 2022: heroku запускає mini — плани (eco dynos — 1000 dyno-hours за 5$, heroku postgres mini — 5$). Також діють спеціальні безкоштовні умови для студентів (в межах 13$ на місяць)
👍ПодобаєтьсяСподобалось18
До обраногоВ обраному6
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

update November 20, 2022: heroku запускає mini — плани (eco dynos — 1000 dyno-hours за 5$, heroku postgres mini — 0.01$). Також діють спеціальні безкоштовні умови для студентів (в межах 13$ на місяць)

Upd: heroku закриває безкоштовні плани, але це все ще крута платформа 🥲

Новина на dou + обговорення + альтернативи в коментарях:
dou.ua/forums/topic/39797

Heroku прикриває свої безкоштовні плани з 28 листопада(( Не підкажете якусь достойну альтернативу для подібного роду задач?

До речі дійсно так, дуже шкода :( наразі не підкажу, бо ще не дізнавався, але також планую шукати якусь безкоштовну альтернативу

У AWS є free-tier опція, але лише на рік, тому ця проблема знову з’явиться через рік. Як варіант через рік створити новий обліковий запис з іншим емейлом :)

Ага, але з aws прийдеться трохи понастроювати , а якраз heroku класний тим що мінімум налаштувань треба робити💪 і дуже добре підходив під пет-проекти. Але я так зрозумів там люди зловживали цими безплатними планами, може майнили біткоїн на 100+ акаунтах або що і через це хероку прикрив лавочку🥲

Тут якраз новина про це була на доу:
dou.ua/...​elegram&utm_medium=social

Upd: бачу що в коментарях там люди рекомендують схожі платформи

Дякую за статтю, цікаво було! Питання, якщо можете, підкажіть, що не так, в мене все одно проблема с портом на хероку, хоча прокфайл ідентичний, що може бути не так? Здається я вже всі варіанти перепробував.

2022-08-27T13:43:07.159821+00:00 heroku[web.1]: Starting process with command `java -Dserver.port=32273 $JAVA_OPTS -jar target/*.jar`
2022-08-27T13:43:07.904570+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will override them.
2022-08-27T13:43:07.911110+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -XX:+UseContainerSupport -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8
2022-08-27T13:44:37.357533+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 90 seconds of launch
2022-08-27T13:44:37.425754+00:00 heroku[web.1]: Stopping process with SIGKILL
2022-08-27T13:44:37.610927+00:00 heroku[web.1]: Process exited with status 137
2022-08-27T13:44:37.693204+00:00 heroku[web.1]: State changed from starting to crashed

Застосунок стартує все ок, але після 90 секунд падає.

Рішення знайдено, може комусь також знадобиться — якщо це не web проєкт, як в мене наприклад (запускаю просто thread через певний проміжок часу і результат виконання надсилаю собі у телеграм), то в прокфайлі достатньо прописати:

worker: java -jar target/*.jar

І все буде працювати!

На heroku я не поклався на магію підключення до бази, а прописав через свої у Config Vars
А потім була несподіванка, коли heroku вирішив змінити інстанс бази, параметри змінились, і те що вони автоматично оновили це: DATABASE_URL
Тож магії треба довіряти :)

Таа, є така штука :) хероку любить здивувати :D, але отакі міграції інстансів або бази без попереджень відбуваються лиш на безкоштовних тарифах для їхньої внутрішньої оптимізації, а так то зазвичай вони попереджають емейлами.

Цікаво! Дякую! А можливо деплоіти с GitHub на Heroku і не використовувати BitBacket?

Ага, звісно, там до речі Heroku дає вбудовані хороші можливості по інтеграції з GitHub.

Проте також зверніть увагу, в Heroku недавно сталася серйозна хакерська атака якраз через токени GitHub («GitHub-related OAuth security breach») і хакери отримали доступи до великої кількості приватних репозиторіїв і т. д. На даний момент, виглядає що проблеми пов’язані з безпекою поправили, і разом з тим наразі ще працюють над покращеннями:

blog.heroku.com/...​github-integration-update

-

ого сколько гемороя реализовать это на Java, тут неделю нужно разбираться и собирать решение

Ну в цій статті конкретно суто кроки по деплойменту, там в принципі на будь-якій мові буде плюс-мінус так само 😊. Але по факту там робиться все досить швидко, просто розписав кроки максимально детально, з нюансами які можуть виникнути і т д.

Але порозбиратися є з чим, тут згоден, зате один раз ознайомившись і спробувавши потім буде не проблема задеплоїти будь-який інший java-проект на Heroku, тому думаю стаття має бути корисною.

Добрий день. Вивчаю java лише рік, так шо вибачаюсь за технічну неграмотність. Взяв повністю ваш pom.xml, начебто правильно задеплоїв оскільки характерне повідомлення отримую " bot-test-maks.herokuapp.com deployed to Heroku„. Dyno також ввімкнене. Але бот не працює. Але пробелма судячи по логам в тому, що jar не бачить mainClass:Build started by user [email protected]
2022-06-09T13:30:15.997910+00:00 app[api]: Deploy 99fd582c by user [email protected]
2022-06-09T13:30:15.997910+00:00 app[api]: Release v8 created by user [email protected]
2022-06-09T13:30:16.570660+00:00 heroku[web.1]: State changed from crashed to starting
2022-06-09T13:30:17.000000+00:00 app[api]: Build succeeded
2022-06-09T13:30:19.258676+00:00 heroku[web.1]: Starting process with command `java -Dserver.port=22133 $JAVA_OPTS -jar target/*.jar`
2022-06-09T13:30:20.874902+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will override them.
2022-06-09T13:30:20.882218+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -XX:+UseContainerSupport -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8
2022-06-09T13:30:21.040916+00:00 app[web.1]: no main manifest attribute, in target/telegram-simple-bot-java-1.0.jar
2022-06-09T13:30:21.259717+00:00 heroku[web.1]: Process exited with status 1
2022-06-09T13:30:21.325715+00:00 heroku[web.1]: State changed from starting to crashed

В інтернеті знайшов вирішення — додати в pom:

true
lib/
com.mypackage.MyClass

Але не розумію, що вказувати замість „com.mypackage.MyClass”, оскільки Maven проект посилається на Вас: org.vladyka:telegram-simple-bot-java.

Чи можете допомогти з вирішенням цього питання?) Дякую!

Привіт Максим, круто що цікавитеся і пробуєте з чат-ботами 👍

Щодо помилки і якщо ви використовуєте spring-boot то з великою ймовірністю виглядає так що потрібно додати у pom.xml

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

Детальніше в статті в секції «Поширені помилки на цьому етапі» → «Помилка „unable to find jar“, „unable to detect main class“ »

Повний приклад з налаштуваннями для деплойменту і повним pom.xml лежить в окремій гілці:
github.com/...​egram-bot/tree/deployable

Цей плагін якраз дозволить збілдити «executable jar». Дасте знати чи допомогло вирішити проблему 🙂

Але це спрацює якщо ви використовуєте spring-boot. Ви використовуєте spring-boot?

В загальному

Виглядає так що потрібно додати плагін який дозволить збілдити коректний jar.

1. Якщо ви використовуєте spring-boot, то необхідно додати у pom.xml

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>

Детальніше писав про це в статті в секції «Поширені помилки на цьому етапі» → «Помилка „unable to find jar“, „unable to detect main class“ »

Повний приклад з налаштуваннями для деплойменту і повним pom.xml лежить в окремій гілці:
github.com/...​egram-bot/tree/deployable

2. Якщо це звичайний java-проект без spring boot

Я спробував запропоновані рішення з stack overflow(з посилання яке ви скинули)
Одна з відповідей допомогла: stackoverflow.com/a/27662742

Потрібно додати в pom.xml наступний плагін(Також верніть увагу на те що потрібно вказати коректний шлях до класу де лежить «main» )

<build>
	<plugins>
		<plugin>
			<artifactId>maven-assembly-plugin</artifactId>
			<version>3.3.0</version>
			<executions>
				<execution>
					<phase>package</phase>
					<goals>
						<goal>single</goal>
					</goals>
				</execution>
			</executions>
			<configuration>
				<archive>
					<manifest>
						<addClasspath>true</addClasspath>
						<mainClass>org.vladyka.Application</mainClass>
					</manifest>
				</archive>
				<descriptorRefs>
					<descriptorRef>jar-with-dependencies</descriptorRef>
				</descriptorRefs>
			</configuration>
		</plugin>
	</plugins>
</build>


Дасте знати чи допомогло вирішити проблему 🙂

.

Доброго дня, так дійсно, спочтаку взяв ваш помник з гілки „мастер”, там якраз не було частини з spring-boot-maven-plugin. Але далі додав, і все одно чогось не працювало. Мабуть щось недогледів і почав хімічити зайвого)) Зараз виникла нова пробелма) Взяв ваш помник з гілки деплоймент — запрацювало. Але працює недовго — дві хвилини. Логи помилки прикріпляю:

2022-06-10T15:57:51.723669+00:00 app[web.1]: 15:57:51.723 [@test_heroku_deploy_bot Telegram Executor] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager — Connection [id: 0][route: {s}->api.telegram.org:443] can be kept alive indefinitely
2022-06-10T15:57:51.723713+00:00 app[web.1]: 15:57:51.723 [@test_heroku_deploy_bot Telegram Executor] DEBUG org.apache.http.impl.conn.DefaultManagedHttpClientConnection — http-outgoing-0: set socket timeout to 0
2022-06-10T15:57:51.723810+00:00 app[web.1]: 15:57:51.723 [@test_heroku_deploy_bot Telegram Executor] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager — Connection released: [id: 0][route: {s}->api.telegram.org:443][total available: 1; route allocated: 1 of 2; total allocated: 1 of 100]
2022-06-10T15:58:34.237531+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 90 seconds of launch
2022-06-10T15:58:34.451932+00:00 heroku[web.1]: Stopping process with SIGKILL
2022-06-10T15:58:34.664121+00:00 heroku[web.1]: Process exited with status 137
2022-06-10T15:58:34.780878+00:00 heroku[web.1]: State changed from starting to crashed
2022-06-10T15:58:37.846991+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=bot-test-maks.herokuapp.com request_id=d7e30a2f-9054-4753-97d7-a85e5aa7cb44 fwd="178.151.146.144″ dyno= connect= service= status=503 bytes= protocol=https

Хочу дуже подякувати за статтю і за приділений час! Хоч і пропрацював дві хвиилни , але радощів повні штани)

Тут знайшов щось схоже на вирішення, але в Вашему pom.xml наскільки я розумію вказано все так само. Це те що вказано в Dyno мого проекту heroku: java -Dserver.port=$PORT $JAVA_OPTS -jar target/*.jar

Дякую, приємно що стаття приносить користь 😊
А щодо помилки, то виглядає так що падає конкретно через цю помилку

2022-06-10T15:58:34.237531+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 90 seconds of launch

Перевірте добре, чи тут вказано тип web і після цього перезапустіть за допомогою перемикача справа
prnt.sc/RUFX-rMyWSUO

А також в Procfile теж має бути вказано тип web:

web: java -Dserver.port=$PORT $JAVA_OPTS -jar target/*.jar

Я здогадуюся в чому може бути причина, там pom.xml в гілці deployable — він заточений під spring-boot проект, тому відповідно треба буде ще деякі налаштування додати щоб аплікація запустилася.

Тобто щоб виправити необхідно додати налаштування як отут:
prnt.sc/zi9-WjsciPXa

Або можна інший варіант, щоб не робити spring-boot проект, вернути pom до того стану в якому він був перед додаванням spring-boot залежностей.
І після цього додати в pom.xml оцей плагін(той що я описував вище в коментарях)

maven-assembly-plugin

І тоді теж має запрацювати(вчора сам пробував з цим плагіном, і все запрацювало)

Підписатись на коментарі