我正在玩Play! 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.*
个参数。
如果我遗失了什么,请告诉我,谢谢费拉斯。
更新
我尝试使用sbt stage
在本地模拟Heroku,并使用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
我正在使用MongoDB Salat plugin for Play Framework 2 (Scala only)。
这是我选择的模式:
在我开始实施MongoDB支持之前,每次推送都成功。
然后我整合了Salat plugin,注册了一个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支持注意,因为它可能会吞下Typesafe's Config引发的错误,因为它可以让事情从一开始就更清楚。
我还要求他们不要让第二次推送成功,但随后使用旧的Procfile。非常误导。
毋庸置疑,我现在也在实施MongoURI对Salat插件的支持。
更新3
Play中mongodb.default.uri
的I've implemented support! Salat插件(并使用lib /部署它),但每当我在Procfile中推送任何与mongo相关的内容时,Heroku仍会抛出错误。
我已经要求Heroku支持同样的问题,也许这里有人可以回答:Heroku是否限制了你可以在Procfile中使用的变量?
答案 0 :(得分:4)
请注意,Procfile的start命令可以是最多255个字符。我希望你所有的mongodb配置都超越了这一点。
我建议您参考alternative configuration file。对于非environment variable依赖配置,例如:
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"
答案 1 :(得分:0)
也许插件启用了一些变量? 我没有检查过heroku api,但它可能是一个线索。
第二点是你如何访问这些变量,我的猜测是类型安全配置系统不会回退到命令行选项。
最后一点是根据https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/Configuration.scala你可以在类路径的根目录中添加一个application.conf,它将在生产模式下使用,而不是从conf /中显式检索它。3>
我的2c
答案 2 :(得分:0)
你也可以尝试在application.conf ....
中进行这样的配置我不确定这个heroku,生产模式还是其他什么,但我注意到有关使用'heroku config'设置的环境变量的一些奇怪的事情。
在application.conf中,如果使用符号
google.client=$(GOOGCLIENTID)
在本地工作站上运行的一切似乎都可以。我可以使用'heroku config'验证变量是否已设置,但在heroku上运行时,它显然不会传播到配置。
但是,这种表示法可行:
google.client=$(?GOOGCLIENTID)
希望它有所帮助。
答案 3 :(得分:0)
$ MAILGUN_API_KEY中是否有任何有趣的字符?尝试移动-Dmailgun.apikey = $ MAILGUN_API_KEY到最后......