상단에서 Capistrano를 사용하여 Rails 2.3.2 앱을 배포하는 방법 (FastCGI의 경우)?

StackOverflow https://stackoverflow.com/questions/878296

문제

면책 조항 : 나는 더 많은 것을 배우려고 노력하는 Rails and Capistrano (중간 .NET C# 개발자)의 멍청이입니다.

Capistrano 개발 프로세스 설정을하는 데 가장 힘든 시간을 보냈습니다. 내 배포에 대해 지금까지 가지고있는 것은 다음과 같습니다.


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. Rails 2.3.2에는 스크립트/프로세스 디렉토리가 없으므로 다시 시작 작업이 전혀 작동하지 않습니다. 이것을 어떻게 고치나요?
  2. 애플리케이션이 배포 될 때 환경에서 Rails_env 변수를 "생산"으로 설정하는 방법이 있습니까 ( "set : rains_env, : production"은 그것을하지 않습니까)?
  3. 또한이 두 파일에서 다른 것을 놓치고 있습니까?
도움이 되었습니까?

해결책

다음은 내 Deploy.rb입니다. 오랫동안 업데이트되지 않았습니다. 내 환경을 설정하기 위해 두 개의 SED 명령을 실행합니다. 더 쉬운 방법이 있다고 확신하지만 이것이 내 현재의 방법입니다.

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에서 내보내기 한 번, 공유 경로에서 데이터베이스.yml을 자동으로 생성하라는 프롬프트로 한 번.

다른 팁

내 대답을 업데이트했습니다. #3 참조 ...

배포에 FastCGI를 사용하지는 않지만 떠오르는 몇 가지 사항이 있습니다.

  1. 프로세스 스크립트는 레일 코어에서 나와 플러그인, 당신은 Github에서 잡을 수 있습니다.
  2. 내 deploy.rb 파일을 살펴보면 다음과 유사한 Rails_env 환경 변수를 명령 줄을 통해 스크립트로 전달해야 할 것입니다.

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

  3. 편집 : 실제로 배포 대신 CapFile에 작업을하는 것은 약간 이상합니다. Capistrano Google Group 의이 스레드, 그것은 완전히 눈살을 찌푸리지 않습니다. 당신/당신의 팀에게, 나는 생각합니다.

이것이 당신을 올바른 방향으로 가리키기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top