2012-05-20 2 views
0

Play! Heroku의 2.0 스칼라 에디션. Heroku는 Procfile에서 모든 구성 변수를 보거나 사용하지 않는 것 같습니다.Play 2.0 Scala Heroku 인스턴스가 Procfile의 모든 변수를 보지 못합니다.

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

이 지역 개발을위한 기본 설정해야한다 :

는 예를 들어, 내 application.conf에 내가 (다른 사람의 사이에) 다음 변수를 가지고있다. 그러나, 나는 Heroku 인스턴스가 MongoLabs 인스턴스를 사용하기를 원합니다. (불행하게도, Salat은 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

나는 sbt stage을 사용하고 foreman start와 응용 프로그램을 실행, 로컬 Heroku가를 모방하려고 노력했다. 나는 는 Heroku가 설정할 수 것이다 환경 변수를 설정하고 다음과 같이 실행 : 그것은 Heroku가 아마도 사용하고 내 주장의 유효성을 검사하는 Procfile,에서와 같이

app git:(master) ☆ DATABASE_URL="jdbc:h2:mem:mydatabase;MODE=PostgreSQL" \ 
    REDISTOGO_URL="redis://ignored:[email protected]: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의 이전 버전. 내가 MongoDB Salat plugin for Play Framework 2 (Scala only)을 사용하고

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

업데이트 2

: 내 Heroku가 인스턴스에

는 Procfile는 불변의 플래그 중 하나를 설정하지 않습니다 확실히이다.

여기에 내가 집어 패턴입니다 :

은 모든 내가 MongoDB의 지원을 구현 시작하기 전에 성공 밀어 넣습니다.

그런 다음 MongoLabs 계정에 가입하여 Salat plugin을 통합했습니다. 재미가 시작되었습니다. 위의 플러그인은 com.mongodb.MongoURI을 지원하지 않으며 구성을 분석하는 방식으로 인해 -Dmongodb.uri을 제공하면 파열됩니다. "default"와 같은 키 스페이스가 필요합니다.

위의 그림에서 보았 듯이 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.

처음부터 명확하게 할 수있을 때 Typesafe's Config에 의해 던진 오류를 삼킬 수 있기 때문에 나는이 모든 것을 Heroku 지원에 집중했습니다.

나는 또한 두 번째 푸시 성공을 허용하지 말고 이전 Procfile을 사용하도록 요청했습니다. 매우 오도 된.

말할 필요도없이, 이제 Salat 플러그인에 대한 MongoURI 지원도 구현 중입니다.


UPDATE 재생에 mongodb.default.uri 3

I've implemented support! Salat 플러그인 (그리고 lib /를 사용하여 배포했습니다.) 그러나 Heroku는 Procfile에서 mongo 관련 항목을 누를 때마다 여전히 오류가 발생합니다.

나는 Heroku에서 같은 질문을하고 있는데, 아마도 여기있는 누군가가 대답 할 수 있습니다 : Heroku가 Procfile에서 사용할 수있는 변수를 제한합니까?

+0

I가 재생의 작동 예 2 + MongoDB를 여기에 : https://github.com 아닌 environment variable 따라 구성 예에 대한/jamesward/play2bars/tree/scala-mongodb 아마도 이것이 작동하지 않는 이유를 알아내는 데 도움이 될 것입니다. –

+0

제임스 감사합니다. 그렇지 않으면 목요일 밤 LFPUG에서보실 수 있습니다 :) – opyate

+0

@JamesWard는'''-Dmongodb.uri = $ MONGOHQ_URL'' 비트 : JVM 스위치의 이름 지정에 어떤 의미가 있습니까? 나는. Heroku는 변수 이름의 사전 설정된 목록 만 허용합니까? 내가 사용한 것들은''mongodb.default. *'''라고 불렸다. 내 Procfile의 이전 버전이 캐싱되거나 사용되고 있다고 생각하기 시작했습니다. – opyate

답변

4

Procfile의 시작 명령은 길이가 최대 255 자일 수 있습니다.입니다. 모든 mongodb 설정이 그 이상이라고 기대합니다.

alternative configuration file을 참조하시기 바랍니다.

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" 
+0

이것은 매우 잘할 수 있습니다 - 문서화 된 곳은 어디입니까? (나는 나중에 또 다른 Git bisect를 할 것이다.) – opyate

+0

문서화 된 곳을 모르지만 비슷한 문제를 겪었고 Heroku의 지원/지원을 통해 255 자 제한을 언급했다. 그리고 내 Procfile 수정 내 문제가 해결되었습니다. – flurdy

+0

이 답변은 새로운 문서입니다. 감사합니다. @flurdy – opyate

0

일부 변수가 플러그인에 의해 사용 설정되었을 수 있습니까? heroku api를 확인하지 않았지만 단서가 될 수 있습니다.

두 번째 요점은 이러한 변수에 액세스하는 방법입니다. 제 생각에 typesafe 구성 시스템이 명령 줄 옵션으로 대체되지 않습니다.

마지막 점은 https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/Configuration.scala에 따라 classpath의 루트에 application.conf를 추가 할 수 있으며 conf /에서 명시 적으로 검색하는 대신 프로덕션 모드에서 사용됩니다.

내 2C

+0

특정 변수가 Heroku 애드온 (Play 플러그인이 아님)에 의해 활성화 될 수 있습니다. 나는 문서에서 명확하지 않기 때문에 (대답을 기다리는) 이것에 대해 Heroku 지원을 요청했습니다. Play는 hello가 내 응용 프로그램을 초기화하는 방법 인 application.conf 맨 위에 -D 스위치를 허용합니다. – opyate

+0

죄송합니다. 플러그인에 대해 이야기하는 동안 명확하지 않았습니다 ... 사실 저는 heroku 부가 기능에 대해 이야기하고있었습니다. 따라서 추가 기능에 의해 선언 된 변수 만 허용됩니다 (추측). play 2.0 및 env 변수의 경우 여기에 aswer가 있습니다. http://stackoverflow.com/questions/9723224/how-to-manage-application-conf-in-several-environment-with-play-2-0 뒤로 물러나. -D 옵션의 경우, 시도 할 수있는 것은 PROD 세트를 가리키는 -Dconfig.file * only * (또는 config.resource, url)을 사용하는 것입니다. –

0
또한 application.conf에서이 같은 구성을하고 시도 할 수 있습니다

....

잘 모르겠어요이 Heroku가가, 생산 모드, 또는 뭔가 다른하지만 ​​내가 발견 한 경우 'heroku config'로 설정된 환경 변수에 대해 이상한 점도 있습니다. application.conf에서

, 하나

google.client=$(GOOGCLIENTID) 

모든 로컬 워크 스테이션에서 실행 확인 보인다 표기법을 사용하는 경우. 변수가 설정되었다는 것을 'heroku config'로 확인할 수는 있지만 heroku를 실행할 때 구성에 명확하게 전파되지 않습니다.

그러나,이 표기법은 작품을 좋아 :

google.client=$(?GOOGCLIENTID) 

는 도움이되기를 바랍니다.

+0

[Heroku Production Configuration] (https://github.com/playframework/Play20/wiki/ProductionConfiguration) 문서에서''-Dconfig.resource'''를 시도해보고, 그것을 나의 Procfile의 시작 부분에 추가했습니다. 로그에는 여전히'''2012-05-21T12 : 36 : 59 + 00 : 00 heroku [web.1] : 명령'target/start -Dhostname = "https : ... 새 스위치를 선택하지 않습니다. 내 Procfile의 이전 버전이 캐시 된 것 같아요. Heroku 지원이 회신하기를 계속 기다리고 있습니다. – opyate

0

$ MAILGUN_API_KEY에 재미있는 문자가 있습니까? 다음을 이동하십시오. -Dmailgun.apikey = $ MAILGUN_API_KEY ...

+0

''-Dsecurehostname = "https://example.org"'''가 생략되고 그것은 첫 번째 매개 변수입니다.나는 또한 나중에 (Procfile의 시작으로) 새로운 매개 변수를 시도했으나 효과가 없었다. – opyate

+0

나는 또한'''foreman check'''로 나의 Procfile의 유효성을 검사했고,'''procfile detected (web)'''를 기록합니다. – opyate