In the end I went away from this approach altogether in favor of loading my app config from an app_config.yml file. Ryan Bates covers this approach in Railscast #226.
The only thing I did differently is that I load a shared app_config.yml for each server I use. Since I'm using capistrano, I just symlink the file on deploy.
For example, on staging2 my shared/configs/app_config.yml
looks like this:
staging:
host: "staging2.example.com"
... whereas on staging3 it looks like this:
staging:
host: "staging3.example.com"
Now my application.rb
has this line instead:
config.action_mailer.default_url_options = { host: APP_CONFIG[:host] }
I removed the actual config/app_config.yml
from git so that it's not included on deploy. (I moved it to config/app_config.yml.template
.) Then on deploy I use a capistrano task to symlink shared/configs/app_config.yml
to 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
This strategy has these benefits over using ENV vars:
- Deployed to all nodes via capistrano
- We can do conditional hosts by simply changing the file on the appropriate server
- Unicorn will get changes with USR2 since everything's done inside of rails
- Everything's kept in one place, and the environment isn't affected by some other variables outside of the codebase
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…