播放2.0斯卡拉Heroku的实例没有看到每个变量的Procfile(Play 2.0 Sc

2019-10-29 15:05发布

我使用的游戏! 在Heroku 2.0斯卡拉版。 Heroku上似乎没有看到/使用的Procfile我所有的配置变量。

举例来说,在我的application.conf我有以下变量(其中包括):

mongodb.default.db = "nyancat"
mongodb.default.host = "localhost"
mongodb.default.port = 27017

这些应该是当地发展的默认值。 不过,我想我的Heroku的情况下使用MongoLabs实例。 (遗憾的是,萨拉特不以URI配置,所以我不得不把它分解成主机,端口,内容十分重要,不使用即MONGOLAB_URI)

我Procfile现在看起来是这样的:

☆  cat Procfile                                             
web: target/start -Dsecurehostname="https://example.org" \
-Dhostname="http://example.org" -Dhttp.port=$PORT \
-DapplyEvolutions.default=true -Ddb.default.driver=org.postgresql.Driver \
-Ddb.default.url=$DATABASE_URL -Dredis=$REDISTOGO_URL \
-Dmailgun.apikey=$MAILGUN_API_KEY -Dmongodb.default.db="heroku_appXXXXXXX" \
-Dmongodb.default.host="dsXXXXXX.mongolab.com" -Dmongodb.default.port=XXXXX \
-Dmongodb.default.user="heroku_appXXXXXXX" \
-Dmongodb.default.password="foobared_not"

我推并重新启动,但远程MongoDB的连接仍然表示,它连接在localhost:27017

Redis的和其他一切工作的罚款和花花公子。

远程日志显示此启动时,它显然不包含在我的Procfile所有参数:

2012-05-20T19:35:18+00:00 heroku[web.1]: Starting process with command \
`target/start -Dhostname="https://example.org" -Dhttp.port=XXXXX \
-DapplyEvolutions.default=true -Ddb.default.driver=org.postgresql.Driver \
-Ddb.default.url=<HIDDEN> -Dredis=<HIDDEN> -Dmailgun.apikey=<HIDDEN>`

即没有mongo.*参数在日志中的任何地方。

请让我知道如果我错过了什么,感谢小伙子们。


UPDATE

我试图仿效当地的Heroku,使用sbt stage和运行与应用程序foreman start 。 我设置这通过Heroku的设置环境变量,像这样运行:

app git:(master) ☆  DATABASE_URL="jdbc:h2:mem:mydatabase;MODE=PostgreSQL" \
  REDISTOGO_URL="redis://ignored:foobared@localhost:6379/" \
  foreman start
20:20:27 web.1     | started with pid 43382
20:20:27 web.1     | Play server process ID is 43382
20:20:29 web.1     | [info] play - database [default] connected at jdbc:h2:mem:mydatabase
20:20:29 web.1     | [info] play - mongodb [default] connected at "heroku_appXXXXXXX"@"dsXXXXXX.mongolab.com":XXXXX/"heroku_appXXXXXXX"
20:20:30 web.1     | [info] play - Application started (Prod)
20:20:30 web.1     | [info] play - Listening for HTTP on port 5000...

工头拿起我的生产MongoDB的价值,因为它是在Procfile,验证了我的观点是Heroku的也许是使用我Procfile旧版本的一些未知的原因。

在我的Heroku例如,Procfile肯定是没有一成不变的标志设置之一:

~ $ lsattr Procfile
------------------- Procfile

更新2

我使用MongoDB的萨拉特插件播放框架2(仅斯卡拉) 。

下面是我捡到一个模式:

每次推送成功之前,我开始实施MongoDB的支持。

然后我整合了萨拉特插件 ,注册了一个MongoLabs帐户和乐趣开始。 该插件上面的不支持com.mongodb.MongoURI并且由于它的方式解析配置,它会炸毁如果你给它-Dmongodb.uri 。 它需要一个密钥空间,像“默认”。

这使我们回到mongodb.default.*我一直在使用上面的开关。

现在我的开发周期是这样的:

push, fail
push (without changes), success, but seemingly with old Procfile
<make change>
push, fail
push (without changes), success, but seemingly with old Procfile
<make change>
push, fail
push (without changes), success, but seemingly with old Procfile
...

而最烦人的,失败的推动只是记录此:

Heroku push rejected due to an unrecognized error.

...和heroku logs -t只输出显示此:

2012-05-22T07:23:59+00:00 heroku[slugc]: Slug compilation failed: unrecognized error

它的工作原理在本地,BTW。

我带来了这一切如此的Heroku支持的注意,因为这可能是因为他们吞下由引发的错误类型安全的配置时,它可能只是使事情从一开始就清楚。

我也问他们,不要让这些第二推向成功,但随后使用旧Procfile。 非常误导的。

不用说,我现在也实现了萨拉特插件MongoURI支持。


更新3

我实现了支持为mongodb.default.uri在玩游戏! 萨拉特插件(和使用的lib /部署),但仍的Heroku抛出每当我推什么蒙戈有关我Procfile错误。

我问过的Heroku支持同样的问题,也许这里有人能回答:不Heroku的限制,你可以在Procfile使用变量?

Answer 1:

需要注意的是Procfile的启动命令可以将最多255个字符长 。 我希望所有的MongoDB的配置方式不止于此。

我建议你向一个可选的配置文件 。 用于非环境变量相关的配置,如:

web: target/start -Dhttp.port=$PORT -Ddb.default.url=$DATABASE_URL \
-Dredis=$REDISTOGO_URL -Dmailgun.apikey=$MAILGUN_API_KEY \
-Dconfig.resource=heroku-prod.conf

而在CONF / Heroku的-prod.conf:

include "application.conf"                                        

securehostname="https://example.org" 
hostname="http://example.org" 
applyEvolutions.default=true
db.default.driver=org.postgresql.Driver 
mongodb.default.db="heroku_appXXXXXXX"
mongodb.default.host="dsXXXXXX.mongolab.com"
mongodb.default.port=XXXXX \
mongodb.default.user="heroku_appXXXXXXX"
mongodb.default.password="foobared_not"


Answer 2:

也许,有些变量是由插件启用? 我没有检查Heroku的API,但它可能是一个线索。

第二点是你如何访问这些变量,我的猜测是类型安全配置系统不回退到命令行选项。

最后一点是根据https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/Configuration.scala可以在添加application.conf类路径的根,它将在生产模式中使用的明确地从CONF /取回它来代替。

我2C



Answer 3:

您也可以尝试做这样的配置在application.conf ....

我不知道这是否Heroku的生产模式,还是其他什么东西,但我已经发现了一些奇怪关于与“Heroku的配置”也设置环境变量。

在application.conf,若用符号

google.client=$(GOOGCLIENTID)

一切似乎确定在本地工作站上运行。 我可以用“Heroku的配置”,该变量被设置验证,但它在Heroku上运行时,显然不会传播到配置。

然而,这个符号工程确定:

google.client=$(?GOOGCLIENTID)

希望能帮助到你。



Answer 4:

是否有$ MAILGUN_API_KEY任何奇怪的字符? 尝试移动-Dmailgun.apikey = $ MAILGUN_API_KEY到最后......



文章来源: Play 2.0 Scala Heroku instance isn't seeing every variable in the Procfile