2012-05-20 1 views
0

Я использую Play! 2.0 Издание Scala на Heroku. Heroku, похоже, не видит/не использует все мои переменные конфигурации в Procfile.Play 2.0 Экзамен Scala Heroku не видит каждую переменную в Procfile

Например, в моем application.conf у меня есть следующие переменные (среди прочих):

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

Они должны быть по умолчанию для местного развития. Тем не менее, я хочу, чтобы экземпляр 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 по-прежнему говорит, что оно подключается на локальном хосте: 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

Я пытался подражать Heroku локально, используя sbt stage и запустить приложение с foreman start. Я установить переменные окружения, которые бы быть установлены на Heroku, и запустить его так:

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, который проверяет мой аргумент, что Heroku, возможно, с помощью более старую версию моего Procfile по неизвестной причине.

На моем случае Heroku, то PROCFILE, безусловно, не имеет неизменного флаг установлен либо:

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

UPDATE 2

Я использую MongoDB Salat plugin for Play Framework 2 (Scala only).

Вот образец, который я взял:

Каждый толчок удалось, прежде чем я приступил к реализации поддержки MongoDB.

Затем я включил Salat plugin, подписался на учетную запись MongoLabs и начал забавляться. Плагин выше не поддерживает 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 

Это работает локально, кстати.

Я привёл все это к вниманию поддержки Heroku, так как это может быть так, что они проглатывают ошибки, вызванные Typesafe's Config, когда это может быть проще сделать с самого начала.

Я также попросил их не позволять этим вторым нажатиям преуспеть, но затем использовать старый файл Procfile. Очень вводящий в заблуждение.

Излишне говорить, что теперь я также поддерживаю поддержку MongoURI для плагина Salat.


UPDATE 3

I've implemented support для mongodb.default.uri в Play! Плагин Salat (и развернул его с помощью lib /), но Heroku все равно выдает ошибку всякий раз, когда я нажимаю что-либо, связанное с mongo в моем Procfile.

Я попросил Героку поддержать тот же вопрос, и, возможно, кто-то здесь может ответить: делает ли Heroku переменные, которые вы можете использовать в Procfile?

+0

У меня есть рабочий пример игры 2 + MongoDB здесь: https://github.com/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. для отсутствия 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 

И в конф/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 позже) – opyate

+0

Не знаю, где он задокументирован, но я столкнулся с подобной проблемой, и благодаря поддержке/помощи от Heroku они упоминали ограничение 255 символов. И модификация моего Procfile исправила мою проблему. – flurdy

+0

Этот ответ - новый документ, спасибо @flurdy – opyate

0

Возможно, некоторые переменные включены плагинами? Я не проверял геропи api, но это может быть ключом.

Второй момент заключается в том, как вы получили доступ к этим переменным, я полагаю, что система типичной конфигурации не отбрасывает параметры командной строки.

Последний пункт в соответствии с https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/Configuration.scala вы можете добавить application.conf в корень пути к классам, он будет использоваться в производственном режиме вместо того, чтобы явно извлекать его из conf /.

Мои 2с

+0

Может быть, некоторые переменные включены дополнениями Heroku (а не плагинами Play). Я спросил об этом Хереку (ожидая ответа), потому что это не ясно из документации. В Play принимается -D переключается поверх application.conf, поэтому Heroku должен запустить мое приложение. – opyate

+0

Извините, что я не был ясно, когда говорил о плагинах ... на самом деле я говорил о дополнениях героку. Таким образом, допускаются только те переменные, которые объявляются надстройками (просто гадание). Для переменных play 2.0 и env есть aswer здесь http://stackoverflow.com/questions/9723224/how-to-manage-application-conf-in-several-environments-with-play-2-0, в котором говорится, как делать с отступлением назад. Для параметров -D можно попробовать использовать только -Dconfig.file * only * (или config.resource, url), указывающий набор PROD? –

0

Вы также можете попробовать сделать конфигурацию, как это в application.conf ....

Я не уверен, если это Heroku, режим производства, или что-то другое, но я заметил, что-то странное в отношении переменных окружения, заданных с помощью 'heroku config'.

В application.conf, если один использует обозначения

google.client=$(GOOGCLIENTID) 

все кажется нормально работает на локальной рабочей станции. Я могу проверить с помощью 'heroku config', что переменная установлена, но она явно не распространяется на конфигурацию при работе на heroku.

Однако это обозначение работает нормально:

google.client=$(?GOOGCLIENTID) 

Надеется, что это помогает.

+0

Я попробовал '' '-Dconfig.resource''' из документации [Хероку Производственная Конфигурация] (https://github.com/playframework/Play20/wiki/ProductionConfiguration) и добавил ее в начало моего Procfile. Журнал все еще просто говорит '' '2012-05-21T12: 36: 59 + 00: 00 heroku [web.1]: запуск процесса с помощью команды' target/start -Dhostname = "https: ...' '' ie ie не забирает новый коммутатор. Я думаю, что старая версия моего Procfile кэшируется. Все еще ждет поддержки Heroku для ответа. – opyate

0

Есть ли забавные персонажи в $ MAILGUN_API_KEY? Попробуйте переместить -Dmailgun.apikey = $ MAILGUN_API_KEY до конца ...

+0

'' '-Dsecurehostname =" https://example.org "' '' опущен и это первый параметр.Впоследствии я также попробовал новый параметр (в начало Procfile), и он не имел никакого эффекта. – opyate

+0

Я также проверил свой Procfile с '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. – opyate