Ресурс .bashrc при перезапуске единорога? - PullRequest
1 голос
/ 08 ноября 2011

У меня есть несколько переменных ENV, которые получены для пользователя deploy.(Аналогично тому, что Heroku рекомендует , но без использования Heroku.)

Мое приложение rails зависит от них для определенных функций, например, в application.rb:

config.action_mailer.default_url_options = { host: ENV['MY_HOST'] }

Это необходимо, потому что у нас есть несколько промежуточных хостов.Для каждого хоста MY_HOST определено его правильное имя хоста в .bashrc, например так:

export MY_HOST="staging3.example.com"

Это позволяет нам использовать только одну среду rails staging, но при этом правильное имя хоста каждого хоста используется для тестированияотправка электронной почты и т. д., поскольку это можно установить для каждого компьютера.

К сожалению, похоже, что когда я перезагружаю Unicorn, используя USR2, он не воспринимает изменения этих переменных.Выполнение жесткого останова и запуска корректно загрузит любые изменения.

Я использую preload_app = true, возможно, я предполагаю, что это как-то связано с этим.Есть идеи?

1 Ответ

2 голосов
/ 10 ноября 2011

В итоге я вообще отказался от этого подхода в пользу загрузки конфигурации моего приложения из файла app_config.yml.Райан Бейтс описывает этот подход в Railscast # 226 .

. Единственное, что я сделал по-другому, - это загрузил общий app_config.yml для каждого сервера, который я использую.Поскольку я использую capistrano, я просто символическую ссылку на файл при развертывании.

Например, на staging2 мой shared/configs/app_config.yml выглядит так:

staging:
  host: "staging2.example.com"

... тогда как на staging3 этовыглядит так:

staging:
  host: "staging3.example.com"

Теперь у моего application.rb есть эта строка:

config.action_mailer.default_url_options = { host: APP_CONFIG[:host] }

Я удалил фактический config/app_config.yml из git, чтобы он не включался в развертывание.(Я переместил его в config/app_config.yml.template.) Затем при развертывании я использую задачу capistrano для символической ссылки shared/configs/app_config.yml на config/app_config.yml:

namespace :deploy do
  desc "Symlinks the app_config.yml"
  task :symlink_app_config, :roles => [:web, :app, :db] do
    run "ln -nfs #{deploy_to}/shared/config/app_config.yml #{release_path}/config/app_config.yml"
  end
end

Эта стратегия имеет следующие преимущества по сравнению с использованием ENV vars:

  • Развертывание на всех узлах через capistrano
  • Мы можем сделать условные хосты, просто изменив файл на соответствующем сервере
  • Unicorn получит изменения с USR2, так как все делается внутри rails
  • Все хранится в одном месте, и на окружение не влияют некоторые другие переменные за пределами кодовой базы
...