0

фонPassenger Игнорирование RAILS_ENV

У меня есть файл ENV с различными переменными зависит от моего приложения Rails, в том числе RAILS_ENV, которая инициализируется на развитие в этом файле. У меня также есть файл database.yml, определяющий соединения БД для моей среды (ниже). Когда я запускаю консоль рельсов, все выглядит так, как должно. Проверка 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: база данных «прод» не существует

Очевидно, что сообщение об ошибке, является точной, но не отражает то, что я хотел бы ожидать, происходит

..

Я предполагаю, что это проблема с пассажиром/Apache, так как запуск рельсов консоли все радует.

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

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

  1. .bashrc: Passenger is supposed to source the bashrc for the user apache is running as, который, в свою очередь, является установка на источник соответствующий файл 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 

ответ

0

Лучший способ сделать это, просто используя DATABASE_URL ENV вар.

Если у вас есть и конфигурация/database.yml и ENV['DATABASE_URL'] набора затем Rails сольется конфигурацией вместе.
Rails Guides: Configuring a Database

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 Luke! Пока вы находитесь на полпути, лучше придерживаться конвенции по сравнению с настройкой, а не вводить отдельные вары.

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

+0

Huh. Это сделал трюк. Не знал о нотации, которую вы использовали с общим блоком. – Dan