我正在使用播放!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 中使用的变量?