Сбой приложения Scala при запуске на Heroku, включая базовый hello world

#scala #heroku #deployment #akka-http

#scala #heroku #развертывание #akka-http

Вопрос:

tldr: получение следующей ошибки на самом простом из возможных серверов Akka:

 2020-11-23T00:24:52.212270 00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2020-11-23T00:24:52.239873 00:00 heroku[web.1]: Stopping process with SIGKILL
2020-11-23T00:24:52.339576 00:00 heroku[web.1]: Process exited with status 137
 

Пытаюсь развернуть на Heroku, не уверен, что делать.

У меня есть приложение Scala, работающее на Akka HTTP, которое я хочу развернуть в Heroku. Это не сработало, поэтому я создал супер простой пример, который имеет только одну конечную точку («/») и возвращает строку HTML. У него есть только три зависимости, все Akka.

У меня есть собственная программа запуска sbt, определенная в plugins.sbt, и пакет JavaAppPackaging включен в build.sbt. Он отлично работает локально ( heroku local web ), но когда я нажимаю на производство, я получаю следующие журналы:

 2020-11-22T23:57:21.620869 00:00 app[api]: Release v7 created by user <myuser>
2020-11-22T23:57:22.201143 00:00 heroku[web.1]: State changed from crashed to starting
2020-11-22T23:57:25.502636 00:00 heroku[web.1]: Starting process with command `target/universal/stage/bin/hello-world -Dhttp.port=12828`
2020-11-22T23:57:27.881143 00:00 app[web.1]: Create a Procfile to customize the command used to 
run this process: https://devcenter.heroku.com/articles/procfile
2020-11-22T23:57:28.043747 00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
2020-11-22T23:57:29.231879 00:00 app[web.1]: SLF4J: Failed to load class 
"org.slf4j.impl.StaticLoggerBinder".
2020-11-22T23:57:29.231937 00:00 app[web.1]: SLF4J: Defaulting to no-operation (NOP) logger 
implementation
2020-11-22T23:57:29.232029 00:00 app[web.1]: SLF4J: See 
http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2020-11-22T23:57:30.667572 00:00 app[web.1]: Server online at http://localhost:12828/
2020-11-22T23:57:30.667588 00:00 app[web.1]: Press RETURN to stop...
2020-11-22T23:57:30.957876 00:00 heroku[web.1]: Process exited with status 0
2020-11-22T23:57:31.007237 00:00 heroku[web.1]: State changed from starting to crashed
 

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

Я изменил это на завершение при получении q из StdIn. Затем я получаю NPE:

 2020-11-23T00:09:30.925091 00:00 app[web.1]: Server online at http://localhost:30082/
2020-11-23T00:09:30.925170 00:00 app[web.1]: Enter q to stop...
2020-11-23T00:09:30.927455 00:00 app[web.1]: Exception in thread "main" java.lang.NullPointerException
2020-11-23T00:09:30.927696 00:00 app[web.1]: at Main$.delayedEndpoint$Main$1(Main.scala:21)
2020-11-23T00:09:30.927827 00:00 app[web.1]: at Main$delayedInit$body.apply(Main.scala:8)
2020-11-23T00:09:30.927915 00:00 app[web.1]: at scala.Function0.apply$mcV$sp(Function0.scala:39)
2020-11-23T00:09:30.927998 00:00 app[web.1]: at scala.Function0.apply$mcV$sp$(Function0.scala:39)
2020-11-23T00:09:30.928055 00:00 app[web.1]: at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
2020-11-23T00:09:30.928131 00:00 app[web.1]: at scala.App.$anonfun$main$1(App.scala:73)
2020-11-23T00:09:30.928190 00:00 app[web.1]: at scala.App.$anonfun$main$1$adapted(App.scala:73)
2020-11-23T00:09:30.928254 00:00 app[web.1]: at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:553)
2020-11-23T00:09:30.928324 00:00 app[web.1]: at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:551)
2020-11-23T00:09:30.928406 00:00 app[web.1]: at scala.collection.AbstractIterable.foreach(Iterable.scala:920)
2020-11-23T00:09:30.928509 00:00 app[web.1]: at scala.App.main(App.scala:73)
2020-11-23T00:09:30.928583 00:00 app[web.1]: at scala.App.main$(App.scala:71)
2020-11-23T00:09:30.928643 00:00 app[web.1]: at Main$.main(Main.scala:8)
2020-11-23T00:09:30.928701 00:00 app[web.1]: at Main.main(Main.scala)
 

Поэтому я изменил его так, чтобы не было возможности завершить работу из оболочки, которая в любом случае бесполезна для развертывания, и вместо этого добавил в программу привязку к порту. Теперь я получаю следующее:

 2020-11-23T00:23:48.274903 00:00 heroku[web.1]: State changed from crashed to starting
2020-11-23T00:23:51.899150 00:00 heroku[web.1]: Starting process with command `target/universal/stage/bin/hello-world -Dhttp.port=53789`
2020-11-23T00:23:54.456208 00:00 app[web.1]: Create a Procfile to customize the command used to run this process: https://devcenter.heroku.com/articles/procfile
2020-11-23T00:23:54.664379 00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8
2020-11-23T00:23:56.447805 00:00 app[web.1]: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
2020-11-23T00:23:56.447951 00:00 app[web.1]: SLF4J: Defaulting to no-operation (NOP) logger implementation
2020-11-23T00:23:56.448056 00:00 app[web.1]: SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2020-11-23T00:23:59.188735 00:00 app[web.1]: Server online at http://localhost:53789/
2020-11-23T00:24:52.212270 00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2020-11-23T00:24:52.239873 00:00 heroku[web.1]: Stopping process with SIGKILL
2020-11-23T00:24:52.339576 00:00 heroku[web.1]: Process exited with status 137
2020-11-23T00:24:52.391175 00:00 heroku[web.1]: State changed from starting to crashed
 

На данный момент я просто не знаю, что делать. Кажется, что независимо от того, что я пытаюсь, программа просто не может подключиться к порту. Помогите?

Комментарии:

1. Что вы подразумеваете под производством? aws machiens? Похоже, что в последнем опыте вы изменили порт с 12828 на 53789. Вы открыли порт на компьютере?

2. Возможно, вы пытаетесь привязаться к какому-то порту, который недоступен на heroku. Можете ли вы поделиться своим основным кодом приложения?

3. Конфигурация приложения должна учитывать использование переменной среды PORT для привязки службы HTTP