capistrano-recipes 0.5.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/Gemfile +4 -0
- data/LICENSE +1 -1
- data/README.rdoc +73 -6
- data/Rakefile +2 -27
- data/capistrano-recipes.gemspec +21 -44
- data/doc/god/god +1 -0
- data/doc/god/god.conf +102 -0
- data/doc/god/god.init +62 -0
- data/generators/app.god.erb +25 -0
- data/generators/nginx.conf.erb +207 -0
- data/generators/unicorn.rb.erb +62 -0
- data/lib/capistrano_recipes.rb +1 -1
- data/lib/helpers.rb +62 -2
- data/lib/recipes/application.rb +67 -0
- data/lib/recipes/bluepill.rb +53 -0
- data/lib/recipes/bundler.rb +14 -0
- data/lib/recipes/db.rb +65 -5
- data/lib/recipes/deploy.rb +86 -16
- data/lib/recipes/god.rb +125 -0
- data/lib/recipes/hooks.rb +14 -0
- data/lib/recipes/log.rb +4 -4
- data/lib/recipes/nginx.rb +52 -0
- data/lib/recipes/passenger.rb +6 -6
- data/lib/recipes/resque.rb +48 -0
- data/lib/recipes/sphinx.rb +38 -0
- data/lib/recipes/symlinks.rb +27 -0
- data/lib/recipes/unicorn.rb +82 -0
- data/lib/version.rb +3 -0
- metadata +71 -17
- data/VERSION.yml +0 -4
- data/lib/recipes/symlink.rb +0 -51
@@ -0,0 +1,62 @@
|
|
1
|
+
rails_root = '<%= "#{deploy_to}/current" %>'
|
2
|
+
rails_env = '<%= environment %>'
|
3
|
+
pid_file = '<%= unicorn_pid %>'
|
4
|
+
socket_file= '<%= unicorn_socket %>'
|
5
|
+
log_file = "#{rails_root}/log/unicorn.log"
|
6
|
+
username = '<%= unicorn_user %>'
|
7
|
+
group = '<%= unicorn_group %>'
|
8
|
+
old_pid = pid_file + '.oldbin'
|
9
|
+
|
10
|
+
|
11
|
+
timeout <%= unicorn_workers_timeout %>
|
12
|
+
|
13
|
+
worker_processes <%= unicorn_workers %>
|
14
|
+
|
15
|
+
# Listen on a Unix data socket
|
16
|
+
listen socket_file, :backlog => 1024
|
17
|
+
pid pid_file
|
18
|
+
|
19
|
+
stderr_path log_file
|
20
|
+
stdout_path log_file
|
21
|
+
|
22
|
+
preload_app true
|
23
|
+
##
|
24
|
+
# REE
|
25
|
+
|
26
|
+
GC.copy_on_write_friendly = true if GC.respond_to?(:copy_on_write_friendly=)
|
27
|
+
|
28
|
+
before_fork do |server, worker|
|
29
|
+
# the following is highly recomended for Rails + "preload_app true"
|
30
|
+
# as there's no need for the master process to hold a connection
|
31
|
+
defined?(ActiveRecord::Base) and
|
32
|
+
ActiveRecord::Base.connection.disconnect!
|
33
|
+
|
34
|
+
|
35
|
+
##
|
36
|
+
# When sent a USR2, Unicorn will suffix its pidfile with .oldbin and
|
37
|
+
# immediately start loading up a new version of itself (loaded with a new
|
38
|
+
# version of our app). When this new Unicorn is completely loaded
|
39
|
+
# it will begin spawning workers. The first worker spawned will check to
|
40
|
+
# see if an .oldbin pidfile exists. If so, this means we've just booted up
|
41
|
+
# a new Unicorn and need to tell the old one that it can now die. To do so
|
42
|
+
# we send it a QUIT.
|
43
|
+
#
|
44
|
+
# Using this method we get 0 downtime deploys.
|
45
|
+
|
46
|
+
if File.exists?(old_pid) && server.pid != old_pid
|
47
|
+
begin
|
48
|
+
Process.kill("QUIT", File.read(old_pid).to_i)
|
49
|
+
rescue Errno::ENOENT, Errno::ESRCH
|
50
|
+
# someone else did our job for us
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
after_fork do |server, worker|
|
57
|
+
defined?(ActiveRecord::Base) and
|
58
|
+
ActiveRecord::Base.establish_connection
|
59
|
+
|
60
|
+
|
61
|
+
worker.user(username, group) if Process.euid == 0 && rails_env == 'production'
|
62
|
+
end
|
data/lib/capistrano_recipes.rb
CHANGED
data/lib/helpers.rb
CHANGED
@@ -16,8 +16,68 @@ def environment
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
def is_using_nginx
|
20
|
+
is_using('nginx',:web_server)
|
21
|
+
end
|
22
|
+
|
23
|
+
def is_using_passenger
|
24
|
+
is_using('passenger',:app_server)
|
25
|
+
end
|
26
|
+
|
27
|
+
def is_using_unicorn
|
28
|
+
is_using('unicorn',:app_server)
|
29
|
+
end
|
30
|
+
|
31
|
+
def is_app_monitored?
|
32
|
+
is_using('bluepill', :monitorer) || is_using('god', :monitorer)
|
33
|
+
end
|
34
|
+
|
35
|
+
def is_using(something, with_some_var)
|
36
|
+
exists?(with_some_var.to_sym) && fetch(with_some_var.to_sym).to_s.downcase == something
|
37
|
+
end
|
38
|
+
|
39
|
+
# Path to where the generators live
|
40
|
+
def templates_path
|
41
|
+
expanded_path_for('../generators')
|
42
|
+
end
|
43
|
+
|
44
|
+
def docs_path
|
45
|
+
expanded_path_for('../doc')
|
46
|
+
end
|
47
|
+
|
48
|
+
def expanded_path_for(path)
|
49
|
+
e = File.join(File.dirname(__FILE__),path)
|
50
|
+
File.expand_path(e)
|
51
|
+
end
|
52
|
+
|
53
|
+
def parse_config(file)
|
54
|
+
require 'erb' #render not available in Capistrano 2
|
55
|
+
template=File.read(file) # read it
|
56
|
+
return ERB.new(template).result(binding) # parse it
|
57
|
+
end
|
58
|
+
|
59
|
+
# =========================================================================
|
60
|
+
# Prompts the user for a message to agree/decline
|
61
|
+
# =========================================================================
|
62
|
+
def ask(message, default=true)
|
63
|
+
Capistrano::CLI.ui.agree(message)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Generates a configuration file parsing through ERB
|
67
|
+
# Fetches local file and uploads it to remote_file
|
68
|
+
# Make sure your user has the right permissions.
|
69
|
+
def generate_config(local_file,remote_file)
|
70
|
+
temp_file = '/tmp/' + File.basename(local_file)
|
71
|
+
buffer = parse_config(local_file)
|
72
|
+
File.open(temp_file, 'w+') { |f| f << buffer }
|
73
|
+
upload temp_file, remote_file, :via => :scp
|
74
|
+
`rm #{temp_file}`
|
75
|
+
end
|
76
|
+
|
77
|
+
# =========================================================================
|
78
|
+
# Executes a basic rake task.
|
79
|
+
# Example: run_rake log:clear
|
80
|
+
# =========================================================================
|
21
81
|
def run_rake(task)
|
22
82
|
run "cd #{current_path} && rake #{task} RAILS_ENV=#{environment}"
|
23
83
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
# User settings
|
3
|
+
set :user, 'deploy' unless exists?(:user)
|
4
|
+
set :group,'www-data' unless exists?(:group)
|
5
|
+
|
6
|
+
# Server settings
|
7
|
+
set :app_server, :unicorn unless exists?(:app_server)
|
8
|
+
set :web_server, :nginx unless exists?(:web_server)
|
9
|
+
set :runner, user unless exists?(:runner)
|
10
|
+
set :application_port, 80 unless exists?(:application_port)
|
11
|
+
|
12
|
+
set :application_uses_ssl, true unless exists?(:application_uses_ssl)
|
13
|
+
set :application_port_ssl, 443 unless exists?(:application_port_ssl)
|
14
|
+
|
15
|
+
# Database settings
|
16
|
+
set :database, :mysql unless exists?(:database)
|
17
|
+
|
18
|
+
# SCM settings
|
19
|
+
set :scm, :git
|
20
|
+
set :branch, 'master' unless exists?(:branch)
|
21
|
+
set :deploy_to, "/var/www/apps/#{application}" unless exists?(:deploy_to)
|
22
|
+
set :deploy_via, :remote_cache
|
23
|
+
set :keep_releases, 3
|
24
|
+
set :git_enable_submodules, true
|
25
|
+
set :rails_env, 'production' unless exists?(:rails_env)
|
26
|
+
set :use_sudo, false
|
27
|
+
|
28
|
+
# Git settings for capistrano
|
29
|
+
default_run_options[:pty] = true
|
30
|
+
ssh_options[:forward_agent] = true
|
31
|
+
|
32
|
+
# RVM settings
|
33
|
+
set :using_rvm, true unless exists?(:using_rvm)
|
34
|
+
|
35
|
+
if using_rvm
|
36
|
+
$:.unshift(File.expand_path('./lib', ENV['rvm_path'])) # Add RVM's lib directory to the load path.
|
37
|
+
require "rvm/capistrano" # Load RVM's capistrano plugin.
|
38
|
+
|
39
|
+
# Sets the rvm to a specific version (or whatever env you want it to run in)
|
40
|
+
set :rvm_ruby_string, 'ree' unless exists?(:rvm_ruby_string)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Daemons settings
|
44
|
+
# The unix socket that unicorn will be attached to.
|
45
|
+
# Also, nginx will upstream to this guy.
|
46
|
+
# The *nix place for socks is /var/run, so we should probably put it there
|
47
|
+
# Make sure the runner can access this though.
|
48
|
+
set :sockets_path, "/var/run/#{application}" unless exists?(:sockets_path)
|
49
|
+
|
50
|
+
# Just to be safe, put the pid somewhere that survives deploys. shared/pids is
|
51
|
+
# a good choice as any.
|
52
|
+
set(:pids_path) { File.join(shared_path, "pids") } unless exists?(:pids_path)
|
53
|
+
|
54
|
+
set :monitorer, 'bluepill' unless exists?(:monitorer)
|
55
|
+
|
56
|
+
# Application settings
|
57
|
+
set :shared_dirs, %w(config uploads backup bundle tmp) unless exists?(:shared_dirs)
|
58
|
+
|
59
|
+
namespace :app do
|
60
|
+
task :setup, :roles => :app do
|
61
|
+
commands = shared_dirs.map do |path|
|
62
|
+
"if [ ! -d '#{path}' ]; then mkdir -p #{path}; fi;"
|
63
|
+
end
|
64
|
+
run "cd #{shared_path}; #{commands.join(' ')}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
namespace :bluepill do
|
3
|
+
desc "|DarkRecipes| Install the bluepill monitoring tool"
|
4
|
+
task :install, :roles => [:app] do
|
5
|
+
sudo "gem install bluepill"
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "|DarkRecipes| Stop processes that bluepill is monitoring and quit bluepill"
|
9
|
+
task :quit, :roles => [:app] do
|
10
|
+
args = options || ""
|
11
|
+
begin
|
12
|
+
sudo "bluepill stop #{args}"
|
13
|
+
rescue
|
14
|
+
puts "Bluepill was unable to finish gracefully all the process"
|
15
|
+
ensure
|
16
|
+
sudo "bluepill quit"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "|DarkRecipes| Load the pill from {your-app}/config/pills/{app-name}.pill"
|
21
|
+
task :init, :roles =>[:app] do
|
22
|
+
sudo "bluepill load #{current_path}/config/pills/#{application}.pill"
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "|DarkRecipes| Starts your previous stopped pill"
|
26
|
+
task :start, :roles =>[:app] do
|
27
|
+
args = options || ""
|
28
|
+
sudo "bluepill start #{args}"
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "|DarkRecipes| Stops some bluepill monitored process"
|
32
|
+
task :stop, :roles =>[:app] do
|
33
|
+
args = options || ""
|
34
|
+
sudo "bluepill stop #{args}"
|
35
|
+
end
|
36
|
+
|
37
|
+
desc "|DarkRecipes| Restarts the pill from {your-app}/config/pills/{app-name}.pill"
|
38
|
+
task :restart, :roles =>[:app] do
|
39
|
+
args = options || ""
|
40
|
+
sudo "bluepill restart #{args}"
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "|DarkRecipes| Prints bluepills monitored processes statuses"
|
44
|
+
task :status, :roles => [:app] do
|
45
|
+
args = options || ""
|
46
|
+
sudo "bluepill status #{args}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
after 'deploy:setup' do
|
51
|
+
bluepill.install if Capistrano::CLI.ui.agree("Do you want to install the bluepill monitor? [Yn]")
|
52
|
+
end if is_using('bluepill', :monitorer)
|
53
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
namespace :bundler do
|
3
|
+
desc "|DarkRecipes| Installs bundler gem to your server"
|
4
|
+
task :setup, :roles => :app do
|
5
|
+
run "if ! gem list | grep --silent -e 'bundler'; then #{try_sudo} gem uninstall bundler; #{try_sudo} gem install --no-rdoc --no-ri bundler; fi"
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "|DarkRecipes| Runs bundle install on the app server (internal task)"
|
9
|
+
task :install, :roles => :app, :except => { :no_release => true } do
|
10
|
+
run "cd #{current_path} && bundle install --deployment --without=development test"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
data/lib/recipes/db.rb
CHANGED
@@ -1,9 +1,37 @@
|
|
1
1
|
require 'erb'
|
2
2
|
|
3
|
-
Capistrano::Configuration.instance
|
3
|
+
Capistrano::Configuration.instance.load do
|
4
4
|
namespace :db do
|
5
5
|
namespace :mysql do
|
6
|
-
desc
|
6
|
+
desc <<-EOF
|
7
|
+
|DarkRecipes| Performs a compressed database dump. \
|
8
|
+
WARNING: This locks your tables for the duration of the mysqldump.
|
9
|
+
Don't run it madly!
|
10
|
+
EOF
|
11
|
+
task :dump, :roles => :db, :only => { :primary => true } do
|
12
|
+
prepare_from_yaml
|
13
|
+
run "mysqldump --user=#{db_user} -p --host=#{db_host} #{db_name} | bzip2 -z9 > #{db_remote_file}" do |ch, stream, out|
|
14
|
+
ch.send_data "#{db_pass}\n" if out =~ /^Enter password:/
|
15
|
+
puts out
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "|DarkRecipes| Restores the database from the latest compressed dump"
|
20
|
+
task :restore, :roles => :db, :only => { :primary => true } do
|
21
|
+
prepare_from_yaml
|
22
|
+
run "bzcat #{db_remote_file} | mysql --user=#{db_user} -p --host=#{db_host} #{db_name}" do |ch, stream, out|
|
23
|
+
ch.send_data "#{db_pass}\n" if out =~ /^Enter password:/
|
24
|
+
puts out
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "|DarkRecipes| Downloads the compressed database dump to this machine"
|
29
|
+
task :fetch_dump, :roles => :db, :only => { :primary => true } do
|
30
|
+
prepare_from_yaml
|
31
|
+
download db_remote_file, db_local_file, :via => :scp
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "|DarkRecipes| Create MySQL database and user for this environment using prompted values"
|
7
35
|
task :setup, :roles => :db, :only => { :primary => true } do
|
8
36
|
prepare_for_db_command
|
9
37
|
|
@@ -18,10 +46,31 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
18
46
|
channel.send_data "#{pass}\n"
|
19
47
|
end
|
20
48
|
end
|
21
|
-
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Sets database variables from remote database.yaml
|
52
|
+
def prepare_from_yaml
|
53
|
+
set(:db_file) { "#{application}-dump.sql.bz2" }
|
54
|
+
set(:db_remote_file) { "#{shared_path}/backup/#{db_file}" }
|
55
|
+
set(:db_local_file) { "tmp/#{db_file}" }
|
56
|
+
set(:db_user) { db_config[rails_env]["username"] }
|
57
|
+
set(:db_pass) { db_config[rails_env]["password"] }
|
58
|
+
set(:db_host) { db_config[rails_env]["host"] }
|
59
|
+
set(:db_name) { db_config[rails_env]["database"] }
|
60
|
+
end
|
61
|
+
|
62
|
+
def db_config
|
63
|
+
@db_config ||= fetch_db_config
|
64
|
+
end
|
65
|
+
|
66
|
+
def fetch_db_config
|
67
|
+
require 'yaml'
|
68
|
+
file = capture "cat #{shared_path}/config/database.yml"
|
69
|
+
db_config = YAML.load(file)
|
70
|
+
end
|
22
71
|
end
|
23
72
|
|
24
|
-
desc "Create database.yml in shared path with settings for current stage and test env"
|
73
|
+
desc "|DarkRecipes| Create database.yml in shared path with settings for current stage and test env"
|
25
74
|
task :create_yaml do
|
26
75
|
set(:db_user) { Capistrano::CLI.ui.ask "Enter #{environment} database username:" }
|
27
76
|
set(:db_pass) { Capistrano::CLI.password_prompt "Enter #{environment} database password:" }
|
@@ -29,6 +78,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
29
78
|
db_config = ERB.new <<-EOF
|
30
79
|
base: &base
|
31
80
|
adapter: mysql
|
81
|
+
encoding: utf8
|
32
82
|
username: #{db_user}
|
33
83
|
password: #{db_pass}
|
34
84
|
|
@@ -51,4 +101,14 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
51
101
|
set(:db_user) { Capistrano::CLI.ui.ask "Enter #{environment} database username:" }
|
52
102
|
set(:db_pass) { Capistrano::CLI.password_prompt "Enter #{environment} database password:" }
|
53
103
|
end
|
54
|
-
|
104
|
+
|
105
|
+
desc "Populates the database with seed data"
|
106
|
+
task :seed do
|
107
|
+
Capistrano::CLI.ui.say "Populating the database..."
|
108
|
+
run "cd #{current_path}; rake RAILS_ENV=#{variables[:rails_env]} db:seed"
|
109
|
+
end
|
110
|
+
|
111
|
+
after "deploy:setup" do
|
112
|
+
db.create_yaml if Capistrano::CLI.ui.agree("Create database.yml in app's shared path? [Yn]")
|
113
|
+
end
|
114
|
+
end
|
data/lib/recipes/deploy.rb
CHANGED
@@ -1,36 +1,106 @@
|
|
1
|
-
Capistrano::Configuration.instance
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
2
|
set :shared_children, %w(system log pids config)
|
3
3
|
|
4
|
-
after "deploy:setup" do
|
5
|
-
db.create_yaml if Capistrano::CLI.ui.agree("Create database.yml in app's shared path?")
|
6
|
-
end
|
7
|
-
|
8
|
-
after "deploy:update_code", "symlink:shared_config_files"
|
9
|
-
|
10
4
|
namespace :deploy do
|
5
|
+
desc "|DarkRecipes| Deploy it, github-style."
|
6
|
+
task :default, :roles => :app, :except => { :no_release => true } do
|
7
|
+
update
|
8
|
+
restart
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "|DarkRecipes| Destroys everything"
|
12
|
+
task :seppuku, :roles => :app, :except => { :no_release => true } do
|
13
|
+
run "rm -rf #{current_path}; rm -rf #{shared_path}"
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "|DarkRecipes| Create shared dirs"
|
17
|
+
task :setup_dirs, :roles => :app, :except => { :no_release => true } do
|
18
|
+
commands = shared_dirs.map do |path|
|
19
|
+
"mkdir -p #{shared_path}/#{path}"
|
20
|
+
end
|
21
|
+
run commands.join(" && ")
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "|DarkRecipes| Uploads your local config.yml to the server"
|
25
|
+
task :configure, :roles => :app, :except => { :no_release => true } do
|
26
|
+
generate_config('config/config.yml', "#{shared_path}/config/config.yml")
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "|DarkRecipes| Setup a GitHub-style deployment."
|
30
|
+
task :setup, :roles => :app, :except => { :no_release => true } do
|
31
|
+
run "rm -rf #{current_path}"
|
32
|
+
setup_dirs
|
33
|
+
run "git clone #{repository} #{current_path}"
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "|DarkRecipes| Update the deployed code."
|
37
|
+
task :update_code, :roles => :app, :except => { :no_release => true } do
|
38
|
+
run "cd #{current_path}; git fetch origin; git reset --hard #{branch}"
|
39
|
+
end
|
40
|
+
|
41
|
+
desc "|DarkRecipes| Alias for symlinks:make"
|
42
|
+
task :symlink, :roles => :app, :except => { :no_release => true } do
|
43
|
+
symlinks.make
|
44
|
+
end
|
45
|
+
|
46
|
+
desc "|DarkRecipes| Remote run for rake db:migrate"
|
47
|
+
task :migrate, :roles => :app, :except => { :no_release => true } do
|
48
|
+
run "cd #{current_path}; bundle exec rake RAILS_ENV=#{rails_env} db:migrate"
|
49
|
+
end
|
50
|
+
|
51
|
+
desc "|DarkRecipes| [Obsolete] Nothing to cleanup when using reset --hard on git"
|
52
|
+
task :cleanup, :roles => :app, :except => { :no_release => true } do
|
53
|
+
#nothing to cleanup, we're not working with 'releases'
|
54
|
+
puts "Nothing to cleanup, yay!"
|
55
|
+
end
|
56
|
+
|
57
|
+
namespace :rollback do
|
58
|
+
desc "|DarkRecipes| Rollback , :except => { :no_release => true }a single commit."
|
59
|
+
task :default, :roles => :app, :except => { :no_release => true } do
|
60
|
+
set :branch, "HEAD^"
|
61
|
+
deploy.default
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
11
65
|
desc <<-DESC
|
12
|
-
Restarts your application.
|
13
|
-
explicitly set the server type:
|
66
|
+
|DarkRecipes| Restarts your application. This depends heavily on what server you're running.
|
67
|
+
If you are running Phusion Passenger, you can explicitly set the server type:
|
14
68
|
|
15
69
|
set :server, :passenger
|
16
|
-
|
70
|
+
|
17
71
|
...which will touch tmp/restart.txt, a file monitored by Passenger.
|
72
|
+
|
73
|
+
If you are running Unicorn, you can set:
|
74
|
+
|
75
|
+
set :server, :unicorn
|
76
|
+
|
77
|
+
...which will use unicorn signals for restarting its workers.
|
78
|
+
|
18
79
|
Otherwise, this command will call the script/process/reaper \
|
19
80
|
script under the current path.
|
81
|
+
|
82
|
+
If you are running with Unicorn, you can set the server type as well:
|
83
|
+
|
84
|
+
set :server, :unicorn
|
20
85
|
|
21
|
-
By default, this will be
|
86
|
+
By default, this will be |DarkRecipes| d via sudo as the `app' user. If \
|
22
87
|
you wish to run it as a different user, set the :runner variable to \
|
23
88
|
that user. If you are in an environment where you can't use sudo, set \
|
24
89
|
the :use_sudo variable to false:
|
25
90
|
|
26
|
-
|
91
|
+
set :use_sudo, false
|
27
92
|
DESC
|
28
93
|
task :restart, :roles => :app, :except => { :no_release => true } do
|
29
|
-
if exists?(:
|
30
|
-
|
94
|
+
if exists?(:app_server)
|
95
|
+
case fetch(:app_server).to_s.downcase
|
96
|
+
when 'passenger'
|
97
|
+
passenger.bounce
|
98
|
+
when 'unicorn'
|
99
|
+
is_using('god', :monitorer) ? god.restart.app : unicorn.restart
|
100
|
+
end
|
31
101
|
else
|
32
|
-
|
102
|
+
puts "Dunno how to restart your internets! kthx!"
|
33
103
|
end
|
34
104
|
end
|
35
105
|
end
|
36
|
-
end
|
106
|
+
end
|