使用Capistrano部署rails
gem
gem 'capistrano'
# Capistrano RVM integration
gem 'rvm-capistrano'
本地服务器
rails服务器
svn服务器
通过本地脚本部署应用到rails服务器
1)本地安装capistrano
gem install capistrano
2)检查安装是否有效
cap -V #列出版本
3)开始工作
进入本地 rails工程根目录执行
capify .
这个命令会生成两个文件,一个是Capfile文件(启动脚本),在应用的根目录下,另一个是deploy.rb文件(配置文件),在应用的config目录下
可以用cap -T 查看所有task, cap -e deploy 解释deploy任务的详情 。
4)修改config/deploy.rb文件
配置参数:
application:应用名。
repository:版本管理系统的链接URL。
web:web服务器名列表。
app:应用服务器列表。
db:数据库服务器列表。
user:ssh用户名。
deploy_to:应用部署路径。
如果你的svn链接需要用户名和密码,可以通过svn_username和svn_password配置。
除了setup和deploy,缺省支持的命令主要有:
disable_web:生成maintenance.html,你的系统需要能够自检测这个文件。
enable_web:删除maintenance.html。
update_code:和版本管理器做代码同步。
rollback_code:如果部署完发现有问题,可以用这个命令换回上一个。
restart:重启,其实就是调用了reaper。
migrate:在服务器端运行rake RAILS_ENV=#{rails_env} migrate。
deploy:其实就是update_code+symlink+restart。
deploy_with_migrations:update_code+migrate+symlink+restart。
rollback: rollback_code + restart。
===================================================
示例:
set :application, "myapp" #项目名称
set :repository, "[email protected]:myapp.git" ##仓库地址
set :scm, "git" ##git clone
set :scm_verbose, true
set :branch, "master"
set :deploy_to, "/var/www/#{application}" ## 发布机器的路径
set :user, "sunyw" ##以**用户发布
set :use_sudo, false ## 不使用sudo
set :domain, '192.168.1.115'
##如果你的svn链接需要用户名和密码,可以通过svn_username和svn_password配置
role :app, domain ##app 应用服务器的IP
role :web, domain ##web web服务机器IP
role :db, domain, :primary => true ##DB数据库机器IP
# if you want to clean up old releases on each deploy uncomment this:
# after "deploy:restart", "deploy:cleanup"
# if you're still using the script/reaper helper you will need
# these http://github.com/rails/irs_process_scripts
# If you are using Passenger mod_rails uncomment this:
namespace :deploy do
task :start do
end
task :stop do
end
#task :restart, :roles => :app, :except => { :no_release => true } do
# run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
#end
end
namespace :bundler do
desc "Install for production"
task :install, :roles => :app do
run "cd #{deploy_to} && bundle install"
end
end
after 'deploy:update_code', 'bundler:install'
===============================================
# RVM bootstrap $:.unshift(File.expand_path("~/.rvm/lib")) require 'rvm/capistrano' set :rvm_ruby_string, 'ruby-1.9.2-p290@rails313'#这个值是你要用rvm的gemset。名字要和系统里有的要一样。 set :rvm_type, :user # Don't use system-wide RVM #这个不能少,否则部署不了。 #下面的部署信息,应该都很清楚吧。 #some parameter setting set :host,server_name#set your server name set :port_number, server_port#set your server port set :rails_env, rails_env # main details set :application, application_name role :app, "#{host}" role :web, "#{host}" role :db, "#{host}", :primary => true # server details # default_run_options[:pty] = true set :use_sudo, false set :user, user_name if user_pw.nil? ssh_options[:keys] = %w(./lib/dsa_ssh_key) else set :password, user_pw end set :deploy_to, "#{deploy}/#{application}"#set your application path # repo details use svn to manage code set :repository, svn_repo set :scm, :subversion set :deploy_via, :export set :scm_username, 'username' set :scm_password, 'password' set :runner, nil # runtime dependencies depend :remote, :command, "monit" depend :local, :command, "svn" depend :remote, :gem, "bundler" # tasks namespace :deploy do task :start, :roles => :app do run "touch #{current_path}/tmp/restart.txt" end task :stop, :roles => :app do # Do nothing. end desc "Restart Application" task :restart, :roles => :app do run "touch #{current_path}/tmp/restart.txt" end end namespace :bundler do desc "Install for production" task :install, :roles => :app do run "cd #{release_path} && bundle install" end end after 'deploy:update_code', 'bundler:install'
开始部署
cap deploy:setup
初始化一些目录,在production服务器上。
cap deploy
可能出现的问题,根据提示安装就可以了。
数据迁移
cap deploy:migrate