2009-05-18 61 views
0

免責聲明:我是Rails和Capistrano(但是一箇中級.NET C#開發人員)嘗試瞭解更多信息的noob。如何從頂部(用於FastCGI)部署Capistrano Rails 2.3.2應用程序?

我已經有最難的時候獲得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 

這裏是我的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. 線路2.3.2沒有腳本/程序的目錄,以便重新啓動任務沒有按根本不工作。我該如何解決?
  2. 當部署應用程序(「set:rails_env,:production」不這樣做)時,有沒有辦法將environment.rb中的RAILS_ENV變量設置爲「production」?
  3. 另外,我是否缺少這些2個文件中的其他內容?

回答

1

這是我的deploy.rb,它並沒有真正在很長時間內進行過更新。我運行兩個sed命令來設置my:after_update_code任務中的環境。我確信有一個更簡單的方法來做到這一點,但這是我目前的方法。

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 

一旦設置我的變量,我有一個運行bash腳本:

svn export $svn_path . --force 
cap deploy 

這會問我要我的密碼兩次。一次用於從SVN導出,一次作爲提示在共享路徑中自動生成我的database.yml。

+0

您的示例代碼幫助我瞭解如何使用Capistrano。我很難找到關於如何正確設置標準deploy.rb和Capfile的官方文檔,其中包含各種場景的變量和任務。 – gabe 2009-05-21 13:47:40

+0

很高興幫助。當我寫這篇文章的時候,缺少文檔更加明顯,而且我在網絡上發現的點點滴滴拼湊在一起。 – 2009-05-21 14:06:55

+0

我幾乎在做同樣的事情。我會很快發佈我的最終版本作爲我的問題的更新。 – gabe 2009-05-21 15:22:44

2

更新我的回答,請參閱#3 ...

我不使用FastCGI的部署,但一些事情浮現在腦海:

  1. 過程腳本已被移動從Rails核心轉移到a plugin,你可以從GitHub獲取。我deploy.rb文件
  2. 看,你可能需要通過命令行的RAILS_ENV環境變量傳遞到腳本,類似於:

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

  3. 編輯:其實,稍微是奇怪的是你的任務在Capfile而不是deploy.rb中 - 雖然看着this thread on the Capistrano Google Group,但它並沒有被完全皺起眉頭。我想你應該考慮你/你的團隊。

希望這點能指出你的方向是正確的。

+0

@Rufo:thx的提示!我現在正在使用FastCGI,因爲我必須額外支付內存才能使用雜種實例。我只是想嘗試熟悉現在構建一個rails應用程序。如果我做的更多,我會開始使用雜種 1)我實際上已經嘗試使用irs_process_scripts插件,但無法使它工作 2)我應該將哪個腳本傳遞給它? 3)嗯。 Capfile本質上只是用於加載deploy.rb?我會立即查看鏈接。 – gabe 2009-05-18 16:32:43

相關問題