Ruby on rails 如何从顶部部署Rails 2.3.2应用程序和Capistrano(用于FastCGI)?

Ruby on rails 如何从顶部部署Rails 2.3.2应用程序和Capistrano(用于FastCGI)?,ruby-on-rails,deployment,capistrano,fastcgi,Ruby On Rails,Deployment,Capistrano,Fastcgi,免责声明:我是Rails和Capistrano(不过是一名中级.NETC#开发人员)试图了解更多信息的新手 我经历了最艰难的一段时间来建立Capistrano开发流程。以下是我迄今为止为deploy.rb所做的工作: set :application, "MyAppName" set :domain, "domainname" set :user, "userid" set :repository, "svn+ssh://#{user}@#{domain}/home/#{user}/svn

免责声明:我是Rails和Capistrano(不过是一名中级.NETC#开发人员)试图了解更多信息的新手

我经历了最艰难的一段时间来建立Capistrano开发流程。以下是我迄今为止为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
这是我的档案:


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没有脚本/进程目录,因此重新启动任务根本不起作用。我该如何解决这个问题
  • 在部署应用程序时,是否有办法将environment.rb中的RAILS_ENV变量设置为“production”(“set:RAILS_ENV,:production”不起作用)
  • 还有,这两个文件还有什么遗漏吗
  • 更新了我的答案,请参见#3

    我不使用FastCGI进行部署,但我想到了几件事:

  • 流程脚本已经从Rails核心转移到了,您可以从GitHub获取
  • 查看我的deploy.rb文件,您可能需要通过命令行将RAILS_ENV环境变量传递到脚本中,类似于:

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

  • 编辑:事实上,将任务放在Capfile中而不是deploy.rb中有点奇怪-尽管从外观上看,这并不是完全不赞成的。我想这取决于你/你的团队
  • 希望这为您指明了正确的方向。

    更新了我的答案,请参见#3

    我不使用FastCGI进行部署,但我想到了几件事:

  • 流程脚本已经从Rails核心转移到了,您可以从GitHub获取
  • 查看我的deploy.rb文件,您可能需要通过命令行将RAILS_ENV环境变量传递到脚本中,类似于:

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

  • 编辑:事实上,将任务放在Capfile中而不是deploy.rb中有点奇怪-尽管从外观上看,这并不是完全不赞成的。我想这取决于你/你的团队

  • 希望这为您指明了正确的方向。

    这是我的deploy.rb,它已经很久没有更新了。我运行两个sed命令来设置:after_update_代码任务中的环境。我肯定有一种更简单的方法,但这是我目前的方法

    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
    

    那会两次问我密码。一次用于从SVN导出,一次作为提示在共享路径中自动生成my database.yml。

    这是my deploy.rb,它已经很久没有更新了。我运行两个sed命令来设置:after_update_代码任务中的环境。我肯定有一种更简单的方法,但这是我目前的方法

    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
    

    那会两次问我密码。一次用于从SVN导出,一次作为提示在共享路径中自动生成my database.yml。

    @Rufo:thx获取提示!我现在正在使用FastCGI,因为使用mongrel实例需要额外支付内存。我现在只是想熟悉一下rails应用程序。如果我做得更多,我将开始使用mongrel 1)我实际上已经尝试使用irs_process_scripts插件,但无法使其工作2)我应该将其传递给哪个脚本?3) 那么Capfile本质上只是为了加载deploy.rb吗?我现在就去查看链接。@Rufo:thx获取提示!我现在正在使用FastCGI,因为使用mongrel实例需要额外支付内存。我现在只是想熟悉一下rails应用程序。如果我做得更多,我将开始使用mongrel 1)我实际上已经尝试使用irs_process_scripts插件,但无法使其工作2)我应该将其传递给哪个脚本?3) 那么Capfile本质上只是为了加载deploy.rb吗?我现在将查看链接。您的示例代码帮助我了解了如何使用Capistrano。我很难找到关于如何正确设置标准deploy.rb&Capfile的官方文档,其中包含各种场景下的变量和任务。很高兴它有所帮助。当我写这篇文章时,文档的缺乏更加明显,它是由我在网上找到的零碎信息拼凑而成的。我也在做同样的事情。我将很快发布我的最终版本作为问题的更新。您的示例代码帮助我了解了如何使用Capistrano。我很难找到关于如何正确设置标准deploy.rb&Capfile的官方文档,其中包含各种场景下的变量和任务。很高兴它有所帮助。当我写这篇文章时,文档的缺乏更加明显,它是由我在网上找到的零碎信息拼凑而成的。我也在做同样的事情。我将很快发布我的最终版本作为问题的更新。