dark-capistrano-recipes 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README.rdoc +89 -0
- data/Rakefile +30 -0
- data/VERSION.yml +5 -0
- data/dark-capistrano-recipes.gemspec +69 -0
- 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 +150 -0
- data/generators/unicorn.rb.erb +62 -0
- data/lib/capistrano_recipes.rb +5 -0
- data/lib/helpers.rb +70 -0
- data/lib/recipes/application.rb +68 -0
- data/lib/recipes/bundler.rb +19 -0
- data/lib/recipes/db.rb +105 -0
- data/lib/recipes/deploy.rb +105 -0
- data/lib/recipes/god.rb +114 -0
- data/lib/recipes/hooks.rb +15 -0
- data/lib/recipes/log.rb +28 -0
- data/lib/recipes/nginx.rb +54 -0
- data/lib/recipes/passenger.rb +18 -0
- data/lib/recipes/rvm.rb +11 -0
- data/lib/recipes/symlinks.rb +33 -0
- data/lib/recipes/unicorn.rb +83 -0
- metadata +125 -0
@@ -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/helpers.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# =========================================================================
|
2
|
+
# These are helper methods that will be available to your recipes.
|
3
|
+
# =========================================================================
|
4
|
+
|
5
|
+
# automatically sets the environment based on presence of
|
6
|
+
# :stage (multistage gem), :rails_env, or RAILS_ENV variable; otherwise defaults to 'production'
|
7
|
+
def environment
|
8
|
+
if exists?(:stage)
|
9
|
+
stage
|
10
|
+
elsif exists?(:rails_env)
|
11
|
+
rails_env
|
12
|
+
elsif(ENV['RAILS_ENV'])
|
13
|
+
ENV['RAILS_ENV']
|
14
|
+
else
|
15
|
+
"production"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def is_using_nginx
|
20
|
+
is_using('nginx',:web_server)
|
21
|
+
end
|
22
|
+
|
23
|
+
def is_using_unicorn
|
24
|
+
is_using('unicorn',:server)
|
25
|
+
end
|
26
|
+
|
27
|
+
def is_using_god
|
28
|
+
is_using('god',:monitorer)
|
29
|
+
end
|
30
|
+
|
31
|
+
def is_using(something, with_some_var)
|
32
|
+
exists?(with_some_var.to_sym) && fetch(with_some_var.to_sym).to_s.downcase == something
|
33
|
+
end
|
34
|
+
|
35
|
+
# Path to where the generators live
|
36
|
+
def templates_path
|
37
|
+
expanded_path_for('../generators')
|
38
|
+
end
|
39
|
+
|
40
|
+
def docs_path
|
41
|
+
expanded_path_for('../doc')
|
42
|
+
end
|
43
|
+
|
44
|
+
def expanded_path_for(path)
|
45
|
+
e = File.join(File.dirname(__FILE__),path)
|
46
|
+
File.expand_path(e)
|
47
|
+
end
|
48
|
+
|
49
|
+
def parse_config(file)
|
50
|
+
require 'erb' #render not available in Capistrano 2
|
51
|
+
template=File.read(file) # read it
|
52
|
+
return ERB.new(template).result(binding) # parse it
|
53
|
+
end
|
54
|
+
|
55
|
+
# Generates a configuration file parsing through ERB
|
56
|
+
# Fetches local file and uploads it to remote_file
|
57
|
+
# Make sure your user has the right permissions.
|
58
|
+
def generate_config(local_file,remote_file)
|
59
|
+
temp_file = '/tmp/' + File.basename(local_file)
|
60
|
+
buffer = parse_config(local_file)
|
61
|
+
File.open(temp_file, 'w+') { |f| f << buffer }
|
62
|
+
upload temp_file, remote_file, :via => :scp
|
63
|
+
`rm #{temp_file}`
|
64
|
+
end
|
65
|
+
|
66
|
+
# Execute a rake task, example:
|
67
|
+
# run_rake log:clear
|
68
|
+
def run_rake(task)
|
69
|
+
run "cd #{current_path} && rake #{task} RAILS_ENV=#{environment}"
|
70
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
# User settings
|
4
|
+
set :user, 'deploy' unless exists?(:user)
|
5
|
+
set :group,'www-data' unless exists?(:group)
|
6
|
+
|
7
|
+
|
8
|
+
# Server settings
|
9
|
+
set :server, :unicorn unless exists?(:server)
|
10
|
+
set :web_server, :nginx unless exists?(:web_server)
|
11
|
+
set :runner, user unless exists?(:runner)
|
12
|
+
|
13
|
+
# The port to listen to, normally we default to 80
|
14
|
+
set :application_port, 80 unless exists?(:application_port)
|
15
|
+
|
16
|
+
# Are we using ssl as well? Used by generators to configure a ssl host
|
17
|
+
set :application_uses_ssl, true unless exists?(:application_uses_ssl)
|
18
|
+
|
19
|
+
# The port to listen to https requests, usually 443
|
20
|
+
set :application_port_ssl, 443 unless exists?(:application_port_ssl)
|
21
|
+
|
22
|
+
# Database settings
|
23
|
+
set :database, :mysql unless exists?(:database)
|
24
|
+
|
25
|
+
# SCM settings
|
26
|
+
set :scm, :git
|
27
|
+
set :branch, 'master' unless exists?(:branch)
|
28
|
+
set :deploy_to, "/var/www/apps/#{application}" unless exists?(:deploy_to)
|
29
|
+
set :deploy_via, :remote_cache
|
30
|
+
set :keep_releases, 3
|
31
|
+
set :git_enable_submodules, true
|
32
|
+
set :rails_env, 'production' unless exists?(:rails_env)
|
33
|
+
set :use_sudo, false
|
34
|
+
|
35
|
+
# Git settings for capistrano
|
36
|
+
default_run_options[:pty] = true
|
37
|
+
ssh_options[:forward_agent] = true
|
38
|
+
|
39
|
+
# RVM settings
|
40
|
+
set :using_rvm, true unless exists?(:using_rvm)
|
41
|
+
# Sets the rvm to a specific version (or whatever env you want it to run in)
|
42
|
+
set :rvm_ruby_string, 'ree' unless exists?(:rvm_ruby_string)
|
43
|
+
|
44
|
+
# Daemons settings
|
45
|
+
# The unix socket that unicorn will be attached to.
|
46
|
+
# Also, nginx will upstream to this guy.
|
47
|
+
# The *nix place for socks is /var/run, so we should probably put it there
|
48
|
+
# Make sure the runner can access this though.
|
49
|
+
set :sockets_path, "/var/run/#{application}" unless exists?(:sockets_path)
|
50
|
+
|
51
|
+
# Just to be safe, put the pid somewhere that survives deploys. shared/pids is
|
52
|
+
# a good choice as any.
|
53
|
+
set(:pids_path) { File.join(shared_path, "pids") } unless exists?(:pids_path)
|
54
|
+
|
55
|
+
set :monitorer, 'god' unless exists?(:monitorer)
|
56
|
+
|
57
|
+
# Application settings
|
58
|
+
set :shared_dirs, %w( config uploads backup bundle tmp ) unless exists?(:shared_dirs)
|
59
|
+
|
60
|
+
namespace :app do
|
61
|
+
task :setup, :roles => :app do
|
62
|
+
commands = shared_dirs.map do |path|
|
63
|
+
"if [ ! -d '#{path}' ]; then mkdir -p #{path}; fi;"
|
64
|
+
end
|
65
|
+
run "cd #{shared_path}; #{commands.join(' ')}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Bundler
|
2
|
+
# Manages gems in a sane way.
|
3
|
+
# http://gembundler.com/
|
4
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
5
|
+
namespace :bundler do
|
6
|
+
set :bundler_ver, '1.0.0'
|
7
|
+
desc "Installs bundler gem to your server"
|
8
|
+
task :setup, :roles => :app do
|
9
|
+
run "if ! gem list | grep --silent -e 'bundler.*#{bundler_ver}'; then #{try_sudo} gem uninstall bundler; #{try_sudo} gem install --no-rdoc --no-ri bundler; fi"
|
10
|
+
end
|
11
|
+
|
12
|
+
# [internal] runs bundle install on the app server
|
13
|
+
task :install, :roles => :app, :except => { :no_release => true } do
|
14
|
+
run "cd #{current_path} && bundle install --deployment --without=development test"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
data/lib/recipes/db.rb
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
4
|
+
namespace :db do
|
5
|
+
namespace :mysql do
|
6
|
+
|
7
|
+
# Sets database variables from remote database.yaml
|
8
|
+
def prepare_from_yaml
|
9
|
+
set(:db_file) { "#{application}-dump.sql.bz2" }
|
10
|
+
set(:db_remote_file) { "#{shared_path}/backup/#{db_file}" }
|
11
|
+
set(:db_local_file) { "tmp/#{db_file}" }
|
12
|
+
set(:db_user) { db_config[rails_env]["username"] }
|
13
|
+
set(:db_pass) { db_config[rails_env]["password"] }
|
14
|
+
set(:db_host) { db_config[rails_env]["host"] }
|
15
|
+
set(:db_name) { db_config[rails_env]["database"] }
|
16
|
+
end
|
17
|
+
|
18
|
+
def db_config
|
19
|
+
@db_config ||= fetch_db_config
|
20
|
+
end
|
21
|
+
|
22
|
+
def fetch_db_config
|
23
|
+
require 'yaml'
|
24
|
+
file = capture "cat #{shared_path}/config/database.yml"
|
25
|
+
db_config = YAML.load(file)
|
26
|
+
end
|
27
|
+
|
28
|
+
desc <<-EOF
|
29
|
+
Performs a compressed database dump. \
|
30
|
+
WARNING: This locks your tables for the duration of the mysqldump.
|
31
|
+
Don't run it madly!
|
32
|
+
EOF
|
33
|
+
task :dump, :roles => :db, :only => { :primary => true } do
|
34
|
+
prepare_from_yaml
|
35
|
+
run "mysqldump --user=#{db_user} -p --host=#{db_host} #{db_name} | bzip2 -z9 > #{db_remote_file}" do |ch, stream, out|
|
36
|
+
ch.send_data "#{db_pass}\n" if out =~ /^Enter password:/
|
37
|
+
puts out
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
desc "Restores the database from the latest compressed dump"
|
42
|
+
task :restore, :roles => :db, :only => { :primary => true } do
|
43
|
+
prepare_from_yaml
|
44
|
+
run "bzcat #{db_remote_file} | mysql --user=#{db_user} -p --host=#{db_host} #{db_name}" do |ch, stream, out|
|
45
|
+
ch.send_data "#{db_pass}\n" if out =~ /^Enter password:/
|
46
|
+
puts out
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
desc "Downloads the compressed database dump to this machine"
|
51
|
+
task :fetch_dump, :roles => :db, :only => { :primary => true } do
|
52
|
+
prepare_from_yaml
|
53
|
+
download db_remote_file, db_local_file, :via => :scp
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
desc "Create MySQL database and user for this environment using prompted values"
|
58
|
+
task :setup, :roles => :db, :only => { :primary => true } do
|
59
|
+
prepare_for_db_command
|
60
|
+
|
61
|
+
sql = <<-SQL
|
62
|
+
CREATE DATABASE #{db_name};
|
63
|
+
GRANT ALL PRIVILEGES ON #{db_name}.* TO #{db_user}@localhost IDENTIFIED BY '#{db_pass}';
|
64
|
+
SQL
|
65
|
+
|
66
|
+
run "mysql --user=#{db_admin_user} -p --execute=\"#{sql}\"" do |channel, stream, data|
|
67
|
+
if data =~ /^Enter password:/
|
68
|
+
pass = Capistrano::CLI.password_prompt "Enter database password for '#{db_admin_user}':"
|
69
|
+
channel.send_data "#{pass}\n"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
desc "Create database.yml in shared path with settings for current stage and test env"
|
76
|
+
task :create_yaml do
|
77
|
+
set(:db_user) { Capistrano::CLI.ui.ask "Enter #{environment} database username:" }
|
78
|
+
set(:db_pass) { Capistrano::CLI.password_prompt "Enter #{environment} database password:" }
|
79
|
+
|
80
|
+
db_config = ERB.new <<-EOF
|
81
|
+
base: &base
|
82
|
+
adapter: mysql
|
83
|
+
username: #{db_user}
|
84
|
+
password: #{db_pass}
|
85
|
+
|
86
|
+
#{environment}:
|
87
|
+
database: #{application}_#{environment}
|
88
|
+
<<: *base
|
89
|
+
|
90
|
+
test:
|
91
|
+
database: #{application}_test
|
92
|
+
<<: *base
|
93
|
+
EOF
|
94
|
+
|
95
|
+
put db_config.result, "#{shared_path}/config/database.yml"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def prepare_for_db_command
|
100
|
+
set :db_name, "#{application}_#{environment}"
|
101
|
+
set(:db_admin_user) { Capistrano::CLI.ui.ask "Username with priviledged database access (to create db):" }
|
102
|
+
set(:db_user) { Capistrano::CLI.ui.ask "Enter #{environment} database username:" }
|
103
|
+
set(:db_pass) { Capistrano::CLI.password_prompt "Enter #{environment} database password:" }
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
set :shared_children, %w(system log pids config)
|
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
|
+
|
9
|
+
namespace :deploy do
|
10
|
+
desc "Deploy it, github-style."
|
11
|
+
task :default do
|
12
|
+
update
|
13
|
+
restart
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "[Seppuku] Destroy everything"
|
17
|
+
task :seppuku do
|
18
|
+
run "rm -rf #{current_path}; rm -rf #{shared_path}"
|
19
|
+
rubycas.seppuku
|
20
|
+
end
|
21
|
+
|
22
|
+
task :setup_dirs, :except => { :no_release => true } do
|
23
|
+
commands = shared_dirs.map do |path|
|
24
|
+
"mkdir -p #{shared_path}/#{path}"
|
25
|
+
end
|
26
|
+
run commands.join(" && ")
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "Uploads your local config.yml to the server"
|
30
|
+
task :configure, :except => { :no_release => true } do
|
31
|
+
generate_config('config/config.yml', "#{shared_path}/config/config.yml")
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "Setup a GitHub-style deployment."
|
35
|
+
task :setup, :except => { :no_release => true } do
|
36
|
+
run "rm -rf #{current_path}"
|
37
|
+
setup_dirs
|
38
|
+
run "git clone #{repository} #{current_path}"
|
39
|
+
end
|
40
|
+
|
41
|
+
desc "Update the deployed code."
|
42
|
+
task :update_code, :except => { :no_release => true } do
|
43
|
+
run "cd #{current_path}; git fetch origin; git reset --hard #{branch}"
|
44
|
+
end
|
45
|
+
|
46
|
+
task :symlink, :except => { :no_release => true } do
|
47
|
+
symlinks.make
|
48
|
+
end
|
49
|
+
|
50
|
+
desc "[Obsolete] Nothing to cleanup when using reset --hard on git"
|
51
|
+
task :cleanup, :except => { :no_release => true } do
|
52
|
+
#nothing to cleanup, we're not working with 'releases'
|
53
|
+
puts "Nothing to cleanup, yay!"
|
54
|
+
end
|
55
|
+
|
56
|
+
namespace :rollback do
|
57
|
+
desc "Rollback a single commit."
|
58
|
+
task :default, :except => { :no_release => true } do
|
59
|
+
set :branch, "HEAD^"
|
60
|
+
deploy.default
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
desc <<-DESC
|
65
|
+
Restarts your application. This depends heavily on what server you're running.
|
66
|
+
If you are running Phusion Passenger, you can explicitly set the server type:
|
67
|
+
|
68
|
+
set :server, :passenger
|
69
|
+
|
70
|
+
...which will touch tmp/restart.txt, a file monitored by Passenger.
|
71
|
+
|
72
|
+
If you are running Unicorn, you can set:
|
73
|
+
|
74
|
+
set :server, :unicorn
|
75
|
+
|
76
|
+
...which will use unicorn signals for restarting its workers.
|
77
|
+
|
78
|
+
Otherwise, this command will call the script/process/reaper \
|
79
|
+
script under the current path.
|
80
|
+
|
81
|
+
If you are running with Unicorn, you can set the server type as well:
|
82
|
+
|
83
|
+
set :server, :unicorn
|
84
|
+
|
85
|
+
By default, this will be invoked via sudo as the `app' user. If \
|
86
|
+
you wish to run it as a different user, set the :runner variable to \
|
87
|
+
that user. If you are in an environment where you can't use sudo, set \
|
88
|
+
the :use_sudo variable to false:
|
89
|
+
|
90
|
+
set :use_sudo, false
|
91
|
+
DESC
|
92
|
+
task :restart, :roles => :app, :except => { :no_release => true } do
|
93
|
+
if exists?(:server)
|
94
|
+
case fetch(:server).to_s.downcase
|
95
|
+
when 'passenger'
|
96
|
+
passenger.bounce
|
97
|
+
when 'unicorn'
|
98
|
+
is_using_god ? god.restart_unicorn : unicorn.restart
|
99
|
+
end
|
100
|
+
else
|
101
|
+
puts "Dunno how to restart your internets! kthx!"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
data/lib/recipes/god.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
# God Monitoring Tool
|
2
|
+
# God is a Process Monitoring Framework written in Ruby
|
3
|
+
# More info at http://god.rubyforge.org/
|
4
|
+
#------------------------------------------------------------------------------
|
5
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
6
|
+
_cset(:god_local_config) { "#{templates_path}/app.god.erb" }
|
7
|
+
_cset(:god_remote_config) { "#{shared_path}/config/app.god" }
|
8
|
+
|
9
|
+
namespace :god do
|
10
|
+
|
11
|
+
desc "Parses and uploads god configuration for this app"
|
12
|
+
task :setup do
|
13
|
+
generate_config(god_local_config, god_remote_config)
|
14
|
+
end
|
15
|
+
|
16
|
+
_cset(:bin_god) { defined?(:rvm_ruby_string) ? 'bootup_god' : 'god' }
|
17
|
+
_cset(:server_name) { "#{application}-unicorn" }
|
18
|
+
_cset(:god_init_local) { "#{docs_path}/god/god.init" }
|
19
|
+
_cset :god_init_temp, '/tmp/god.init'
|
20
|
+
_cset :god_init_remote, '/etc/init.d/god'
|
21
|
+
_cset(:god_defo_local) { "#{docs_path}/god/god"}
|
22
|
+
_cset :god_defo_temp, '/tmp/god'
|
23
|
+
_cset :god_defo_remote, '/etc/default/god'
|
24
|
+
_cset(:god_conf_local) { "#{docs_path}/god/god.conf" }
|
25
|
+
_cset :god_conf_temp, '/tmp/god.conf'
|
26
|
+
_cset :god_conf_remote, '/etc/god/god.conf'
|
27
|
+
|
28
|
+
|
29
|
+
task :setup_temp, :roles => :app do
|
30
|
+
sudo "rm -f #{god_conf_remote} #{god_init_remote} #{god_defo_remote}"
|
31
|
+
end
|
32
|
+
|
33
|
+
task :setup_conf, :roles => :app do
|
34
|
+
upload god_conf_local, god_conf_temp, :via => :scp
|
35
|
+
sudo "mkdir -p #{File.dirname(god_conf_remote)}"
|
36
|
+
sudo "mv #{god_conf_temp} #{god_conf_remote}"
|
37
|
+
end
|
38
|
+
|
39
|
+
task :setup_init, :roles => :app do
|
40
|
+
upload god_init_local, god_init_temp, :via => :scp
|
41
|
+
sudo "mv #{god_init_temp} #{god_init_remote}"
|
42
|
+
# Allow executing the init.d script
|
43
|
+
sudo "chmod +x #{god_init_remote}"
|
44
|
+
# Make it run at bootup
|
45
|
+
sudo "update-rc.d god defaults"
|
46
|
+
end
|
47
|
+
|
48
|
+
task :setup_defo, :roles => :app do
|
49
|
+
upload god_defo_local, god_defo_temp, :via => :scp
|
50
|
+
sudo "mv #{god_defo_temp} #{god_defo_remote}"
|
51
|
+
end
|
52
|
+
|
53
|
+
desc "Bootstraps god on your server. Be careful with this."
|
54
|
+
task :bootstrap, :roles => :app do
|
55
|
+
setup_temp
|
56
|
+
setup_defo
|
57
|
+
setup_init
|
58
|
+
setup_conf
|
59
|
+
|
60
|
+
puts "God is bootstrapped. To remove use 'cap god:implode'"
|
61
|
+
end
|
62
|
+
|
63
|
+
desc "(Seppuku) Completely remove god from the system init"
|
64
|
+
task :implode, :roles => :app do
|
65
|
+
# Removing any system startup links for /etc/init.d/god ...
|
66
|
+
sudo "update-rc.d -f god remove"
|
67
|
+
|
68
|
+
# Suicide follows.
|
69
|
+
sudo "rm -f #{god_conf_remote}"
|
70
|
+
sudo "rm -f #{god_defo_remote}"
|
71
|
+
sudo "rm -f #{god_init_remote}"
|
72
|
+
puts "God is no more."
|
73
|
+
end
|
74
|
+
|
75
|
+
task :restart_unicorn, :roles => :app do
|
76
|
+
sudo "#{bin_god} restart #{server_name}"
|
77
|
+
end
|
78
|
+
|
79
|
+
task :log, :roles => :app do
|
80
|
+
sudo "#{bin_god} log #{application}"
|
81
|
+
end
|
82
|
+
|
83
|
+
desc "Reload config"
|
84
|
+
task :reload, :roles => :app do
|
85
|
+
sudo "#{bin_god} load #{god_remote_config}"
|
86
|
+
end
|
87
|
+
|
88
|
+
desc "Start god service"
|
89
|
+
task :start, :roles => :app do
|
90
|
+
sudo "service god start"
|
91
|
+
end
|
92
|
+
|
93
|
+
desc "Stops god service"
|
94
|
+
task :stop, :roles => :app do
|
95
|
+
sudo "service god stop"
|
96
|
+
end
|
97
|
+
|
98
|
+
desc "Quit god, but not the processes it's monitoring"
|
99
|
+
task :quit, :roles => :app do
|
100
|
+
sudo "#{bin_god} quit"
|
101
|
+
end
|
102
|
+
|
103
|
+
desc "Terminate god and all monitored processes"
|
104
|
+
task :terminate, :roles => :app do
|
105
|
+
sudo "#{bin_god} terminate"
|
106
|
+
end
|
107
|
+
|
108
|
+
desc "Describe the status of the running tasks"
|
109
|
+
task :status, :roles => :app do
|
110
|
+
sudo "#{bin_god} status"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
after 'deploy:setup', 'god:setup' if is_using_god
|
114
|
+
end
|