2009-05-18 6 views
0

Avis de non-responsabilité: je suis un expert de Rails et Capistrano (mais un développeur .NET C# intermédiaire) essayant d'en savoir plus.Comment déployer l'application Rails 2.3.2 avec Capistrano par le haut (pour FastCGI)?

J'ai eu le plus de mal à obtenir une installation de processus de développement Capistrano. voici ce que j'ai jusqu'à présent pour mon deploy.rb:


set :application, "MyAppName" 
set :domain, "domainname" 
set :user, "userid" 
set :repository, "svn+ssh://#{user}@#{domain}/home/#{user}/svn/#{application}/trunk" 
set :rails_env, :production 
set :chmod755, %w(app config db lib public vendor script tmp public/dispatch.cgi public/dispatch.fcgi public/dispatch.rb) 
set :deploy_to, "/home/#{user}/apps/#{application}" 
set :use_sudo, false 
set :deploy_via, :checkout 
set :group_writable, false 
default_run_options[:pty] = true 
role :app, domain 
role :web, domain 
role :db, domain, :primary => true 

voici mon Capfile:


load 'deploy' if respond_to?(:namespace) # cap2 differentiator 
Dir['vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) } 
load 'config/deploy' 

namespace :deploy do 

    task :restart, :roles => :app do 
    run "#{current_path}/script/process/reaper --dispatcher=dispatch.fcgi" 
    end 

    desc "Set the proper permissions for directories and files on HostingRails accounts" 
    task :after_deploy do 
    run(chmod755.collect do |item| 
     "chmod 755 #{current_path}/#{item}" 
    end.join(" && ")) 
    end 

end 
  1. Rails 2.3.2 n'a pas le répertoire script/processus pour la tâche de redémarrage doesn ne travaille pas du tout. Comment puis-je réparer ça?
  2. Existe-t-il un moyen de définir la variable RAILS_ENV dans environment.rb sur "production" lorsque l'application est déployée ("set: rails_env,: production" ne le fait pas)?
  3. Aussi, est-ce que je manque quelque chose d'autre de ces 2 fichiers?

Répondre

1

Voici mon fichier deploy.rb, qui n'a pas vraiment été mis à jour depuis longtemps. Je lance deux commandes sed pour définir l'environnement dans ma tâche: after_update_code. Je suis certain qu'il existe un moyen plus simple de le faire, mais c'est ma méthode actuelle.

require 'erb' 

before "deploy:setup", :db 
after "deploy:update_code", "db:symlink" 
after "deploy", "deploy:cleanup" 

def prompt_with_default(var, default) 
    set(var) do 
    Capistrano::CLI.ui.ask "Enter #{var} [#{default}] : " 
    end 

    set var, default if eval("#{var.to_s}.empty?") 
end 

default_run_options[:pty] = true 

set :rake, "/usr/local/bin/rake" 

set :user, "your username" 
set :application, "application name" 
set :repository, "svn repository path" 
set :host, "domain name" 
set :db_host, "DB host name" 
set :db_user, "DB user name" 
set :db_prefix, "any DB name prefix your host might require" 
set :rails_env, "production" 

set :deploy_to, "/home/username/rails/#{host}" # your deployment directory 

role :app, host 
role :web, host 
role :db, host, :primary => true 

set :use_sudo, false 
set :checkout, "export" 

# 
# TASKS 
# 
desc "Tasks to execute after code update" 
task :after_update_code, :roles => [:app, :db, :web] do 
    # Make sure we're running in production 
    run "sed -i -e '/ENV.*RAILS_ENV/s/# //' #{release_path}/config/environment.rb" 
    run "sed -i -e '/ENV.*RAILS_ENV/s/production/#{rails_env}/' #{release_path}/config/environment.rb" 

    # Add banned IPs 
    deny_lines = [] 
    File.readlines("#{release_path}/config/banned_ips").each {|ip| 
    deny_lines << "deny from #{ip}" 
    } 

    ip_ban_block = <<EOBAN 
# Bannination 
order allow,deny 
#{deny_lines.join} 
allow from all 
EOBAN 

    run "sed -i -e 's/# BANNED IPS/#{ip_ban_block}/' #{release_path}/public/.htaccess" 

    run "chmod +x #{release_path}/script/runner" 
    run "chmod +x #{release_path}/script/process/reaper" 
    run "chmod +x #{release_path}/script/process/spawner" 
    run "chmod 755 #{release_path}/public/dispatch.*" 
end 

desc "Restarting after deployment" 
task :after_deploy, :roles => [:app, :db, :web] do 
    run "cd #{current_path} && rake RAILS_ENV=production db:sessions:clear tmp:clear" 
    # fix permissions 
    run "dos2unix #{release_path}/public/dispatch.*" 
    run "dos2unix #{release_path}/public/.htaccess" 
    run "chmod -R 755 #{release_path}" 
    run "chmod -R 775 #{release_path}/log #{release_path}/tmp #{release_path}/script" 
    run "find #{release_path}/ | xargs touch" 
    run "touch #{deploy_to}/current/public/dispatch.fcgi" 
end 

desc "Restarting after rollback" 
task :after_rollback, :roles => [:app, :db, :web] do 
    run "touch #{deploy_to}/current/public/dispatch.fcgi" 
end 

namespace :db do 
    desc "Create database yaml in shared path" 
    task :default do 
    prompt_with_default(:db_password, "") 
    db_config = ERB.new <<-EOF 
base: &base 
    adapter: mysql 
    port: 3306 
    host: #{db_host} 
    username: #{db_user} 
    password: #{db_password} 

development: 
    database: #{db_prefix}#{application}development 
    <<: *base 

test: 
    database: #{db_prefix}#{application}test 
    <<: *base 

production: 
    database: #{db_prefix}#{application}production 
    <<: *base 
EOF 

    run "mkdir -p #{shared_path}/config" 
    put db_config.result, "#{shared_path}/config/database.yml" 
    end 

    desc "Make symlink for database yaml" 
    task :symlink do 
    run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml" 
    end 
end 

Une fois que je mis en place mes variables, j'ai un script bash qui fonctionne:

svn export $svn_path . --force 
cap deploy 

Ça va me demander mon mot de passe deux fois. Une fois pour l'exportation à partir de SVN, et une fois comme une invite pour générer automatiquement mon database.yml dans le chemin partagé.

+0

votre exemple de code m'a aidé à comprendre comment utiliser Capistrano.J'ai beaucoup de mal à trouver de la documentation officielle sur la manière de configurer correctement un fichier deploy.rb & Capfile standard avec des variables et des tâches pour différents scénarios. – gabe

+0

Heureux que cela a aidé. Quand je l'ai écrit, le manque de documentation était encore plus prononcé, et il est bricolé à partir de morceaux que j'ai trouvés sur le web. –

+0

Je fais à peu près la même chose. Je posterai ma version finale sous forme de mise à jour de ma question bientôt. – gabe

2

Mise à jour ma réponse, voir # 3 ...

Je ne pas utiliser FastCGI pour le déploiement, mais quelques petites choses qui viennent à l'esprit:

  1. Les scripts de processus ont été déplacés hors de Rails core et en a plugin, que vous pouvez récupérer auprès de GitHub.
  2. regardant mon fichier deploy.rb, vous aurez probablement besoin de passer la variable d'environnement RAILS_ENV dans le script par la ligne de commande, semblable à:

    run #{current_path}/script/process/reaper RAILS_ENV=#{rails_env} --dispatcher=dispatch.fcgi

  3. EDIT: En fait, il est un peu bizarre d'avoir vos tâches dans le Capfile au lieu de deploy.rb - bien qu'en regardant this thread on the Capistrano Google Group, ce n'est pas complètement désapprouvé. Jusqu'à vous/votre équipe, je suppose.

Espérons que cela vous dirige dans la bonne direction.

+0

@Rufo: merci pour les conseils! J'utilise FastCGI en ce moment parce que je dois payer un supplément de mémoire pour utiliser une instance de mongrel. J'essaie juste de me familiariser avec l'application w/building a rails dès maintenant. Si je fais plus, je vais commencer à utiliser mongrel 1) J'ai déjà essayé d'utiliser le plugin irs_process_scripts mais je ne pouvais pas le faire fonctionner 2) quel script dois-je passer à? 3) hmmm. Le Capfile est-il essentiellement juste pour charger le fichier deploy.rb? Je vais vérifier le lien maintenant. – gabe

Questions connexes