【问题标题】:Failure when deploying to heroku部署到heroku时失败
【发布时间】:2016-03-06 15:48:44
【问题描述】:

我正在尝试将我的 Play 应用程序部署到 Heroku。

不幸的是,我遇到了这个问题:

2016-03-06T14:19:45.939373+00:00 heroku[web.1]: State changed from starting to crashed
2016-03-06T14:19:45.918504+00:00 heroku[web.1]: Process exited with status 255
2016-03-06T14:49:45.477844+00:00 heroku[web.1]: State changed from crashed to starting
2016-03-06T14:49:49.783812+00:00 heroku[web.1]: Starting process with command `target/universal/stage/bin/todolistscala -Dhttp.port=12681`
2016-03-06T14:49:51.431641+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will override them.
2016-03-06T14:49:51.599056+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx350m -Xss512k -Dfile.encoding=UTF-8
2016-03-06T14:49:54.014919+00:00 app[web.1]: [[37minfo[0m] application - Creating Pool for datasource 'default'
2016-03-06T14:49:54.492047+00:00 app[web.1]: [[37minfo[0m] p.a.d.DefaultDBApi - Database [default] connected at jdbc:h2:mem:play
2016-03-06T14:49:57.727928+00:00 app[web.1]: [[33mwarn[0m] application - application.conf @ file:/app/target/universal/stage/conf/application.conf: 348: applyEvolutions.default is deprecated, use play.evolutions.db.default.autoApply instead
2016-03-06T14:49:58.246865+00:00 app[web.1]: [[31merror[0m] p.a.l.c.CryptoConfigParser - The application secret has not been set, and we are in prod mode. Your application is not secure.
2016-03-06T14:49:58.247105+00:00 app[web.1]: [[31merror[0m] p.a.l.c.CryptoConfigParser - To set the application secret, please read http://playframework.com/documentation/latest/ApplicationSecret
2016-03-06T14:49:58.258404+00:00 app[web.1]: [[31merror[0m] p.a.l.c.CryptoConfigParser - The application secret has not been set, and we are in prod mode. Your application is not secure.
2016-03-06T14:49:58.258431+00:00 app[web.1]: [[31merror[0m] p.a.l.c.CryptoConfigParser - To set the application secret, please read http://playframework.com/documentation/latest/ApplicationSecret
2016-03-06T14:49:58.258933+00:00 app[web.1]: [[31merror[0m] p.a.l.c.CryptoConfigParser - The application secret has not been set, and we are in prod mode. Your application is not secure.
2016-03-06T14:49:58.259062+00:00 app[web.1]: [[31merror[0m] p.a.l.c.CryptoConfigParser - To set the application secret, please read http://playframework.com/documentation/latest/ApplicationSecret
2016-03-06T14:49:58.293455+00:00 app[web.1]: [[37minfo[0m] application - ApplicationTimer demo: Starting application at 2016-03-06T14:49:58.259Z.
2016-03-06T14:49:58.294643+00:00 app[web.1]: [[31merror[0m] p.a.l.c.CryptoConfigParser - The application secret has not been set, and we are in prod mode. Your application is not secure.
2016-03-06T14:49:58.294826+00:00 app[web.1]: [[31merror[0m] p.a.l.c.CryptoConfigParser - To set the application secret, please read http://playframework.com/documentation/latest/ApplicationSecret
2016-03-06T14:49:58.297164+00:00 app[web.1]: [[31merror[0m] p.a.l.c.CryptoConfigParser - The application secret has not been set, and we are in prod mode. Your application is not secure.
2016-03-06T14:49:58.297222+00:00 app[web.1]: [[31merror[0m] p.a.l.c.CryptoConfigParser - To set the application secret, please read http://playframework.com/documentation/latest/ApplicationSecret
2016-03-06T14:49:58.297271+00:00 app[web.1]: [[31merror[0m] p.a.l.c.CryptoConfigParser - The application secret has not been set, and we are in prod mode. Your application is not secure.
2016-03-06T14:49:58.297976+00:00 app[web.1]: [[31merror[0m] p.a.l.c.CryptoConfigParser - To set the application secret, please read http://playframework.com/documentation/latest/ApplicationSecret
2016-03-06T14:49:58.303328+00:00 app[web.1]: Oops, cannot start the server.
2016-03-06T14:49:58.305408+00:00 app[web.1]: @6pba2k59a: Configuration error
2016-03-06T14:49:58.305742+00:00 app[web.1]:    at play.api.libs.crypto.CryptoConfigParser.get$lzycompute(Crypto.scala:498)
2016-03-06T14:49:58.305830+00:00 app[web.1]:    at play.api.libs.crypto.CryptoConfigParser.get(Crypto.scala:465)
2016-03-06T14:49:58.305890+00:00 app[web.1]:    at play.api.libs.crypto.CryptoConfigParser.get(Crypto.scala:463)
2016-03-06T14:49:58.305953+00:00 app[web.1]:    at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:81)
2016-03-06T14:49:58.306059+00:00 app[web.1]:    at com.google.inject.internal.BoundProviderFactory.provision(BoundProviderFactory.java:72)

由于涉及Application Secret 的错误,我读到了这个:https://www.playframework.com/documentation/2.5.x/ApplicationSecret。但是,我不明白如何在本地计算机上没有密钥的情况下将密钥发送到服务器环境。

但无论如何,我不确定没有Application Secret 是问题的实际原因,因为无法启动服务器(我假设即使我没有@,也可以启动服务器987654325@)。

这个失败的原因是什么?

【问题讨论】:

  • application.conf的内容是什么?

标签: scala heroku playframework


【解决方案1】:

您应该在 Heroku 上将应用程序密码设置为环境变量。这样,它只对应用程序环境可用,并且在必要时无需重新部署即可轻松更改。

您可以在Procfile 中添加标志:

web: target/universal/stage/bin/todolistscala \
-Dhttp.port=12681 \
-Dplay.crypto.secret=${APPLICATION_SECRET}

以上是为了更好的可视化,但Procfile 不适用于每个进程的多行。它应该看起来像这样:

web: target/universal/stage/bin/todolistscala -Dhttp.port=12681 -Dplay.crypto.secret=${APPLICATION_SECRET}

然后设置环境变量APPLICATION_SECRET。您可以从 Heroku Web 界面或使用 Heroku 工具带执行此操作:

heroku config:set APPLICATION_SECRET="thisisthesecretpleasechangeit" -a your-app-name

通常,您的所有重要凭据(数据库、缓存服务器、API 密钥)都应该以这种方式存储在应用程序环境中。

【讨论】:

  • 我创建了Procfile,设置了环境变量并提交了Procfile。但是,当我推送时,我仍然会遇到同样的错误。
  • 您实际使用的是 Play 2.5 还是 2.4? 2.3 或更早版本使用application.secret 而不是play.crypto.secret
  • 现在我想起来了,Procfile 很烦人必须是一行,所以如果你复制/粘贴的正​​是我所拥有的,它会忽略其他行。
  • 是的,我正在使用 Play 2.5.0 并将命令放在一行中,但我仍然遇到同样的问题。
  • 或许可以尝试引用${APPLICATION_SECRET}?命令行标志是我使用的,所以我不知道它是如何工作的,除非拼写错误和缺少字符。
猜你喜欢
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 2021-03-27
  • 2013-04-08
  • 2017-02-12
相关资源
最近更新 更多