dark-capistrano-recipes 0.6.17 → 0.7.0
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 +2 -0
- data/README.rdoc +30 -2
- data/VERSION.yml +2 -2
- data/dark-capistrano-recipes.gemspec +8 -8
- data/generators/nginx.conf.erb +48 -6
- data/lib/helpers.rb +10 -9
- data/lib/recipes/application.rb +17 -17
- data/lib/recipes/bluepill.rb +53 -0
- data/lib/recipes/bundler.rb +5 -10
- data/lib/recipes/db.rb +32 -30
- data/lib/recipes/deploy.rb +16 -20
- data/lib/recipes/god.rb +16 -16
- data/lib/recipes/hooks.rb +2 -3
- data/lib/recipes/log.rb +3 -3
- data/lib/recipes/nginx.rb +9 -13
- data/lib/recipes/passenger.rb +6 -6
- data/lib/recipes/resque.rb +48 -0
- data/lib/recipes/sphinx.rb +39 -0
- data/lib/recipes/symlinks.rb +6 -15
- data/lib/recipes/unicorn.rb +12 -13
- metadata +10 -8
- data/lib/recipes/rvm.rb +0 -11
data/README.rdoc
CHANGED
@@ -7,11 +7,16 @@ Useful Capistrano recipes including:
|
|
7
7
|
* Log rotation and tailing commands
|
8
8
|
* Restart and profile Phusion Passenger application server
|
9
9
|
* Configure, start/stop/restart Unicorn application server
|
10
|
+
* Send commands to God or Bluepill monitoring tools
|
11
|
+
* Send commands to Thinking Sphinx
|
10
12
|
|
11
13
|
==Included Tasks
|
12
14
|
|
13
15
|
* cap db:create_yaml
|
14
16
|
* cap db:mysql:setup
|
17
|
+
* cap db:mysql:dump
|
18
|
+
* cap db:mysql:fetch_dump
|
19
|
+
* cap db:mysql:restore
|
15
20
|
* cap log:rotate
|
16
21
|
* cap log:tail
|
17
22
|
* cap passenger:bounce
|
@@ -27,6 +32,27 @@ Useful Capistrano recipes including:
|
|
27
32
|
* cap unicorn:restart
|
28
33
|
* cap unicorn:setup
|
29
34
|
* cap symlinks:make
|
35
|
+
* cap god:setup
|
36
|
+
* cap god:implode
|
37
|
+
* cap god:restart
|
38
|
+
* cap god:reload
|
39
|
+
* cap god:status
|
40
|
+
* cap god:terminate
|
41
|
+
* cap god:start
|
42
|
+
* cap god:stop
|
43
|
+
* cap god:quit
|
44
|
+
* cap bluepill:install
|
45
|
+
* cap bluepill:init
|
46
|
+
* cap bluepill:start
|
47
|
+
* cap bluepill:restart
|
48
|
+
* cap bluepill:stop
|
49
|
+
* cap bluepill:status
|
50
|
+
* cap sphinx:config
|
51
|
+
* cap sphinx:start
|
52
|
+
* cap sphinx:stop
|
53
|
+
* cap sphinx:rebuild
|
54
|
+
* cap sphinx:index
|
55
|
+
* cap sphinx:symlinks
|
30
56
|
|
31
57
|
==Installation
|
32
58
|
|
@@ -43,7 +69,7 @@ Optionally install the Capistrano extensions gem to give you multistage support:
|
|
43
69
|
Install this gem:
|
44
70
|
|
45
71
|
sudo gem install capistrano-recipes --source=http://gemcutter.com
|
46
|
-
|
72
|
+
|
47
73
|
To setup the initial Capistrano deploy file, go to your Rails app folder via command line and enter:
|
48
74
|
|
49
75
|
capify .
|
@@ -52,8 +78,10 @@ To setup the initial Capistrano deploy file, go to your Rails app folder via com
|
|
52
78
|
|
53
79
|
Inside the newly created config/deploy.rb, add:
|
54
80
|
|
55
|
-
require 'capistrano_recipes'
|
56
81
|
require 'capistrano/ext/multistage' # only require if you've installed Cap ext gem
|
82
|
+
|
83
|
+
# This one should go at the end of your deploy.rb
|
84
|
+
require 'capistrano_recipes'
|
57
85
|
|
58
86
|
===RVM
|
59
87
|
|
data/VERSION.yml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{dark-capistrano-recipes}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.7.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Phil Misiowiec", "Leonardo Bighetti"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-02-10}
|
13
13
|
s.description = %q{Extend the Capistrano gem with these useful recipes}
|
14
14
|
s.email = %q{leonardobighetti@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -32,6 +32,7 @@ Gem::Specification.new do |s|
|
|
32
32
|
"lib/capistrano_recipes.rb",
|
33
33
|
"lib/helpers.rb",
|
34
34
|
"lib/recipes/application.rb",
|
35
|
+
"lib/recipes/bluepill.rb",
|
35
36
|
"lib/recipes/bundler.rb",
|
36
37
|
"lib/recipes/db.rb",
|
37
38
|
"lib/recipes/deploy.rb",
|
@@ -40,18 +41,18 @@ Gem::Specification.new do |s|
|
|
40
41
|
"lib/recipes/log.rb",
|
41
42
|
"lib/recipes/nginx.rb",
|
42
43
|
"lib/recipes/passenger.rb",
|
43
|
-
"lib/recipes/
|
44
|
+
"lib/recipes/resque.rb",
|
45
|
+
"lib/recipes/sphinx.rb",
|
44
46
|
"lib/recipes/symlinks.rb",
|
45
47
|
"lib/recipes/unicorn.rb"
|
46
48
|
]
|
47
49
|
s.homepage = %q{http://github.com/darkside/capistrano-recipes}
|
48
50
|
s.rdoc_options = ["--charset=UTF-8"]
|
49
51
|
s.require_paths = ["lib"]
|
50
|
-
s.rubygems_version = %q{1.
|
52
|
+
s.rubygems_version = %q{1.5.0}
|
51
53
|
s.summary = %q{Darkside's Capistrano recipes}
|
52
54
|
|
53
55
|
if s.respond_to? :specification_version then
|
54
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
55
56
|
s.specification_version = 3
|
56
57
|
|
57
58
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
@@ -66,4 +67,3 @@ Gem::Specification.new do |s|
|
|
66
67
|
s.add_dependency(%q<capistrano-ext>, [">= 1.2.1"])
|
67
68
|
end
|
68
69
|
end
|
69
|
-
|
data/generators/nginx.conf.erb
CHANGED
@@ -32,10 +32,13 @@
|
|
32
32
|
}
|
33
33
|
|
34
34
|
location / {
|
35
|
+
<% if is_using_passenger %>
|
36
|
+
rails_env <%= rails_env %>;
|
37
|
+
passenger_enabled on;
|
38
|
+
<% end %>
|
39
|
+
|
35
40
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
36
|
-
#proxy_set_header X-Forwarded-Proto https;
|
37
41
|
proxy_set_header Host $http_host;
|
38
|
-
#proxy_redirect off;
|
39
42
|
|
40
43
|
# If the file exists as a static file serve it directly without
|
41
44
|
# running all the other rewite tests on it
|
@@ -62,28 +65,62 @@
|
|
62
65
|
rewrite (.*) $1.html break;
|
63
66
|
}
|
64
67
|
|
65
|
-
|
66
68
|
<% if is_using_unicorn %>
|
67
69
|
if (!-f $request_filename) {
|
68
70
|
proxy_pass http://<%= application %>_app_server;
|
69
71
|
break;
|
70
72
|
}
|
71
73
|
<% end %>
|
72
|
-
|
73
74
|
}
|
74
|
-
|
75
|
+
|
76
|
+
# Now this supposedly should work as it gets the filenames with querystrings that Rails provides.
|
77
|
+
# BUT there's a chance it could break the ajax calls.
|
78
|
+
location ~* \.(ico|css|gif|jpe?g|png)(\?[0-9]+)?$ {
|
79
|
+
expires max;
|
80
|
+
break;
|
81
|
+
}
|
82
|
+
|
83
|
+
location ~ ^/javascripts/.*\.js(\?[0-9]+)?$ {
|
84
|
+
expires max;
|
85
|
+
break;
|
86
|
+
}
|
87
|
+
|
88
|
+
# Now this supposedly should work as it gets the filenames with querystrings that Rails provides.
|
89
|
+
# BUT there's a chance it could break the ajax calls.
|
90
|
+
location ~* \.(ico|css|gif|jpe?g|png)(\?[0-9]+)?$ {
|
91
|
+
expires max;
|
92
|
+
break;
|
93
|
+
}
|
94
|
+
|
95
|
+
location ~ ^/javascripts/.*\.js(\?[0-9]+)?$ {
|
96
|
+
expires max;
|
97
|
+
break;
|
98
|
+
}
|
99
|
+
|
100
|
+
# if the request is for a static resource, nginx should serve it directly
|
101
|
+
# and add a far future expires header to it, making the browser
|
102
|
+
# cache the resource and navigate faster over the website
|
103
|
+
location ~ ^/(images|javascripts|stylesheets|system)/ {
|
104
|
+
root /home/deployer/shop/current/public;
|
105
|
+
expires max;
|
106
|
+
break;
|
107
|
+
}
|
108
|
+
|
75
109
|
# Rails error pages
|
76
110
|
error_page 500 502 503 504 /500.html;
|
77
111
|
location = /500.html {
|
78
112
|
root <%= deploy_to %>/current/public;
|
79
113
|
}
|
80
114
|
}
|
115
|
+
|
81
116
|
<% if application_uses_ssl %>
|
117
|
+
|
82
118
|
<% if is_using_unicorn %>
|
83
119
|
upstream <%= application %>_app_ssl {
|
84
|
-
|
120
|
+
server unix:<%= unicorn_socket %> fail_timeout=0;
|
85
121
|
}
|
86
122
|
<% end %>
|
123
|
+
|
87
124
|
# This server is setup for ssl. Uncomment if
|
88
125
|
# you are using ssl as well as port 80.
|
89
126
|
server {
|
@@ -112,6 +149,11 @@
|
|
112
149
|
}
|
113
150
|
|
114
151
|
location / {
|
152
|
+
<% if is_using_passenger %>
|
153
|
+
rails_env <%= rails_env %>;
|
154
|
+
passenger_enabled on;
|
155
|
+
<% end %>
|
156
|
+
|
115
157
|
# needed to forward user's IP address to rails
|
116
158
|
proxy_set_header X-Real-IP $remote_addr;
|
117
159
|
|
data/lib/helpers.rb
CHANGED
@@ -28,8 +28,8 @@ def is_using_unicorn
|
|
28
28
|
is_using('unicorn',:app_server)
|
29
29
|
end
|
30
30
|
|
31
|
-
def
|
32
|
-
is_using('god'
|
31
|
+
def is_app_monitored?
|
32
|
+
is_using('bluepill', :monitorer) || is_using('god', :monitorer)
|
33
33
|
end
|
34
34
|
|
35
35
|
def is_using(something, with_some_var)
|
@@ -56,12 +56,11 @@ def parse_config(file)
|
|
56
56
|
return ERB.new(template).result(binding) # parse it
|
57
57
|
end
|
58
58
|
|
59
|
-
|
60
|
-
# Prompts the user for a message to agree/decline
|
61
|
-
#
|
59
|
+
# =========================================================================
|
60
|
+
# Prompts the user for a message to agree/decline
|
61
|
+
# =========================================================================
|
62
62
|
def ask(message, default=true)
|
63
63
|
Capistrano::CLI.ui.agree(message)
|
64
|
-
|
65
64
|
end
|
66
65
|
|
67
66
|
# Generates a configuration file parsing through ERB
|
@@ -75,8 +74,10 @@ def generate_config(local_file,remote_file)
|
|
75
74
|
`rm #{temp_file}`
|
76
75
|
end
|
77
76
|
|
78
|
-
#
|
79
|
-
#
|
77
|
+
# =========================================================================
|
78
|
+
# Executes a basic rake task.
|
79
|
+
# Example: run_rake log:clear
|
80
|
+
# =========================================================================
|
80
81
|
def run_rake(task)
|
81
82
|
run "cd #{current_path} && rake #{task} RAILS_ENV=#{environment}"
|
82
|
-
end
|
83
|
+
end
|
data/lib/recipes/application.rb
CHANGED
@@ -1,22 +1,16 @@
|
|
1
|
-
Capistrano::Configuration.instance
|
2
|
-
|
1
|
+
Capistrano::Configuration.instance.load do
|
3
2
|
# User settings
|
4
3
|
set :user, 'deploy' unless exists?(:user)
|
5
4
|
set :group,'www-data' unless exists?(:group)
|
6
5
|
|
7
|
-
|
8
6
|
# Server settings
|
9
|
-
set :app_server, :unicorn
|
10
|
-
set :web_server, :nginx
|
11
|
-
set :runner, user
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
# Are we using ssl as well? Used by generators to configure a ssl host
|
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
|
+
|
16
12
|
set :application_uses_ssl, true unless exists?(:application_uses_ssl)
|
17
|
-
|
18
|
-
# The port to listen to https requests, usually 443
|
19
|
-
set :application_port_ssl, 443 unless exists?(:application_port_ssl)
|
13
|
+
set :application_port_ssl, 443 unless exists?(:application_port_ssl)
|
20
14
|
|
21
15
|
# Database settings
|
22
16
|
set :database, :mysql unless exists?(:database)
|
@@ -37,8 +31,14 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
37
31
|
|
38
32
|
# RVM settings
|
39
33
|
set :using_rvm, true unless exists?(:using_rvm)
|
40
|
-
|
41
|
-
|
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
42
|
|
43
43
|
# Daemons settings
|
44
44
|
# The unix socket that unicorn will be attached to.
|
@@ -51,10 +51,10 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
51
51
|
# a good choice as any.
|
52
52
|
set(:pids_path) { File.join(shared_path, "pids") } unless exists?(:pids_path)
|
53
53
|
|
54
|
-
set :monitorer, '
|
54
|
+
set :monitorer, 'bluepill' unless exists?(:monitorer)
|
55
55
|
|
56
56
|
# Application settings
|
57
|
-
set :shared_dirs, %w(
|
57
|
+
set :shared_dirs, %w(config uploads backup bundle tmp) unless exists?(:shared_dirs)
|
58
58
|
|
59
59
|
namespace :app do
|
60
60
|
task :setup, :roles => :app do
|
@@ -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
|
data/lib/recipes/bundler.rb
CHANGED
@@ -1,19 +1,14 @@
|
|
1
|
-
|
2
|
-
# Manages gems in a sane way.
|
3
|
-
# http://gembundler.com/
|
4
|
-
Capistrano::Configuration.instance(:must_exist).load do
|
1
|
+
Capistrano::Configuration.instance.load do
|
5
2
|
namespace :bundler do
|
6
|
-
|
7
|
-
desc "Installs bundler gem to your server"
|
3
|
+
desc "|DarkRecipes| Installs bundler gem to your server"
|
8
4
|
task :setup, :roles => :app do
|
9
|
-
run "if ! gem list | grep --silent -e 'bundler
|
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"
|
10
6
|
end
|
11
7
|
|
12
|
-
|
8
|
+
desc "|DarkRecipes| Runs bundle install on the app server (internal task)"
|
13
9
|
task :install, :roles => :app, :except => { :no_release => true } do
|
14
10
|
run "cd #{current_path} && bundle install --deployment --without=development test"
|
15
11
|
end
|
16
|
-
end
|
17
|
-
|
12
|
+
end
|
18
13
|
end
|
19
14
|
|
data/lib/recipes/db.rb
CHANGED
@@ -1,32 +1,10 @@
|
|
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
|
-
|
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
6
|
desc <<-EOF
|
29
|
-
Performs a compressed database dump. \
|
7
|
+
|DarkRecipes| Performs a compressed database dump. \
|
30
8
|
WARNING: This locks your tables for the duration of the mysqldump.
|
31
9
|
Don't run it madly!
|
32
10
|
EOF
|
@@ -38,7 +16,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
38
16
|
end
|
39
17
|
end
|
40
18
|
|
41
|
-
desc "Restores the database from the latest compressed dump"
|
19
|
+
desc "|DarkRecipes| Restores the database from the latest compressed dump"
|
42
20
|
task :restore, :roles => :db, :only => { :primary => true } do
|
43
21
|
prepare_from_yaml
|
44
22
|
run "bzcat #{db_remote_file} | mysql --user=#{db_user} -p --host=#{db_host} #{db_name}" do |ch, stream, out|
|
@@ -47,14 +25,13 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
47
25
|
end
|
48
26
|
end
|
49
27
|
|
50
|
-
desc "Downloads the compressed database dump to this machine"
|
28
|
+
desc "|DarkRecipes| Downloads the compressed database dump to this machine"
|
51
29
|
task :fetch_dump, :roles => :db, :only => { :primary => true } do
|
52
30
|
prepare_from_yaml
|
53
31
|
download db_remote_file, db_local_file, :via => :scp
|
54
32
|
end
|
55
33
|
|
56
|
-
|
57
|
-
desc "Create MySQL database and user for this environment using prompted values"
|
34
|
+
desc "|DarkRecipes| Create MySQL database and user for this environment using prompted values"
|
58
35
|
task :setup, :roles => :db, :only => { :primary => true } do
|
59
36
|
prepare_for_db_command
|
60
37
|
|
@@ -69,10 +46,31 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
69
46
|
channel.send_data "#{pass}\n"
|
70
47
|
end
|
71
48
|
end
|
72
|
-
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
|
73
71
|
end
|
74
72
|
|
75
|
-
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"
|
76
74
|
task :create_yaml do
|
77
75
|
set(:db_user) { Capistrano::CLI.ui.ask "Enter #{environment} database username:" }
|
78
76
|
set(:db_pass) { Capistrano::CLI.password_prompt "Enter #{environment} database password:" }
|
@@ -109,4 +107,8 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
109
107
|
Capistrano::CLI.ui.say "Populating the database..."
|
110
108
|
run "cd #{current_path}; rake RAILS_ENV=#{variables[:rails_env]} db:seed"
|
111
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
|
112
114
|
end
|
data/lib/recipes/deploy.rb
CHANGED
@@ -1,65 +1,61 @@
|
|
1
|
-
Capistrano::Configuration.instance
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
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? [Yn]")
|
6
|
-
end
|
7
|
-
|
8
3
|
|
9
4
|
namespace :deploy do
|
10
|
-
desc "Deploy it, github-style."
|
5
|
+
desc "|DarkRecipes| Deploy it, github-style."
|
11
6
|
task :default, :roles => :app, :except => { :no_release => true } do
|
12
7
|
update
|
13
8
|
restart
|
14
9
|
end
|
15
10
|
|
16
|
-
desc "
|
11
|
+
desc "|DarkRecipes| Destroys everything"
|
17
12
|
task :seppuku, :roles => :app, :except => { :no_release => true } do
|
18
13
|
run "rm -rf #{current_path}; rm -rf #{shared_path}"
|
19
|
-
rubycas.seppuku
|
20
14
|
end
|
21
15
|
|
22
|
-
|
16
|
+
desc "|DarkRecipes| Create shared dirs"
|
17
|
+
task :setup_dirs, :roles => :app, :except => { :no_release => true } do
|
23
18
|
commands = shared_dirs.map do |path|
|
24
19
|
"mkdir -p #{shared_path}/#{path}"
|
25
20
|
end
|
26
21
|
run commands.join(" && ")
|
27
22
|
end
|
28
23
|
|
29
|
-
desc "Uploads your local config.yml to the server"
|
24
|
+
desc "|DarkRecipes| Uploads your local config.yml to the server"
|
30
25
|
task :configure, :roles => :app, :except => { :no_release => true } do
|
31
26
|
generate_config('config/config.yml', "#{shared_path}/config/config.yml")
|
32
27
|
end
|
33
28
|
|
34
|
-
desc "Setup a GitHub-style deployment."
|
29
|
+
desc "|DarkRecipes| Setup a GitHub-style deployment."
|
35
30
|
task :setup, :roles => :app, :except => { :no_release => true } do
|
36
31
|
run "rm -rf #{current_path}"
|
37
32
|
setup_dirs
|
38
33
|
run "git clone #{repository} #{current_path}"
|
39
34
|
end
|
40
35
|
|
41
|
-
desc "Update the deployed code."
|
36
|
+
desc "|DarkRecipes| Update the deployed code."
|
42
37
|
task :update_code, :roles => :app, :except => { :no_release => true } do
|
43
38
|
run "cd #{current_path}; git fetch origin; git reset --hard #{branch}"
|
44
39
|
end
|
45
40
|
|
41
|
+
desc "|DarkRecipes| Alias for symlinks:make"
|
46
42
|
task :symlink, :roles => :app, :except => { :no_release => true } do
|
47
43
|
symlinks.make
|
48
44
|
end
|
49
45
|
|
50
|
-
desc "
|
46
|
+
desc "|DarkRecipes| Remote run for rake db:migrate"
|
51
47
|
task :migrate, :roles => :app, :except => { :no_release => true } do
|
52
48
|
run "cd #{current_path}; bundle exec rake RAILS_ENV=#{rails_env} db:migrate"
|
53
49
|
end
|
54
50
|
|
55
|
-
desc "[Obsolete] Nothing to cleanup when using reset --hard on git"
|
51
|
+
desc "|DarkRecipes| [Obsolete] Nothing to cleanup when using reset --hard on git"
|
56
52
|
task :cleanup, :roles => :app, :except => { :no_release => true } do
|
57
53
|
#nothing to cleanup, we're not working with 'releases'
|
58
54
|
puts "Nothing to cleanup, yay!"
|
59
55
|
end
|
60
56
|
|
61
57
|
namespace :rollback do
|
62
|
-
desc "Rollback , :except => { :no_release => true }a single commit."
|
58
|
+
desc "|DarkRecipes| Rollback , :except => { :no_release => true }a single commit."
|
63
59
|
task :default, :roles => :app, :except => { :no_release => true } do
|
64
60
|
set :branch, "HEAD^"
|
65
61
|
deploy.default
|
@@ -67,7 +63,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
67
63
|
end
|
68
64
|
|
69
65
|
desc <<-DESC
|
70
|
-
Restarts your application. This depends heavily on what server you're running.
|
66
|
+
|DarkRecipes| Restarts your application. This depends heavily on what server you're running.
|
71
67
|
If you are running Phusion Passenger, you can explicitly set the server type:
|
72
68
|
|
73
69
|
set :server, :passenger
|
@@ -87,12 +83,12 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
87
83
|
|
88
84
|
set :server, :unicorn
|
89
85
|
|
90
|
-
By default, this will be
|
86
|
+
By default, this will be |DarkRecipes| d via sudo as the `app' user. If \
|
91
87
|
you wish to run it as a different user, set the :runner variable to \
|
92
88
|
that user. If you are in an environment where you can't use sudo, set \
|
93
89
|
the :use_sudo variable to false:
|
94
90
|
|
95
|
-
|
91
|
+
set :use_sudo, false
|
96
92
|
DESC
|
97
93
|
task :restart, :roles => :app, :except => { :no_release => true } do
|
98
94
|
if exists?(:app_server)
|
@@ -100,7 +96,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
100
96
|
when 'passenger'
|
101
97
|
passenger.bounce
|
102
98
|
when 'unicorn'
|
103
|
-
|
99
|
+
is_using('god', :monitorer) ? god.restart.app : unicorn.restart
|
104
100
|
end
|
105
101
|
else
|
106
102
|
puts "Dunno how to restart your internets! kthx!"
|
data/lib/recipes/god.rb
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
# God is a Process Monitoring Framework written in Ruby
|
3
3
|
# More info at http://god.rubyforge.org/
|
4
4
|
#------------------------------------------------------------------------------
|
5
|
-
Capistrano::Configuration.instance
|
5
|
+
Capistrano::Configuration.instance.load do
|
6
6
|
_cset(:god_local_config) { "#{templates_path}/app.god.erb" }
|
7
7
|
_cset(:god_remote_config) { "#{shared_path}/config/app.god" }
|
8
8
|
|
9
9
|
namespace :god do
|
10
10
|
|
11
|
-
desc "Parses and uploads god configuration for this app"
|
11
|
+
desc "|DarkRecipes| Parses and uploads god configuration for this app"
|
12
12
|
task :setup, :roles => :app do
|
13
13
|
generate_config(god_local_config, god_remote_config)
|
14
14
|
end
|
@@ -25,7 +25,6 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
25
25
|
_cset :god_conf_temp, '/tmp/god.conf'
|
26
26
|
_cset :god_conf_remote, '/etc/god/god.conf'
|
27
27
|
|
28
|
-
|
29
28
|
task :setup_temp, :roles => :app do
|
30
29
|
sudo "rm -f #{god_conf_remote} #{god_init_remote} #{god_defo_remote}"
|
31
30
|
end
|
@@ -50,7 +49,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
50
49
|
sudo "mv #{god_defo_temp} #{god_defo_remote}"
|
51
50
|
end
|
52
51
|
|
53
|
-
desc "Bootstraps god on your server. Be careful with this."
|
52
|
+
desc "|DarkRecipes| Bootstraps god on your server. Be careful with this."
|
54
53
|
task :bootstrap, :roles => :app do
|
55
54
|
setup_temp
|
56
55
|
setup_defo
|
@@ -60,7 +59,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
60
59
|
puts "God is bootstrapped. To remove use 'cap god:implode'"
|
61
60
|
end
|
62
61
|
|
63
|
-
desc "(Seppuku) Completely remove god from the system init"
|
62
|
+
desc "|DarkRecipes| (Seppuku) Completely remove god from the system init"
|
64
63
|
task :implode, :roles => :app do
|
65
64
|
# Removing any system startup links for /etc/init.d/god ...
|
66
65
|
sudo "update-rc.d -f god remove"
|
@@ -72,54 +71,55 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
72
71
|
puts "God is no more."
|
73
72
|
end
|
74
73
|
|
75
|
-
desc "
|
74
|
+
desc "|DarkRecipes| Use god to restart the app"
|
76
75
|
namespace :restart do
|
77
76
|
task :default, :roles => :app, :except => { :no_release => true } do
|
78
77
|
sudo "#{bin_god} restart #{application}"
|
79
78
|
end
|
80
|
-
|
81
|
-
desc "Restarts the app server"
|
79
|
+
|
80
|
+
desc "|DarkRecipes| Restarts the app server"
|
82
81
|
task :app, :roles => :app, :except => { :no_release => true } do
|
83
82
|
sudo "#{bin_god} restart #{application}-#{app_server.to_s.downcase}"
|
84
83
|
end
|
85
84
|
end
|
86
85
|
|
87
|
-
desc "Fetches the log for the whole group"
|
86
|
+
desc "|DarkRecipes| Fetches the log for the whole group"
|
88
87
|
task :log, :roles => :app do
|
89
88
|
sudo "#{bin_god} log #{application}"
|
90
89
|
end
|
91
90
|
|
92
|
-
desc "Reload config"
|
91
|
+
desc "|DarkRecipes| Reload config"
|
93
92
|
task :reload, :roles => :app do
|
94
93
|
sudo "#{bin_god} load #{god_remote_config}"
|
95
94
|
end
|
96
95
|
|
97
|
-
desc "Start god service"
|
96
|
+
desc "|DarkRecipes| Start god service"
|
98
97
|
task :start, :roles => :app do
|
99
98
|
sudo "service god start"
|
100
99
|
end
|
101
100
|
|
102
|
-
desc "Stops god service"
|
101
|
+
desc "|DarkRecipes| Stops god service"
|
103
102
|
task :stop, :roles => :app do
|
104
103
|
sudo "service god stop"
|
105
104
|
end
|
106
105
|
|
107
|
-
desc "Quit god, but not the processes it's monitoring"
|
106
|
+
desc "|DarkRecipes| Quit god, but not the processes it's monitoring"
|
108
107
|
task :quit, :roles => :app do
|
109
108
|
sudo "#{bin_god} quit"
|
110
109
|
end
|
111
110
|
|
112
|
-
desc "Terminate god and all monitored processes"
|
111
|
+
desc "|DarkRecipes| Terminate god and all monitored processes"
|
113
112
|
task :terminate, :roles => :app do
|
114
113
|
sudo "#{bin_god} terminate"
|
115
114
|
end
|
116
115
|
|
117
|
-
desc "Describe the status of the running tasks"
|
116
|
+
desc "|DarkRecipes| Describe the status of the running tasks"
|
118
117
|
task :status, :roles => :app do
|
119
118
|
sudo "#{bin_god} status"
|
120
119
|
end
|
121
120
|
end
|
121
|
+
|
122
122
|
after 'deploy:setup' do
|
123
123
|
god.setup if Capistrano::CLI.ui.agree("Create app.god in app's shared path? [Yn]")
|
124
|
-
end if
|
124
|
+
end if is_using('god', :monitorer)
|
125
125
|
end
|
data/lib/recipes/hooks.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
# Common hooks for all scenarios.
|
2
|
-
Capistrano::Configuration.instance
|
2
|
+
Capistrano::Configuration.instance.load do
|
3
3
|
after 'deploy:setup' do
|
4
4
|
app.setup
|
5
|
-
bundler.setup
|
5
|
+
bundler.setup if Capistrano::CLI.ui.agree("Do you need to install the bundler gem? [Yn]")
|
6
6
|
end
|
7
7
|
|
8
8
|
after "deploy:update_code" do
|
9
9
|
symlinks.make
|
10
10
|
bundler.install
|
11
|
-
deploy.cleanup
|
12
11
|
end
|
13
12
|
end
|
14
13
|
|
data/lib/recipes/log.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
Capistrano::Configuration.instance
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
2
|
namespace :log do
|
3
|
-
desc "Tail all application log files"
|
3
|
+
desc "|DarkRecipes| Tail all application log files"
|
4
4
|
task :tail, :roles => :app do
|
5
5
|
run "tail -f #{shared_path}/log/*.log" do |channel, stream, data|
|
6
6
|
puts "#{channel[:host]}: #{data}"
|
@@ -9,7 +9,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
desc <<-DESC
|
12
|
-
Install log rotation script; optional args: days=7, size=5M, group (defaults to same value as :user)
|
12
|
+
|DarkRecipes| Install log rotation script; optional args: days=7, size=5M, group (defaults to same value as :user)
|
13
13
|
DESC
|
14
14
|
task :rotate, :roles => :app do
|
15
15
|
rotate_script = %Q{#{shared_path}/log/#{environment}.log {
|
data/lib/recipes/nginx.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
Capistrano::Configuration.instance
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
2
|
|
3
|
-
# Where your nginx lives. Usually /opt/nginx or /usr/local/nginx for source
|
4
|
-
# compiled.
|
3
|
+
# Where your nginx lives. Usually /opt/nginx or /usr/local/nginx for source compiled.
|
5
4
|
set :nginx_path_prefix, "/opt/nginx" unless exists?(:nginx_path_prefix)
|
6
5
|
|
7
6
|
# Path to the nginx erb template to be parsed before uploading to remote
|
@@ -15,42 +14,39 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
15
14
|
# Nginx tasks are not *nix agnostic, they assume you're using Debian/Ubuntu.
|
16
15
|
# Override them as needed.
|
17
16
|
namespace :nginx do
|
18
|
-
|
19
|
-
desc "Parses and uploads nginx configuration for this app."
|
17
|
+
desc "|DarkRecipes| Parses and uploads nginx configuration for this app."
|
20
18
|
task :setup, :roles => :app , :except => { :no_release => true } do
|
21
19
|
generate_config(nginx_local_config, nginx_remote_config)
|
22
20
|
end
|
23
21
|
|
24
|
-
|
22
|
+
desc "|DarkRecipes| Parses config file and outputs it to STDOUT (internal task)"
|
25
23
|
task :parse, :roles => :app , :except => { :no_release => true } do
|
26
24
|
puts parse_config(nginx_local_config)
|
27
25
|
end
|
28
26
|
|
29
|
-
desc "Restart nginx"
|
27
|
+
desc "|DarkRecipes| Restart nginx"
|
30
28
|
task :restart, :roles => :app , :except => { :no_release => true } do
|
31
29
|
sudo "service nginx restart"
|
32
30
|
end
|
33
31
|
|
34
|
-
desc "Stop nginx"
|
32
|
+
desc "|DarkRecipes| Stop nginx"
|
35
33
|
task :stop, :roles => :app , :except => { :no_release => true } do
|
36
34
|
sudo "service nginx stop"
|
37
35
|
end
|
38
36
|
|
39
|
-
desc "Start nginx"
|
37
|
+
desc "|DarkRecipes| Start nginx"
|
40
38
|
task :start, :roles => :app , :except => { :no_release => true } do
|
41
39
|
sudo "service nginx start"
|
42
40
|
end
|
43
41
|
|
44
|
-
desc "Show nginx status"
|
42
|
+
desc "|DarkRecipes| Show nginx status"
|
45
43
|
task :status, :roles => :app , :except => { :no_release => true } do
|
46
44
|
sudo "service nginx status"
|
47
45
|
end
|
48
|
-
|
49
46
|
end
|
50
47
|
|
51
48
|
after 'deploy:setup' do
|
52
49
|
nginx.setup if Capistrano::CLI.ui.agree("Create nginx configuration file? [Yn]")
|
53
|
-
end if is_using_nginx
|
54
|
-
|
50
|
+
end if is_using_nginx
|
55
51
|
end
|
56
52
|
|
data/lib/recipes/passenger.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
Capistrano::Configuration.instance
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
2
|
namespace :passenger do
|
3
|
-
desc "Restart Rails app running under Phusion Passenger by touching restart.txt"
|
3
|
+
desc "|DarkRecipes| Restart Rails app running under Phusion Passenger by touching restart.txt"
|
4
4
|
task :bounce, :roles => :app do
|
5
5
|
run "#{sudo} touch #{current_path}/tmp/restart.txt"
|
6
6
|
end
|
7
7
|
|
8
|
-
desc "Inspect Phusion Passenger's memory usage.
|
8
|
+
desc "|DarkRecipes| Inspect Phusion Passenger's memory usage."
|
9
9
|
task :memory, :roles => :app do
|
10
|
-
run "
|
10
|
+
run "sudo passenger-memory-stats"
|
11
11
|
end
|
12
12
|
|
13
|
-
desc "Inspect Phusion Passenger's internal status.
|
13
|
+
desc "|DarkRecipes| Inspect Phusion Passenger's internal status."
|
14
14
|
task :status, :roles => :app do
|
15
|
-
run "
|
15
|
+
run "sudo passenger-status"
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
namespace :resque do
|
3
|
+
namespace :worker do
|
4
|
+
desc "|DarkRecipes| List all workers"
|
5
|
+
task :list, :roles => :app do
|
6
|
+
run "cd #{current_path} && #{sudo} resque list"
|
7
|
+
end
|
8
|
+
|
9
|
+
desc "|DarkRecipes| Starts the workers"
|
10
|
+
task :start, :roles => :app do
|
11
|
+
run "cd #{current_path} && #{sudo} god start #{resque_service}"
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "|DarkRecipes| Stops the workers"
|
15
|
+
task :stop, :roles => :app do
|
16
|
+
run "cd #{current_path} && #{sudo} god stop #{resque_service}"
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "|DarkRecipes| Restart all workers"
|
20
|
+
task :restart, :roles => :app do
|
21
|
+
run "cd #{current_path} && #{sudo} god restart #{resque_service}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
namespace :web do
|
26
|
+
desc "|DarkRecipes| Starts the resque web interface"
|
27
|
+
task :start, :roles => :app do
|
28
|
+
run "cd #{current_path}; resque-web -p 9000 -e #{rails_env} "
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "|DarkRecipes| Stops the resque web interface"
|
32
|
+
task :stop, :roles => :app do
|
33
|
+
run "cd #{current_path}; resque-web -K"
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "|DarkRecipes| Restarts the resque web interface "
|
37
|
+
task :restart, :roles => :app do
|
38
|
+
stop
|
39
|
+
start
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "|DarkRecipes| Shows the status of the resque web interface"
|
43
|
+
task :status, :roles => :app do
|
44
|
+
run "cd #{current_path}; resque-web -S"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
namespace :sphinx do
|
3
|
+
desc "|DarkRecipes| Generates Configuration file for TS"
|
4
|
+
task :config, :roles => :app do
|
5
|
+
run "cd #{current_path}; #{rake_bin} RAILS_ENV=#{rails_env} ts:config"
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "|DarkRecipes| Starts TS"
|
9
|
+
task :start, :roles => :app do
|
10
|
+
run "cd #{current_path}; #{rake_bin} RAILS_ENV=#{rails_env} ts:start"
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "|DarkRecipes| Stops TS"
|
14
|
+
task :stop, :roles => :app do
|
15
|
+
run "cd #{current_path}; #{rake_bin} RAILS_ENV=#{rails_env} ts:stop"
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "|DarkRecipes| Rebuild TS"
|
19
|
+
task :rebuild, :roles => :app do
|
20
|
+
run "cd #{current_path}; #{rake_bin} RAILS_ENV=#{rails_env} ts:rebuild"
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "|DarkRecipes| Indexes TS"
|
24
|
+
task :index, :roles => :app do
|
25
|
+
run "cd #{current_path}; #{rake_bin} RAILS_ENV=#{rails_env} ts:in"
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "|DarkRecipes| Re-establishes symlinks"
|
29
|
+
task :symlinks do
|
30
|
+
run <<-CMD
|
31
|
+
rm -rf #{current_path}/db/sphinx && ln -nfs #{shared_path}/db/sphinx #{current_path}/db/sphinx
|
32
|
+
CMD
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
after "deploy:migrate" do
|
37
|
+
sphinx.rebuild
|
38
|
+
end unless is_app_monitored?
|
39
|
+
end
|
data/lib/recipes/symlinks.rb
CHANGED
@@ -1,19 +1,13 @@
|
|
1
|
-
Capistrano::Configuration.instance
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
2
|
# These are set to the same structure in shared <=> current
|
3
|
-
set :normal_symlinks, %w(
|
4
|
-
tmp
|
5
|
-
log
|
6
|
-
config/database.yml
|
7
|
-
) unless exists?(:normal_symlinks)
|
3
|
+
set :normal_symlinks, %w(tmp log config/database.yml) unless exists?(:normal_symlinks)
|
8
4
|
|
9
5
|
# Weird symlinks go somewhere else. Weird.
|
10
|
-
set :weird_symlinks, {
|
11
|
-
|
12
|
-
'pids' => 'tmp/pids'
|
13
|
-
} unless exists?(:weird_symlinks)
|
6
|
+
set :weird_symlinks, { 'bundle' => 'vendor/bundle',
|
7
|
+
'pids' => 'tmp/pids' } unless exists?(:weird_symlinks)
|
14
8
|
|
15
9
|
namespace :symlinks do
|
16
|
-
desc "Make all the
|
10
|
+
desc "|DarkRecipes| Make all the symlinks in a single run"
|
17
11
|
task :make, :roles => :app, :except => { :no_release => true } do
|
18
12
|
commands = normal_symlinks.map do |path|
|
19
13
|
"rm -rf #{current_path}/#{path} && \
|
@@ -25,12 +19,9 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
25
19
|
ln -s #{shared_path}/#{from} #{current_path}/#{to}"
|
26
20
|
end
|
27
21
|
|
28
|
-
|
29
22
|
run <<-CMD
|
30
|
-
cd #{current_path} &&
|
31
|
-
#{commands.join(" && ")}
|
23
|
+
cd #{current_path} && #{commands.join(" && ")}
|
32
24
|
CMD
|
33
25
|
end
|
34
26
|
end
|
35
|
-
|
36
27
|
end
|
data/lib/recipes/unicorn.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Capistrano::Configuration.instance
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
2
|
# Number of workers (Rule of thumb is 2 per CPU)
|
3
3
|
# Just be aware that every worker needs to cache all classes and thus eat some
|
4
4
|
# of your RAM.
|
@@ -15,15 +15,12 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
15
15
|
|
16
16
|
# The wrapped bin to start unicorn
|
17
17
|
# This is necessary if you're using rvm
|
18
|
-
set :unicorn_bin, '
|
19
|
-
|
20
|
-
|
18
|
+
set :unicorn_bin, 'bundle exec unicorn' unless exists?(:unicorn_bin)
|
21
19
|
set :unicorn_socket, File.join(sockets_path,'unicorn.sock') unless exists?(:unicorn_socket)
|
22
20
|
|
23
21
|
# Defines where the unicorn pid will live.
|
24
22
|
set(:unicorn_pid) { File.join(pids_path, "unicorn.pid") } unless exists?(:unicorn_pid)
|
25
23
|
|
26
|
-
|
27
24
|
# Our unicorn template to be parsed by erb
|
28
25
|
# You may need to generate this file the first time with the generator
|
29
26
|
# included in the gem
|
@@ -47,30 +44,34 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
47
44
|
# Unicorn
|
48
45
|
#------------------------------------------------------------------------------
|
49
46
|
namespace :unicorn do
|
50
|
-
desc "Starts unicorn directly"
|
47
|
+
desc "|DarkRecipes| Starts unicorn directly"
|
51
48
|
task :start, :roles => :app do
|
52
49
|
run unicorn_start_cmd
|
53
50
|
end
|
54
51
|
|
55
|
-
desc "Stops unicorn directly"
|
52
|
+
desc "|DarkRecipes| Stops unicorn directly"
|
56
53
|
task :stop, :roles => :app do
|
57
54
|
run unicorn_stop_cmd
|
58
55
|
end
|
59
56
|
|
60
|
-
desc "Restarts unicorn directly"
|
57
|
+
desc "||DarkRecipes|| Restarts unicorn directly"
|
61
58
|
task :restart, :roles => :app do
|
62
59
|
run unicorn_restart_cmd
|
63
60
|
end
|
64
61
|
|
65
62
|
desc <<-EOF
|
66
|
-
Parses the configuration file through ERB to fetch our variables and \
|
63
|
+
|DarkRecipes| Parses the configuration file through ERB to fetch our variables and \
|
67
64
|
uploads the result to #{unicorn_remote_config}, to be loaded by whoever is booting \
|
68
65
|
up the unicorn.
|
69
66
|
EOF
|
70
67
|
task :setup, :roles => :app , :except => { :no_release => true } do
|
71
68
|
# TODO: refactor this to a more generic setup task once we have more socket tasks.
|
72
|
-
|
73
|
-
|
69
|
+
commands = []
|
70
|
+
commands << "mkdir -p #{sockets_path}"
|
71
|
+
commands << "chown #{user}:#{group} #{sockets_path} -R"
|
72
|
+
commands << "chmod +rw #{sockets_path}"
|
73
|
+
|
74
|
+
run commands.join(" && ")
|
74
75
|
generate_config(unicorn_local_config,unicorn_remote_config)
|
75
76
|
end
|
76
77
|
end
|
@@ -78,6 +79,4 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
78
79
|
after 'deploy:setup' do
|
79
80
|
unicorn.setup if Capistrano::CLI.ui.agree("Create unicorn configuration file? [Yn]")
|
80
81
|
end if is_using_unicorn
|
81
|
-
|
82
82
|
end
|
83
|
-
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dark-capistrano-recipes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 3
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 7
|
9
|
+
- 0
|
10
|
+
version: 0.7.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Phil Misiowiec
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date:
|
19
|
+
date: 2011-02-10 00:00:00 -02:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- lib/capistrano_recipes.rb
|
77
77
|
- lib/helpers.rb
|
78
78
|
- lib/recipes/application.rb
|
79
|
+
- lib/recipes/bluepill.rb
|
79
80
|
- lib/recipes/bundler.rb
|
80
81
|
- lib/recipes/db.rb
|
81
82
|
- lib/recipes/deploy.rb
|
@@ -84,7 +85,8 @@ files:
|
|
84
85
|
- lib/recipes/log.rb
|
85
86
|
- lib/recipes/nginx.rb
|
86
87
|
- lib/recipes/passenger.rb
|
87
|
-
- lib/recipes/
|
88
|
+
- lib/recipes/resque.rb
|
89
|
+
- lib/recipes/sphinx.rb
|
88
90
|
- lib/recipes/symlinks.rb
|
89
91
|
- lib/recipes/unicorn.rb
|
90
92
|
has_rdoc: true
|
@@ -117,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
119
|
requirements: []
|
118
120
|
|
119
121
|
rubyforge_project:
|
120
|
-
rubygems_version: 1.
|
122
|
+
rubygems_version: 1.5.0
|
121
123
|
signing_key:
|
122
124
|
specification_version: 3
|
123
125
|
summary: Darkside's Capistrano recipes
|
data/lib/recipes/rvm.rb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
# RVM jazz
|
2
|
-
#------------------------------------------------------------------------------
|
3
|
-
Capistrano::Configuration.instance(:must_exist).load do
|
4
|
-
if defined?(using_rvm) && using_rvm
|
5
|
-
# Add RVM's lib directory to the load path.
|
6
|
-
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
|
7
|
-
|
8
|
-
# Load RVM's capistrano plugin.
|
9
|
-
require "rvm/capistrano"
|
10
|
-
end
|
11
|
-
end
|