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 は使用されていません)

私のProfileは次のようになります。

☆  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 は私の PRODUCTION MongoDB の値を Procfile にあるとおりに取得します。これは、Heroku が何らかの理由で私の Procfile の古いバージョンを使用している可能性があるという私の主張を検証します。

私の Heroku インスタンスでは、Procfile には間違いなく不変フラグも設定されていません。

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

更新 2

Play Framework 2 (Scala のみ) 用の 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

ところで、ローカルで動作します。

最初から物事を明確にすることができたときに、 Typesafe の Configによってスローされたエラーを飲み込んでしまう可能性があるため、Heroku サポートに注意を促しました。

また、2 回目のプッシュが成功するのを許可せずに、古い Procfile を使用するように依頼しました。非常に誤解を招く。

言うまでもなく、私は現在 Salat プラグインの MongoURI サポートも実装しています。


更新 3

mongodb.default.uriPlayでのサポートを実装しました!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

application.confでこのような構成を試すこともできます...。

このheroku、本番モード、または他の何かかどうかはわかりませんが、「herokuconfig」で設定された環境変数についても奇妙なことに気づきました。

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 に答える
0

たぶん、プラグインによっていくつかの変数が有効になっているのでしょうか? heroku api はチェックしていませんが、手がかりになるかもしれません。

2 番目のポイントは、これらの変数にどのようにアクセスしたかです。私の推測では、タイプセーフな構成システムはコマンド ライン オプションにフォールバックしません。

最後のポイントは、https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/Configuration.scalaによると、application.conf をクラスパスのルート。conf/ から明示的に取得する代わりに、プロダクション モードで使用されます。

私の2c

于 2012-05-20T21:24:08.817 に答える