0

我正在使用播放!Heroku 上的 2.0 Scala 版本。Heroku 似乎没有看到/使用我在 Procfile 中的所有配置变量。

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

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

这些应该是本地开发的默认设置。但是,我希望我的 Heroku 实例使用 MongoLabs 实例。(不幸的是,Salat 没有配置 URI,所以我不得不将其分解为主机、端口、yada yada,即未使用 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.*日志中没有任何参数。

如果我遗漏了什么,请告诉我,谢谢各位。


更新

我尝试在本地模拟 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...

foreman 获取我在 Procfile 中的 PRODUCTION MongoDB 值,这验证了我的论点,即 Heroku 可能出于某种未知原因使用了我的 Procfile 的旧版本。

在我的 Heroku 实例上,Procfile 也绝对没有设置不可变标志:

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

更新 2

我正在为 Play Framework 2 (Scala only) 使用 MongoDB Salat 插件

这是我挑选的一个模式:

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

然后我集成了Salat 插件,注册了一个 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

它在本地工作,顺便说一句。

我把这一切都带来了 Heroku 支持的关注,因为它们可能会吞下Typesafe 的 Config抛出的错误,而它可以从一开始就让事情变得更清晰。

我还要求他们不要让第二次推送成功,而是使用旧的 Procfile。非常误导。

不用说,我现在也在为 Salat 插件实现 MongoURI 支持。


更新 3

我已经mongodb.default.uri在 Play 中实现了对的支持!Salat 插件(并使用 lib/ 部署它),但是每当我在我的 Procfile 中推送任何与 mongo 相关的内容时,Heroku 仍然会引发错误。

我问 Heroku 是否支持同样的问题,也许这里有人可以回答:Heroku 是否限制了您可以在 Procfile 中使用的变量?

4

4 回答 4

4

请注意,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"
于 2012-05-24T22:28:19.367 回答
0

也许插件启用了一些变量?我没有检查heroku api,但这可能是一个线索。

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

最后一点是根据https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/Configuration.scala可以在application.conf中添加classpath 的根目录,它将在生产模式下使用,而不是从 conf/ 显式检索它。

我的2c

于 2012-05-20T21:24:08.817 回答
0

您也可以尝试在 application.conf 中进行这样的配置 ....

我不确定这个heroku、生产模式还是其他什么,但我注意到使用“heroku config”设置的环境变量也有些奇怪。

在 application.conf 中,如果使用符号

google.client=$(GOOGCLIENTID)

在本地工作站上运行似乎一切正常。我可以使用“heroku config”验证变量是否已设置,但在 heroku 上运行时,它显然不会传播到配置中。

但是,这种表示法可以正常工作:

google.client=$(?GOOGCLIENTID)

希望能帮助到你。

于 2012-05-21T11:58:43.263 回答
0

$MAILGUN_API_KEY 中有什么有趣的字符吗?尝试将 -Dmailgun.apikey=$MAILGUN_API_KEY 移动到最后...

于 2012-05-21T17:02:14.450 回答