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,15 @@
|
|
1
|
+
# Common hooks for all scenarios.
|
2
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
3
|
+
after 'deploy:setup' do
|
4
|
+
app.setup
|
5
|
+
bundler.setup
|
6
|
+
end
|
7
|
+
|
8
|
+
after "deploy:update_code" do
|
9
|
+
symlinks.make
|
10
|
+
bundler.install
|
11
|
+
deploy.cleanup
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
|
data/lib/recipes/log.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
namespace :log do
|
3
|
+
desc "Tail all application log files"
|
4
|
+
task :tail, :roles => :app do
|
5
|
+
run "tail -f #{shared_path}/log/*.log" do |channel, stream, data|
|
6
|
+
puts "#{channel[:host]}: #{data}"
|
7
|
+
break if stream == :err
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
desc <<-DESC
|
12
|
+
Install log rotation script; optional args: days=7, size=5M, group (defaults to same value as :user)
|
13
|
+
DESC
|
14
|
+
task :rotate, :roles => :app do
|
15
|
+
rotate_script = %Q{#{shared_path}/log/#{environment}.log {
|
16
|
+
daily
|
17
|
+
rotate #{ENV['days'] || 7}
|
18
|
+
size #{ENV['size'] || "5M"}
|
19
|
+
compress
|
20
|
+
create 640 #{user} #{ENV['group'] || user}
|
21
|
+
missingok
|
22
|
+
}}
|
23
|
+
put rotate_script, "#{shared_path}/logrotate_script"
|
24
|
+
"#{sudo} cp #{shared_path}/logrotate_script /etc/logrotate.d/#{application}"
|
25
|
+
run "rm #{shared_path}/logrotate_script"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
# Where your nginx lives. Usually /opt/nginx or /usr/local/nginx for source
|
4
|
+
# compiled.
|
5
|
+
set :nginx_path_prefix, "/opt/nginx" unless exists?(:nginx_path_prefix)
|
6
|
+
|
7
|
+
# Path to the nginx erb template to be parsed before uploading to remote
|
8
|
+
set(:nginx_local_config) { "#{templates_path}/nginx.conf.erb" } unless exists?(:nginx_local_config)
|
9
|
+
|
10
|
+
# Path to where your remote config will reside (I use a directory sites inside conf)
|
11
|
+
set(:nginx_remote_config) do
|
12
|
+
"#{nginx_path_prefix}/conf/sites/#{application}.conf"
|
13
|
+
end unless exists?(:nginx_remote_config)
|
14
|
+
|
15
|
+
# Nginx tasks are not *nix agnostic, they assume you're using Debian/Ubuntu.
|
16
|
+
# Override them as needed.
|
17
|
+
namespace :nginx do
|
18
|
+
|
19
|
+
desc "Parses and uploads nginx configuration for this app."
|
20
|
+
task :setup do
|
21
|
+
generate_config(nginx_local_config, nginx_remote_config)
|
22
|
+
end
|
23
|
+
|
24
|
+
# [internal] Parses config file and outputs it to STDOUT
|
25
|
+
task :parse do
|
26
|
+
puts parse_config(nginx_local_config)
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "Restart nginx"
|
30
|
+
task :restart do
|
31
|
+
sudo "service nginx restart"
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "Stop nginx"
|
35
|
+
task :stop do
|
36
|
+
sudo "service nginx stop"
|
37
|
+
end
|
38
|
+
|
39
|
+
desc "Start nginx"
|
40
|
+
task :start do
|
41
|
+
sudo "service nginx start"
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "Show nginx status"
|
45
|
+
task :status do
|
46
|
+
sudo "service nginx status"
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
after 'deploy:setup', 'nginx:setup' if is_using_nginx
|
52
|
+
|
53
|
+
end
|
54
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
namespace :passenger do
|
3
|
+
desc "Restart Rails app running under Phusion Passenger by touching restart.txt"
|
4
|
+
task :bounce, :roles => :app do
|
5
|
+
run "#{sudo} touch #{current_path}/tmp/restart.txt"
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "Inspect Phusion Passenger's memory usage. Assumes binaries are located in /opt/ruby-enterprise."
|
9
|
+
task :memory, :roles => :app do
|
10
|
+
run "#{sudo} /opt/ruby-enterprise/bin/passenger-memory-stats"
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Inspect Phusion Passenger's internal status. Assumes binaries are located in /opt/ruby-enterprise."
|
14
|
+
task :status, :roles => :app do
|
15
|
+
run "#{sudo} /opt/ruby-enterprise/bin/passenger-status"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/recipes/rvm.rb
ADDED
@@ -0,0 +1,11 @@
|
|
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
|
@@ -0,0 +1,33 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
# These are set to the same structure in shared <=> current
|
3
|
+
set :normal_symlinks, %w(
|
4
|
+
config/database.yml
|
5
|
+
) unless exists?(:normal_symlinks)
|
6
|
+
|
7
|
+
# Weird symlinks go somewhere else. Weird.
|
8
|
+
set :weird_symlinks, {
|
9
|
+
'bundle' => 'vendor/bundle'
|
10
|
+
} unless exists?(:weird_symlinks)
|
11
|
+
|
12
|
+
namespace :symlinks do
|
13
|
+
desc "Make all the damn symlinks in a single run"
|
14
|
+
task :make, :roles => :app, :except => { :no_release => true } do
|
15
|
+
commands = normal_symlinks.map do |path|
|
16
|
+
"rm -rf #{current_path}/#{path} && \
|
17
|
+
ln -s #{shared_path}/#{path} #{current_path}/#{path}"
|
18
|
+
end
|
19
|
+
|
20
|
+
commands += weird_symlinks.map do |from, to|
|
21
|
+
"rm -rf #{current_path}/#{to} && \
|
22
|
+
ln -s #{shared_path}/#{from} #{current_path}/#{to}"
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
run <<-CMD
|
27
|
+
cd #{current_path} &&
|
28
|
+
#{commands.join(" && ")}
|
29
|
+
CMD
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
# Number of workers (Rule of thumb is 2 per CPU)
|
3
|
+
# Just be aware that every worker needs to cache all classes and thus eat some
|
4
|
+
# of your RAM.
|
5
|
+
set :unicorn_workers, 8 unless exists?(:unicorn_workers)
|
6
|
+
|
7
|
+
# Workers timeout in the amount of seconds below, when the master kills it and
|
8
|
+
# forks another one.
|
9
|
+
set :unicorn_workers_timeout, 30 unless exists?(:unicorn_workers_timeout)
|
10
|
+
|
11
|
+
# Workers are started with this user/group
|
12
|
+
# By default we get the user/group set in capistrano.
|
13
|
+
set(:unicorn_user) { user } unless exists?(:unicorn_user)
|
14
|
+
set(:unicorn_group) { group } unless exists?(:unicorn_group)
|
15
|
+
|
16
|
+
# The wrapped bin to start unicorn
|
17
|
+
# This is necessary if you're using rvm
|
18
|
+
set :unicorn_bin, 'unicorn_rails' unless exists?(:unicorn_bin)
|
19
|
+
|
20
|
+
|
21
|
+
set :unicorn_socket, File.join(sockets_path,'unicorn.sock') unless exists?(:unicorn_socket)
|
22
|
+
|
23
|
+
# Defines where the unicorn pid will live.
|
24
|
+
set(:unicorn_pid) { File.join(pids_path, "unicorn.pid") } unless exists?(:unicorn_pid)
|
25
|
+
|
26
|
+
|
27
|
+
# Our unicorn template to be parsed by erb
|
28
|
+
# You may need to generate this file the first time with the generator
|
29
|
+
# included in the gem
|
30
|
+
set(:unicorn_local_config) { File.join(templates_path, "unicorn.rb.erb") }
|
31
|
+
|
32
|
+
# The remote location of unicorn's config file. Used by god to fire it up
|
33
|
+
set(:unicorn_remote_config) { "#{shared_path}/config/unicorn.rb" }
|
34
|
+
|
35
|
+
def unicorn_start_cmd
|
36
|
+
"cd #{current_path} && #{unicorn_bin} -c #{unicorn_remote_config} -E #{rails_env} -D"
|
37
|
+
end
|
38
|
+
|
39
|
+
def unicorn_stop_cmd
|
40
|
+
"kill -QUIT `cat #{unicorn_pid}`"
|
41
|
+
end
|
42
|
+
|
43
|
+
def unicorn_restart_cmd
|
44
|
+
"kill -USR2 `cat #{unicorn_pid}`"
|
45
|
+
end
|
46
|
+
|
47
|
+
# Unicorn
|
48
|
+
#------------------------------------------------------------------------------
|
49
|
+
namespace :unicorn do
|
50
|
+
desc "Start unicorn"
|
51
|
+
task :start, :roles => :app do
|
52
|
+
run unicorn_start_cmd
|
53
|
+
end
|
54
|
+
|
55
|
+
desc "Stop unicorn"
|
56
|
+
task :stop, :roles => :app do
|
57
|
+
run unicorn_stop_cmd
|
58
|
+
end
|
59
|
+
|
60
|
+
desc "Restart unicorn"
|
61
|
+
task :restart, :roles => :app do
|
62
|
+
run unicorn_restart_cmd do |ch, stream, out|
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
desc <<-EOF
|
68
|
+
Parses the configuration file through ERB to fetch our variables and \
|
69
|
+
uploads the result to #{unicorn_remote_config}, to be loaded by whoever is booting \
|
70
|
+
up the unicorn.
|
71
|
+
EOF
|
72
|
+
task :setup do
|
73
|
+
# TODO: refactor this to a more generic setup task once we have more socket tasks.
|
74
|
+
sudo "mkdir -p #{sockets_path}"
|
75
|
+
sudo "chown #{user}:#{group} #{sockets_path} -R"
|
76
|
+
generate_config(unicorn_local_config,unicorn_remote_config)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
after 'deploy:setup', 'unicorn:setup' if is_using_unicorn
|
81
|
+
|
82
|
+
end
|
83
|
+
|
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dark-capistrano-recipes
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 15
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 6
|
9
|
+
- 4
|
10
|
+
version: 0.6.4
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Phil Misiowiec
|
14
|
+
- Leonardo Bighetti
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2010-09-20 00:00:00 -03:00
|
20
|
+
default_executable:
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
name: capistrano
|
24
|
+
prerelease: false
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 9
|
31
|
+
segments:
|
32
|
+
- 2
|
33
|
+
- 5
|
34
|
+
- 9
|
35
|
+
version: 2.5.9
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id001
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: capistrano-ext
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
hash: 29
|
47
|
+
segments:
|
48
|
+
- 1
|
49
|
+
- 2
|
50
|
+
- 1
|
51
|
+
version: 1.2.1
|
52
|
+
type: :runtime
|
53
|
+
version_requirements: *id002
|
54
|
+
description: Extend the Capistrano gem with these useful recipes
|
55
|
+
email: leonardobighetti@gmail.com
|
56
|
+
executables: []
|
57
|
+
|
58
|
+
extensions: []
|
59
|
+
|
60
|
+
extra_rdoc_files:
|
61
|
+
- LICENSE
|
62
|
+
- README.rdoc
|
63
|
+
files:
|
64
|
+
- .gitignore
|
65
|
+
- LICENSE
|
66
|
+
- README.rdoc
|
67
|
+
- Rakefile
|
68
|
+
- VERSION.yml
|
69
|
+
- dark-capistrano-recipes.gemspec
|
70
|
+
- doc/god/god
|
71
|
+
- doc/god/god.conf
|
72
|
+
- doc/god/god.init
|
73
|
+
- generators/app.god.erb
|
74
|
+
- generators/nginx.conf.erb
|
75
|
+
- generators/unicorn.rb.erb
|
76
|
+
- lib/capistrano_recipes.rb
|
77
|
+
- lib/helpers.rb
|
78
|
+
- lib/recipes/application.rb
|
79
|
+
- lib/recipes/bundler.rb
|
80
|
+
- lib/recipes/db.rb
|
81
|
+
- lib/recipes/deploy.rb
|
82
|
+
- lib/recipes/god.rb
|
83
|
+
- lib/recipes/hooks.rb
|
84
|
+
- lib/recipes/log.rb
|
85
|
+
- lib/recipes/nginx.rb
|
86
|
+
- lib/recipes/passenger.rb
|
87
|
+
- lib/recipes/rvm.rb
|
88
|
+
- lib/recipes/symlinks.rb
|
89
|
+
- lib/recipes/unicorn.rb
|
90
|
+
has_rdoc: true
|
91
|
+
homepage: http://github.com/darkside/capistrano-recipes
|
92
|
+
licenses: []
|
93
|
+
|
94
|
+
post_install_message:
|
95
|
+
rdoc_options:
|
96
|
+
- --charset=UTF-8
|
97
|
+
require_paths:
|
98
|
+
- lib
|
99
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
100
|
+
none: false
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
hash: 3
|
105
|
+
segments:
|
106
|
+
- 0
|
107
|
+
version: "0"
|
108
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
|
+
none: false
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
hash: 3
|
114
|
+
segments:
|
115
|
+
- 0
|
116
|
+
version: "0"
|
117
|
+
requirements: []
|
118
|
+
|
119
|
+
rubyforge_project:
|
120
|
+
rubygems_version: 1.3.7
|
121
|
+
signing_key:
|
122
|
+
specification_version: 3
|
123
|
+
summary: Darkside's Capistrano recipes
|
124
|
+
test_files: []
|
125
|
+
|