Play 2.0 Экземпляр Scala Heroku не видит все переменные в Procfile

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

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

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

Это должны быть значения по умолчанию для местного развития. Однако я хочу, чтобы мой экземпляр Heroku использовал экземпляр MongoLabs. (К сожалению, Salat не настраивается с URI, поэтому мне пришлось разбить его на host, port, 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...

Форман получает мои значения PRODUCTION MongoDB в том виде, в каком они есть в Procfile, что подтверждает мой аргумент, что Heroku, возможно, использует более старую версию моего Procfile по неизвестной причине.

В моем экземпляре Heroku Procfile определенно не имеет установленного флага неизменности:

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

ОБНОВЛЕНИЕ 2

Я использую плагин MongoDB Salat для Play Framework 2 (только для Scala).

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

Каждый шаг был успешным, прежде чем я начал реализовывать поддержку 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, так как они могут проглотить ошибки, которые выдает Config Typesafe, когда он может просто прояснить ситуацию с самого начала.

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

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


ОБНОВЛЕНИЕ 3

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

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

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"

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

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

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

Мой 2с

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

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

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

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

google.client=$(GOOGCLIENTID)

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

Тем не менее, эта запись работает нормально:

google.client=$(?GOOGCLIENTID)

Надеюсь, поможет.

Другие вопросы по тегам