Пассажир игнорирует RAILS_ENV

Фон

У меня есть файл env с различными переменными, зависящими от моего приложения Rails, включая RAILS_ENV, который инициализируется для разработки в этом файле. У меня также есть database.yml файл, определяющий подключения к БД для моих сред (см. Ниже). Когда я запускаю консоль rails, все выглядит так, как должно. Проверка Rails.configuration.database_configuration[Rails.env] возвращает следующее:

{"adapter"=>"postgresql",
"encoding"=>"utf8",
"database"=>"dev",
"username"=>"rails",
"password"=>"***",
"host"=>"localhost",
"pool"=>5,
"timeout"=>5000}

Однако, когда я пытаюсь посетить приложение, я получаю 502 и регистрирую следующую ошибку:

Исключение ActiveRecord :: NoDatabaseError в объекте приложения Rack (FATAL: база данных "prod" не существует.

Очевидно, что сообщение об ошибке является точным, но не отражает того, что я ожидал увидеть.

Я предполагаю, что это проблема Passenger / Apache, так как с консолью rails все в порядке.

ПРИМЕЧАНИЕ. Я видел это в других сообщениях, поэтому нет - нет переменной среды DATABASE_URL, плавающей вокруг переопределения вещей из database.yml.

Что я пробовал

  1. .bashrc: Пассажир должен использовать bashrc для пользователя, запущенного как apache, который, в свою очередь, настроен на получение соответствующего файла env.
  2. /etc/sysconfig/httpd: Я пробовал вручную получить файл непосредственно из конфигурации Apache и проверял, выгружая env в файл при запуске скрипта, что правильные значения вносятся в env, однако это тоже не меняет нарушенного поведения.

database.yml

development:
  adapter: postgresql
  encoding: utf8
  database: dev
  username: rails
  password: <%= ENV['RAILS_DB_PWD'] %>
  host: <%= ENV['RAILS_DB_HOST'] %>
  pool: 5
  timeout: 5000

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: postgresql
  encoding: utf8
  database: test
  username: rails
  password: <%= ENV['RAILS_DB_PWD'] %>
  host: <%= ENV['RAILS_DB_HOST'] %>
  pool: 5
  timeout: 5000

production:
  adapter: postgresql
  encoding: utf8
  database: prod
  username: rails
  password: <%= ENV['RAILS_DB_PWD'] %>
  host: <%= ENV['RAILS_DB_HOST'] %>
  port: 5432
  pool: 5
  timeout: 5000

person Dan    schedule 03.01.2017    source источник


Ответы (1)


Лучший способ сделать это - просто использовать DATABASE_URL env var.

Если у вас установлены и config / database.yml, и ENV['DATABASE_URL'], тогда Rails объединит конфигурацию вместе.
Руководства по Rails: настройка базы данных

common: &common
  adapter: postgresql
  encoding: utf8
  template: template0 # Required for UTF8 encoding
  pool: 5
  timeout: 5000

development:
  <<: *common
  database: dev

test:
  <<: *common
  database: test

production:
  <<: *common
  database: prod

Я бы обычно рекомендовал вам избегать указания имен пользователей и паролей БД в database.yml. Используйте ENV vars, Люк! Пока вы на полпути, лучше придерживаться подхода к конфигурации, а не вводить отдельные вары.

Лакмусовой бумажкой для проверки того, правильно ли выделена конфигурация приложения из кода, является то, можно ли в любой момент сделать базу кода с открытым исходным кодом без нарушения каких-либо учетных данных. https://12factor.net/config

person max    schedule 03.01.2017
comment
Хм. Это помогло. Не знал об обозначениях, которые вы использовали с общим блоком. - person Dan; 04.01.2017