先在这里放上来自《Agile Web Development with Rails 4th for Rails3.2》的一个 deploy.rb 模板:
# be sure to change these
set:user, 'rubys'
set:domain, 'depot.pragprog.com'
set:application, 'depot'
# adjust if youareusing RVM, remove if youarenot
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require "rvm/capistrano"
set:rvm_ruby_string, '1.9.2'
set:rvm_type, :user
# file paths
set:repository, "#{user}@#{domain}:git/#{application}.git"
set:deploy_to, "/home/#{user}/#{domain}"
# distribute your applications across servers (the instructions below putthem
# allon thesame server, defined above as 'domain', adjust as necessary)
role :app, domain
role :web, domain
role :db, domain, :primary => true
# youmight need to setthis if youaren't seeing password prompts
# default_run_options[:pty] = true
# As Capistrano executes in a non-interactive mode andtherefore doesn't cause
# anyof your shell profile scripts to be run, thefollowing might be needed
# if (for example) youhave locally installed gems or applications. Note:
# this needs to contain thefull values forthevariables set, notsimply
# thedeltas.
# default_environment['PATH']='<your paths>:/usr/local/bin:/usr/bin:/bin'
# default_environment['GEM_PATH']='<your paths>:/usr/lib/ruby/gems/1.8'
# miscellaneous options
set:deploy_via, :remote_cache
set:scm, 'git'
set:branch, 'master'
set:scm_verbose, true
set:use_sudo, false
set:rails_env, :production
namespace :deploy do
desc "cause Passenger to initiate a restart"
task :restart do
run"touch #{current_path}/tmp/restart.txt"
end
desc "reload thedatabase with seed data"
task :seed do
run"cd#{current_path}; rake db:seed RAILS_ENV=#{rails_env}"
end
end
after "deploy:update_code", :bundle_install
desc "install thenecessary prerequisites"
task :bundle_install, :roles => :app do
run"cd#{release_path} && bundle install"
end
这个模板非常方便,因为我拿在手里了,加上自己的配置就可以直接使用了。 现在这里我介绍一下怎么使用,需要修改一些什么。
首先在加入一个 gem,gem 'capistrano'
。然后创建相关文件,只需要执行一个命令就可以:
$ capify .
[add] writing './Capfile'
[add] writing './config/deploy.rb'
[done] capified!
这时候生成两个文件。如果在用使用 3.1 以上版本的 Rails,在 Capfile 加上一句:
load 'deploy/assets' //assets操作
然后剩下的就是 deploy.rb 上的了,我发一下我的配置,然后备注一下,到时候大家按照我那个配置设置一下就可以了,如下:
require "bundler/capistrano" #部署时运行bundle
set :user, 'deploy' #存放web的用户名
set :domain, '106.XX.XX.XX' #服务器IP
set :application, 'ruby-china.org' #项目文件名,既将会在user里面创建这个名字的文件夹
# adjust if you are using RVM, remove if you are not
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require "rvm/capistrano"
set :rvm_ruby_string, '1.9.3'
set :rvm_type, :user
# file paths
set :repository, "git@#{domain}:ruby-china.git" #git所存在的地址,我存放在自己的服务器中
set :deploy_to, "/home/deploy/ruby-china.org" #部署的地址
# distribute your applications across servers (the instructions below put them
# all on the same server, defined above as 'domain', adjust as necessary)
role :app, domain
role :web, domain
role :db, domain, :primary => true
ssh_options[:forward_agent] = true #forward_agent方式
# miscellaneous options
set :deploy_via, :remote_cache
set :scm, 'git'
set :branch, 'master'
set :scm_verbose, true
set :use_sudo, false
set :rails_env, "production"
namespace :deploy do
desc "cause Passenger to initiate a restart"
task :restart do
run "touch #{current_path}/tmp/restart.txt"
end
desc "reload the database with seed data"
task :seed do
run "cd #{current_path}; rake db:seed RAILS_ENV=#{rails_env}"
end
end
注意:这里涉及一个叫“forward_agent 方式”,简单的来说就是服务器在 clone git 的时候是不成功的,因为他的 ssh 公钥并不在 git 的账户中,而我们电脑的公钥已经存放在 git 服务器里了,所以可以直接 push 或者 pull 操作 git,所以这类需要使用 ssh agent forward,也就是在部署时,VPS 使用你的 SSH 密钥。参考: Using ssh agent forwarding
git 的地址当然也可以在 github 上,但是我觉得竟然有 VPS 了,放在自己的 VPS 上更加方便。我以前有个教人在自己 VPS 上部署 GIT 的方法:Linode VPS 小组级 Git 服务器搭建
如果你使用的个别东西不一样就需要参考 capistrano 的 wiki 进行修改了,例如你用的不是 git,服务器不是 Passenger 等等。
写好 deploy.rb 后的事情就不多了,首先把修改过的内容 push 到 git 上面。然后开始部署了,第一次部署需要运行:
$ cap deploy:setup
$ cap deploy:check
$ cap deploy:migrations
上条命令下来,如果没有问题就已经成功的设置成功了,然后进行发布:
$ cap deploy
非常方便的就把网站部署到 VPS 上了,如果以后有修改了东西也非常容易发布:
$ git add .
$ git commit -m "add capfiles"
$ git push
$ cap deploy
非常的简单方便,只需要几条命令,服务器上的信息就更新了。这个文章介绍的比较简单,没有去讲一些任务的写法,就简单的项目来说精简够用了。需要更深入的了解可以通过以上方式: Capistrano 2.x Getting Started capistrano wiki