Capistrano tips
If you use (and you definitely should) Capistrano to handle your Rails application deployement, you should have faced some troubles to handle passwords for svn + database, at least if you’re like me and don’t want to put those production passwords in your subversion repository.
My first concern was to have a different user/password to checkout code from subversion, ssh to the server and connect to the database.
So here’s some tricks which allows you to avoid puting passwords in subversion and use different passwords for each part of the process (ssh, svn, db), put those in your config/deploy.rb.
Use whatever SVN User/Password you want :
[UPDATE] A little update to this part to avoid remote svn user/password to be cached locally.
Old :
set :svn_user, ENV['svn_user'] || "jonathan"
set :svn_password, Proc.new { Capistrano::CLI.password_prompt('SVN Password: ') }
set :repository,
Proc.new { "--username #{svn_user} " +
"--password #{svn_password} " +
"http://your.domain.tld/path/to/svn/#{application}/trunk/" }New :
set :svn_user, ENV['svn_user'] || "jonathan"
set :svn_password, Proc.new { Capistrano::CLI.password_prompt('SVN Password: ') }
set :repository,
Proc.new { "--username #{svn_user} " +
"--password #{svn_password} " +
"--no-auth-cache " +
"http://your.domain.tld/path/to/svn/#{application}/trunk/" }So you can now do things like :
svn_user=your_name cap deployand the svn checkout will use ‘your_name’ as svn username, prompt you for the subversion password (remember, you’re using ssh, so no clear password transit) and then do the checkout normaly.
Generate config/database.yml on-the-fly
Just like passwords, it’s a good idea to avoid having your database configuration in subversion if you’re more than one developer to commit code. So why not generate it locally and put it through our lovely ssh connection, at deployement time ?
desc "After updating code we need to populate a new database.yml"
task :after_update_code, :roles => :app do
require "yaml"
set :production_database_password, proc { Capistrano::CLI.password_prompt("Production database remote Password : ") }
buffer = YAML::load_file('config/database.yml.template')
# get ride of uneeded configurations
buffer.delete('test')
buffer.delete('development')
# Populate production element
buffer['production']['adapter'] = "postgresql"
buffer['production']['database'] = "vms_production"
buffer['production']['username'] = "you_db_username
buffer['production']['password'] = production_database_password
buffer['production']['host'] = "localhost"
put YAML::dump(buffer), "#{release_path}/config/database.yml", :mode => 0664
endThis code uses the config/database.yml.template file (it’s up to you to have one, I don’t think this one is hard :D), to generate a simple database.yml containing only the production database configuration. Additionnaly it prompts you for the database connection password.
Isn’t this great ?[…]