Comment déployer Rails 2.3.2 application avec Capistrano du haut (pour FastCGI)?
-
22-08-2019 - |
Question
Disclaimer:. Je suis un noob à Rails et Capistrano (mais un développeur # .NET C intermédiaire) essayant d'en savoir plus
Je suis ont le temps le plus difficile d'obtenir un processus de développement Capistrano mis en place. 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
- Rails 2.3.2 n'a pas le répertoire script / processus pour la tâche de redémarrage ne fonctionne pas du tout. Comment puis-je résoudre ce problème?
- Est-il possible de définir la variable RAILS_ENV dans environment.rb à la "production" lorsque l'application est déployée ( "set: RAILS_ENV,: la production" ne le fait pas) ?
- Aussi, suis-je manque quelque chose d'autre de ces 2 fichiers?
La solution
Voici mon 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 ya un moyen plus facile 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 de SVN, et une fois une invite pour générer automatiquement mon database.yml dans le chemin partagé.
Autres conseils
Mise à jour ma réponse, voir # 3 ...
Je n'utilise FastCGI pour le déploiement, mais quelques petites choses qui viennent à l'esprit:
- Les scripts de traitement ont été déplacés sur des rails de base et en un plugin , que vous pouvez saisir de GitHub.
-
En 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, similaire à:
run #{current_path}/script/process/reaper RAILS_ENV=#{rails_env} --dispatcher=dispatch.fcgi
- EDIT: En fait, il est un peu étrange d'avoir vos tâches dans le Capfile au lieu de deploy.rb - bien que regarder ce fil sur le groupe Google Capistrano , il est pas tout à fait mal vue. À vous / votre équipe, je suppose.
Espérons que cela vous fait dans la bonne direction.