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)
Надеюсь, поможет.