我正在尝试将我的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
是问题的真正原因,因为无法启动服务器(我认为即使我不打算服务器也可以启动服务器&# 39; t有Application Secret
)。
这次失败的原因是什么?
答案 0 :(得分:3)
您应该将应用程序机密设置为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密钥)都应以这种方式存储在应用程序环境中。