winton-cookbook 1.0.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/MIT-LICENSE +20 -0
- data/README.markdown +134 -0
- data/config/debian/bash_profile.erb +9 -0
- data/config/debian/iptables.rules.erb +47 -0
- data/config/debian/locale.gen.erb +1 -0
- data/config/debian/sshd_config.erb +78 -0
- data/config/log/rotate.conf.erb +9 -0
- data/config/mongrel/mongrel.yml.erb +10 -0
- data/config/mongrel/nginx.vhost.erb +177 -0
- data/config/monit/mongrel.erb +12 -0
- data/config/monit/monit.erb +11 -0
- data/config/monit/monitrc.erb +32 -0
- data/config/monit/nginx.vhost.erb +26 -0
- data/config/mysql/my.cnf.erb +137 -0
- data/config/nginx/nginx.conf.erb +30 -0
- data/config/nginx/nginx.erb +57 -0
- data/config/php/init-fastcgi.erb +26 -0
- data/config/php/nginx.vhost.erb +27 -0
- data/config/php/php-fastcgi.erb +2 -0
- data/config/rails/database.yml.erb +13 -0
- data/cookbook.rb +66 -0
- data/cookbook_helpers.rb +119 -0
- data/deploy.rb.example +45 -0
- data/recipes/debian.rb +200 -0
- data/recipes/deploy.rb +50 -0
- data/recipes/gems.rb +77 -0
- data/recipes/log.rb +47 -0
- data/recipes/mongrel.rb +48 -0
- data/recipes/monit.rb +47 -0
- data/recipes/mysql.rb +106 -0
- data/recipes/nginx.rb +79 -0
- data/recipes/php.rb +17 -0
- data/recipes/rails.rb +65 -0
- data/recipes/ssh.rb +64 -0
- data/recipes/stage.rb +34 -0
- metadata +95 -0
data/recipes/debian.rb
ADDED
@@ -0,0 +1,200 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
namespace :debian do
|
4
|
+
desc "Configure and install a fresh Debian server"
|
5
|
+
task :default do
|
6
|
+
if yes("Have you created the user defined in config/deploy.rb? (See vendor/plugins/cookbook/README)")
|
7
|
+
debian.aptitude.default
|
8
|
+
debian.config.default
|
9
|
+
debian.install.default
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
namespace :aptitude do
|
14
|
+
desc 'Run all tasks'
|
15
|
+
task :default do
|
16
|
+
aptitude.update
|
17
|
+
aptitude.upgrade
|
18
|
+
aptitude.essential
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'Aptitude update'
|
22
|
+
task :update do
|
23
|
+
sudo_puts 'aptitude update -q -y'
|
24
|
+
end
|
25
|
+
|
26
|
+
desc 'Aptitude upgrade'
|
27
|
+
task :upgrade do
|
28
|
+
sudo_puts 'aptitude upgrade -q -y'
|
29
|
+
end
|
30
|
+
|
31
|
+
desc 'Aptitude install build-essential'
|
32
|
+
task :essential do
|
33
|
+
sudo_puts 'aptitude install build-essential -q -y'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
namespace :config do
|
38
|
+
desc 'Run all tasks'
|
39
|
+
task :default do
|
40
|
+
debian.config.sshd_config
|
41
|
+
debian.config.iptables
|
42
|
+
debian.config.locales
|
43
|
+
debian.config.bash_profile
|
44
|
+
end
|
45
|
+
|
46
|
+
desc "Uploads the bash_profile file in config/cookbook"
|
47
|
+
task :bash_profile do
|
48
|
+
question = [
|
49
|
+
"This task uploads the bash_profile file in config/cookbook.",
|
50
|
+
"OK?"
|
51
|
+
]
|
52
|
+
if yes(question)
|
53
|
+
usr = ask "Update bash_profile for which user? (default: #{user})", user
|
54
|
+
upload_from_erb "/home/#{usr}/.bash_profile", binding, :chown => usr, :folder => 'debian'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
desc "Updates server iptables from the file in config/cookbook"
|
59
|
+
task :iptables do
|
60
|
+
question = [
|
61
|
+
"This task updates your server's iptables with the file in config/cookbook.",
|
62
|
+
"OK?"
|
63
|
+
]
|
64
|
+
if yes(question)
|
65
|
+
upload_from_erb '/etc/iptables.rules', binding, :folder => 'debian'
|
66
|
+
sudo_each [
|
67
|
+
'iptables-restore < /etc/iptables.rules',
|
68
|
+
'rm /etc/iptables.rules'
|
69
|
+
]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
desc "Updates server locales from the file in config/cookbook"
|
74
|
+
task :locales do
|
75
|
+
question = [
|
76
|
+
"This task updates the server's locales from the file in config/cookbook.",
|
77
|
+
"OK?"
|
78
|
+
]
|
79
|
+
if yes(question)
|
80
|
+
upload_from_erb '/etc/locale.gen', binding, :chown => 'root', :chmod => '0644', :folder => 'debian'
|
81
|
+
sudo '/usr/sbin/locale-gen'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
desc "Updates sshd_config from the file in config/cookbook"
|
86
|
+
task :sshd_config do
|
87
|
+
question = [
|
88
|
+
"This task updates your server's sshd_config with the file in config/cookbook.",
|
89
|
+
"This task assumes your server's current ssh port is 22.",
|
90
|
+
"This task will change your ssh port to the one in config/deploy.rb.",
|
91
|
+
"OK?"
|
92
|
+
]
|
93
|
+
if yes(question)
|
94
|
+
set :port, 22 # Comment out for testing
|
95
|
+
upload_from_erb '/etc/ssh/sshd_config', binding, :chown => 'root', :chmod => '0644', :folder => 'debian'
|
96
|
+
sudo '/etc/init.d/ssh reload'
|
97
|
+
set :port, ssh_port
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
namespace :install do
|
103
|
+
desc 'Run all tasks'
|
104
|
+
task :default do
|
105
|
+
debian.install.git
|
106
|
+
debian.install.lighttpd
|
107
|
+
debian.install.mysql
|
108
|
+
debian.install.nginx
|
109
|
+
debian.install.php
|
110
|
+
debian.install.ruby
|
111
|
+
debian.install.rubygems
|
112
|
+
debian.install.sphinx
|
113
|
+
debian.install.monit
|
114
|
+
end
|
115
|
+
|
116
|
+
desc "Install Git"
|
117
|
+
task :git, :roles => :app do
|
118
|
+
install_source(:git) do |path|
|
119
|
+
sudo_puts [
|
120
|
+
"aptitude install tcl8.4 tk8.4 gettext -q -y",
|
121
|
+
"cd #{path} && ./configure && make && sudo make install"
|
122
|
+
]
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
desc "Install Lighttpd" # Lighttpd install is purely for spawn-fcgi
|
127
|
+
task :lighttpd, :roles => :app do
|
128
|
+
sudo_puts 'aptitude install libpcre3-dev libbz2-dev -q -y'
|
129
|
+
install_source(:lighttpd) do |path|
|
130
|
+
sudo_puts "cd #{path} && ./configure && make && sudo make install"
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
desc 'Install Monit'
|
135
|
+
task :monit, :roles => :db do
|
136
|
+
sudo_puts 'aptitude install monit -q -y'
|
137
|
+
monit.config.default
|
138
|
+
end
|
139
|
+
|
140
|
+
desc 'Install MySQL'
|
141
|
+
task :mysql, :roles => :db do
|
142
|
+
sudo_puts 'aptitude install mysql-server mysql-client libmysqlclient15-dev libmysql-ruby -q -y'
|
143
|
+
ROOT.mysql.config
|
144
|
+
puts [
|
145
|
+
'',
|
146
|
+
"It is highly recommended you run mysql_secure_installation manually.",
|
147
|
+
"See http://dev.mysql.com/doc/refman/5.1/en/mysql-secure-installation.html",
|
148
|
+
''
|
149
|
+
].join("\n")
|
150
|
+
ROOT.mysql.create.user
|
151
|
+
end
|
152
|
+
|
153
|
+
desc 'Install Nginx'
|
154
|
+
task :nginx, :roles => :app do
|
155
|
+
# apache2-utils for htpasswd, rest for nginx build
|
156
|
+
sudo_puts 'aptitude install apache2-utils libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev -q -y'
|
157
|
+
install_source(:nginx) do |path|
|
158
|
+
sudo_puts "cd #{path} && ./configure --sbin-path=/usr/local/sbin --with-http_ssl_module && make && sudo make install"
|
159
|
+
end
|
160
|
+
upload_from_erb '/etc/init.d/nginx', binding, :chown => 'root', :chmod => '+x', :folder => 'nginx'
|
161
|
+
sudo '/usr/sbin/update-rc.d -f nginx defaults'
|
162
|
+
ROOT.nginx.config.run_once.default
|
163
|
+
end
|
164
|
+
|
165
|
+
desc "Install PHP"
|
166
|
+
task :php, :roles => :app do
|
167
|
+
sudo_puts 'aptitude install php5-cli php5-cgi php5-mysql php5-xcache -q -y'
|
168
|
+
upload_from_erb [
|
169
|
+
'/usr/local/bin/php-fastcgi',
|
170
|
+
'/etc/init.d/init-fastcgi'
|
171
|
+
], binding, :chown => 'root', :chmod => '+x', :folder => 'php'
|
172
|
+
sudo '/usr/sbin/update-rc.d -f init-fastcgi defaults'
|
173
|
+
end
|
174
|
+
|
175
|
+
desc 'Install Ruby'
|
176
|
+
task :ruby, :roles => :app do
|
177
|
+
install_source(:ruby) do |path|
|
178
|
+
sudo_puts "cd #{path} && ./configure && make && sudo make install"
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
desc 'Install RubyGems'
|
183
|
+
task :rubygems, :roles => :app do
|
184
|
+
install_source(:rubygems) do |path|
|
185
|
+
sudo_puts "cd #{path} && ruby setup.rb"
|
186
|
+
end
|
187
|
+
gems.update
|
188
|
+
gems.install
|
189
|
+
end
|
190
|
+
|
191
|
+
desc 'Install Sphinx'
|
192
|
+
task :sphinx, :roles => :app do
|
193
|
+
install_source(:sphinx) do |path|
|
194
|
+
sudo_puts "cd #{path} && ./configure && make && sudo make install"
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
data/recipes/deploy.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
namespace :deploy do
|
4
|
+
desc "Restart mongrel cluster"
|
5
|
+
task :restart, :roles => :app, :except => { :no_release => true } do
|
6
|
+
mongrel.restart if platform == :rails
|
7
|
+
end
|
8
|
+
|
9
|
+
desc "Start mongrel cluster"
|
10
|
+
task :start, :roles => :app do
|
11
|
+
mongrel.start if platform == :rails
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Stop mongrel cluster"
|
15
|
+
task :stop, :roles => :app do
|
16
|
+
mongrel.stop if platform == :rails
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "Deploy a fresh app"
|
20
|
+
task :create, :roles => :app do
|
21
|
+
mysql.create.db
|
22
|
+
sudo_each [
|
23
|
+
"mkdir -p #{base_dir}",
|
24
|
+
"chown -R #{user}:#{user} #{base_dir}"
|
25
|
+
]
|
26
|
+
deploy.setup
|
27
|
+
if platform == :rails
|
28
|
+
mongrel.config.default
|
29
|
+
nginx.config.default
|
30
|
+
rails.config.default
|
31
|
+
deploy.cold
|
32
|
+
elsif platform == :php
|
33
|
+
php.config.default
|
34
|
+
deploy.default
|
35
|
+
end
|
36
|
+
nginx.restart
|
37
|
+
end
|
38
|
+
|
39
|
+
desc "Stop servers and destroy all files"
|
40
|
+
task :destroy, :roles => :app do
|
41
|
+
deploy.stop
|
42
|
+
mongrel.config.destroy if platform == :rails
|
43
|
+
sudo "rm -Rf #{deploy_to}"
|
44
|
+
nginx.config.destroy
|
45
|
+
nginx.restart
|
46
|
+
mysql.destroy.db
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/recipes/gems.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
namespace :gems do
|
4
|
+
desc "List gems on remote server"
|
5
|
+
task :list, :roles => :app do
|
6
|
+
run_puts "gem list"
|
7
|
+
end
|
8
|
+
|
9
|
+
desc "Update gems on remote server"
|
10
|
+
task :update, :roles => :app do
|
11
|
+
sudo_each [
|
12
|
+
"gem update --system",
|
13
|
+
"gem update"
|
14
|
+
]
|
15
|
+
end
|
16
|
+
|
17
|
+
namespace :install do
|
18
|
+
desc 'Install all standard gems'
|
19
|
+
task :default, :roles => :app do
|
20
|
+
gems.install.haml
|
21
|
+
gems.install.hpricot
|
22
|
+
gems.install.mime_types
|
23
|
+
gems.install.mongrel
|
24
|
+
gems.install.rails
|
25
|
+
end
|
26
|
+
|
27
|
+
desc 'Install Chronic'
|
28
|
+
task :chronic, :roles => :app do
|
29
|
+
gem_install :chronic
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'Install gchart'
|
33
|
+
task :gchart, :roles => :app do
|
34
|
+
gem_install :googlecharts
|
35
|
+
end
|
36
|
+
|
37
|
+
desc 'Install HAML'
|
38
|
+
task :haml, :roles => :app do
|
39
|
+
gem_install :haml, '--no-ri'
|
40
|
+
end
|
41
|
+
|
42
|
+
desc 'Install Hpricot'
|
43
|
+
task :hpricot, :roles => :app do
|
44
|
+
gem_install :hpricot
|
45
|
+
end
|
46
|
+
|
47
|
+
desc 'Install Json'
|
48
|
+
task :json, :roles => :app do
|
49
|
+
gem_install :json
|
50
|
+
end
|
51
|
+
|
52
|
+
desc 'Install Mime-types'
|
53
|
+
task :mime_types, :roles => :app do
|
54
|
+
gem_install 'mime-types'
|
55
|
+
end
|
56
|
+
|
57
|
+
desc 'Install Mongrel'
|
58
|
+
task :mongrel, :roles => :app do
|
59
|
+
gem_install :mongrel
|
60
|
+
gem_install :mongrel_cluster
|
61
|
+
mongrel.config.survive_reboot
|
62
|
+
end
|
63
|
+
|
64
|
+
desc 'Install Rails'
|
65
|
+
task :rails, :roles => :app do
|
66
|
+
gem_install :rails
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
desc "Uninstall a remote gem"
|
71
|
+
task :uninstall, :roles => :app do
|
72
|
+
gem_name = ask 'Enter the name of the gem to remove:'
|
73
|
+
sudo "gem uninstall #{gem_name}"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
data/recipes/log.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
namespace :log do
|
4
|
+
namespace :tail do
|
5
|
+
desc "Tail all remote logs"
|
6
|
+
task :default, :roles => :app do
|
7
|
+
log.tail.nginx
|
8
|
+
log.tail.mongrel
|
9
|
+
log.tail.production
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Tail the remote Nginx log"
|
13
|
+
task :nginx, :roles => :app do
|
14
|
+
puts 'Nginx ' + '=' * 100
|
15
|
+
run_puts "tail -100 #{shared_path}/log/nginx.log"
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Tail the remote Mongrel log"
|
19
|
+
task :mongrel, :roles => :app do
|
20
|
+
(mongrel_port..(mongrel_port + production_mongrels - 1)).each do |port|
|
21
|
+
puts "Mongrel #{port} " + '=' * 100
|
22
|
+
run_puts "tail -100 #{shared_path}/log/mongrel.#{port}.log"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "Tail the remote Rails production log"
|
27
|
+
task :production, :roles => :app do
|
28
|
+
puts 'Production ' + '=' * 100
|
29
|
+
run_puts "tail -100 #{shared_path}/log/production.log"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "Add logrotate entry for this application"
|
34
|
+
task :rotate, :roles => :app do
|
35
|
+
upload_from_erb '/etc/rotate.conf', binding, :folder => 'log'
|
36
|
+
sudo_each [
|
37
|
+
'cp -f /etc/logrotate.conf /etc/logrotate2.conf',
|
38
|
+
'chmod 777 /etc/logrotate2.conf',
|
39
|
+
'cat /etc/rotate.conf >> /etc/logrotate2.conf',
|
40
|
+
'cp -f /etc/logrotate2.conf /etc/logrotate.conf',
|
41
|
+
'rm -f /etc/logrotate2.conf',
|
42
|
+
'rm -f /etc/rotate.conf'
|
43
|
+
]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
data/recipes/mongrel.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
namespace :mongrel do
|
4
|
+
[ :stop, :start, :restart ].each do |t|
|
5
|
+
desc "#{t.to_s.capitalize} the mongrel appserver"
|
6
|
+
task t, :roles => :app do
|
7
|
+
run "mongrel_rails cluster::#{t.to_s} -C #{mongrel_etc_dir}/#{application}_#{stage}.yml"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
namespace :config do
|
12
|
+
desc "Generate remote application config"
|
13
|
+
task :default, :roles => :app do
|
14
|
+
mongrel.config.cluster
|
15
|
+
mongrel.config.nginx
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Generate remote remote mongrel_cluster config"
|
19
|
+
task :cluster, :roles => :app do
|
20
|
+
sudo "mkdir -p #{mongrel_etc_dir}"
|
21
|
+
upload_from_erb "#{mongrel_etc_dir}/#{application}_#{stage}.yml", binding, :folder => 'mongrel', :name => 'mongrel.yml'
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "Generate remote Nginx vhost"
|
25
|
+
task :nginx, :roles => :app do
|
26
|
+
upload_from_erb "#{nginx_dir}/vhosts/#{application}_#{stage}.conf", binding, :folder => 'mongrel', :name => 'nginx.vhost'
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "Make our mongrel cluster restart-proof"
|
30
|
+
task :survive_reboot, :roles => :app do
|
31
|
+
sudo_each [
|
32
|
+
"cp -Rf #{mongrel_gem_dir}/resources/mongrel_cluster /etc/init.d/",
|
33
|
+
"chmod +x /etc/init.d/mongrel_cluster",
|
34
|
+
"/usr/sbin/update-rc.d -f mongrel_cluster defaults"
|
35
|
+
]
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Destroy all files created by config:create"
|
39
|
+
task :destroy, :roles => :app do
|
40
|
+
sudo_each [
|
41
|
+
"rm -f #{mongrel_etc_dir}/#{application}_#{stage}.yml",
|
42
|
+
"rm -f #{nginx_dir}/vhosts/#{application}_#{stage}.conf"
|
43
|
+
]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
data/recipes/monit.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
namespace :monit do
|
4
|
+
[ :stop, :start, :restart ].each do |t|
|
5
|
+
desc "#{t.to_s.capitalize} Monit"
|
6
|
+
task t, :roles => :app do
|
7
|
+
sudo "/etc/init.d/monit #{t.to_s}"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
namespace :config do
|
12
|
+
desc "Generate remote Monit config files"
|
13
|
+
task :default, :roles => :app do
|
14
|
+
upload_from_erb [
|
15
|
+
'/etc/monit/monitrc',
|
16
|
+
'/etc/default/monit'
|
17
|
+
], binding, :chown => 'root', :chmod => '0644', :folder => 'monit'
|
18
|
+
monit.config.nginx
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Add mongrel cluster to monitrc"
|
22
|
+
task :mongrel, :roles => :app do
|
23
|
+
upload_from_erb '/etc/monit/mongrel', binding, :folder => 'monit'
|
24
|
+
sudo_each [
|
25
|
+
'cp -f /etc/monit/monitrc /etc/monit/monitrc2',
|
26
|
+
'chmod 777 /etc/monit/monitrc2',
|
27
|
+
'cat /etc/monit/mongrel >> /etc/monit/monitrc2',
|
28
|
+
'cp -f /etc/monit/monitrc2 /etc/monit/monitrc',
|
29
|
+
'rm -f /etc/monit/mongrel',
|
30
|
+
'rm -f /etc/monit/monitrc2'
|
31
|
+
]
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "Generate remote Nginx vhost"
|
35
|
+
task :nginx, :roles => :app do
|
36
|
+
if monit_auth_user
|
37
|
+
sudo_each [
|
38
|
+
"mkdir -p #{nginx_dir}/htpasswd",
|
39
|
+
"htpasswd -bc #{nginx_dir}/htpasswd/monit #{monit_auth_user} #{monit_auth_pass}"
|
40
|
+
]
|
41
|
+
end
|
42
|
+
upload_from_erb "#{nginx_dir}/vhosts/monit.conf", binding, :folder => 'monit', :name => 'nginx.vhost'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
data/recipes/mysql.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
namespace :mysql do
|
4
|
+
namespace :create do
|
5
|
+
desc "Create database and user"
|
6
|
+
task :default, :roles => :db do
|
7
|
+
mysql.create.db
|
8
|
+
mysql.create.user
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Create database"
|
12
|
+
task :db, :roles => :db do
|
13
|
+
mysql_run "CREATE DATABASE #{db_table}"
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Create database user"
|
17
|
+
task :user, :roles => :db do
|
18
|
+
mysql_run [
|
19
|
+
"CREATE USER '#{db_user}'@'localhost' IDENTIFIED BY '#{db_pass}'",
|
20
|
+
"GRANT ALL PRIVILEGES ON *.* TO '#{db_user}'@'localhost'"
|
21
|
+
]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
namespace :update do
|
26
|
+
desc 'Update mysql root password'
|
27
|
+
task :root_password, :roles => :db do
|
28
|
+
old_pass = ask "Current root password? (default: none)"
|
29
|
+
new_pass = ask "New root password? (default: none)"
|
30
|
+
sudo "mysqladmin -u root #{old_pass.empty? ? '' : "--password=#{old_pass} "}password #{new_pass}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
namespace :destroy do
|
35
|
+
desc "Destroy database and user"
|
36
|
+
task :default, :roles => :db do
|
37
|
+
mysql.destroy.db
|
38
|
+
mysql.destroy.user
|
39
|
+
end
|
40
|
+
|
41
|
+
desc "Destroy database"
|
42
|
+
task :db, :roles => :db do
|
43
|
+
mysql_run "DROP DATABASE #{db_table}"
|
44
|
+
end
|
45
|
+
|
46
|
+
desc "Destroy database user"
|
47
|
+
task :user, :roles => :db do
|
48
|
+
mysql_run [
|
49
|
+
"REVOKE ALL PRIVILEGES, GRANT OPTION FROM '#{db_user}'@'localhost'",
|
50
|
+
"DROP USER '#{db_user}'@'localhost'"
|
51
|
+
]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
desc "Updates my.cnf from the file in config/cookbook"
|
56
|
+
task :config, :roles => :db do
|
57
|
+
question = [
|
58
|
+
"This task updates your server's my.cnf (MySQL config) with the one in config/cookbook.",
|
59
|
+
"OK?"
|
60
|
+
]
|
61
|
+
if yes(question)
|
62
|
+
upload_from_erb "#{mysql_dir}/my.cnf", binding, :chown => 'root', :chmod => '0644', :folder => 'mysql'
|
63
|
+
sudo "/etc/init.d/mysql restart"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
namespace :backup do
|
68
|
+
desc "Backup database to local"
|
69
|
+
task :to_local, :roles => :db do
|
70
|
+
to_server
|
71
|
+
system "mkdir -p ~/db_backups/#{stage}/#{application}"
|
72
|
+
get "#{shared_path}/db_backups/#{backup_name}.bz2", File.expand_path("~/db_backups/#{stage}/#{application}/#{backup_name}.bz2")
|
73
|
+
end
|
74
|
+
|
75
|
+
desc "Backup database to remote"
|
76
|
+
task :to_server, :roles => :db do
|
77
|
+
run_each [
|
78
|
+
"mkdir -p #{shared_path}/db_backups",
|
79
|
+
"mysqldump --add-drop-table -u #{db_user} -p#{db_pass} #{db_table}_production | bzip2 -c > #{shared_path}/db_backups/#{backup_name}.bz2"
|
80
|
+
]
|
81
|
+
end
|
82
|
+
|
83
|
+
desc "Upload local backup to remote"
|
84
|
+
task :local_to_server, :roles => :db do
|
85
|
+
from = File.expand_path("~/db_backups/#{stage}/#{application}/#{backup_name}.bz2")
|
86
|
+
if File.exists?(from)
|
87
|
+
run_each "mkdir -p #{shared_path}/db_backups"
|
88
|
+
upload from, "#{shared_path}/db_backups/#{backup_name}.bz2"
|
89
|
+
else
|
90
|
+
puts "Does not exist: #{from}"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
desc "Restore remote database from backup"
|
95
|
+
task :restore, :roles => :db do
|
96
|
+
run_each "bunzip2 < #{shared_path}/db_backups/#{backup_name}.bz2 | mysql -u #{db_user} --password=#{db_pass} #{db_table}"
|
97
|
+
end
|
98
|
+
|
99
|
+
def backup_name
|
100
|
+
now = Time.now
|
101
|
+
[ now.year, now.month, now.day ].join('-') + '.sql'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
data/recipes/nginx.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
namespace :nginx do
|
4
|
+
desc "Restart nginx"
|
5
|
+
task :restart, :roles => :app do
|
6
|
+
deploy.nginx.stop
|
7
|
+
deploy.nginx.start
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Start nginx"
|
11
|
+
task :start, :roles => :app do
|
12
|
+
sudo "/etc/init.d/nginx start"
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Stop nginx"
|
16
|
+
task :stop, :roles => :app do
|
17
|
+
sudo "/etc/init.d/nginx stop"
|
18
|
+
end
|
19
|
+
|
20
|
+
namespace :config do
|
21
|
+
desc "Generate remote application config"
|
22
|
+
task :default, :roles => :app do
|
23
|
+
if auth_user
|
24
|
+
sudo_each [
|
25
|
+
"mkdir -p #{nginx_dir}/htpasswd",
|
26
|
+
"htpasswd -bc #{nginx_dir}/htpasswd/#{application}_#{stage} #{auth_user} #{auth_pass}"
|
27
|
+
]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "Destroy all files created by config"
|
32
|
+
task :destroy, :roles => :app do
|
33
|
+
sudo_each "rm -f #{nginx_dir}/htpasswd/#{application}_#{stage}"
|
34
|
+
end
|
35
|
+
|
36
|
+
namespace :run_once do
|
37
|
+
desc "Generate remote system config (run once)"
|
38
|
+
task :default, :roles => :app do
|
39
|
+
question = [
|
40
|
+
"This task updates your server's nginx.conf with the one in config/cookbook.",
|
41
|
+
"OK?"
|
42
|
+
]
|
43
|
+
if yes(question)
|
44
|
+
sudo_each [
|
45
|
+
"mkdir -p #{nginx_dir}/vhosts",
|
46
|
+
"chmod 0755 #{nginx_dir}/vhosts"
|
47
|
+
]
|
48
|
+
upload_from_erb "#{nginx_dir}/nginx.conf", binding, :chown => 'root', :chmod => '0644', :folder => 'nginx'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
desc "Destroy remote system config"
|
53
|
+
task :destroy, :roles => :app do
|
54
|
+
sudo_each "rm -f #{nginx_dir}/nginx.conf"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
namespace :ssl do
|
59
|
+
desc "Generate SSL key"
|
60
|
+
task :default, :roles => :app do
|
61
|
+
# http://www.geotrust.com/quickssl/csr
|
62
|
+
question = [
|
63
|
+
"This task creates cert/key and cert/csr. Press enter for all optional SSL questions.",
|
64
|
+
"Use these files when buying an SSL cert.",
|
65
|
+
'',
|
66
|
+
"Place the purchased cert in cert/cert. Set :ssl_cert => true in deploy.rb.",
|
67
|
+
"OK?"
|
68
|
+
]
|
69
|
+
if yes(question)
|
70
|
+
system 'mkdir -p cert'
|
71
|
+
system 'openssl genrsa -out cert/key 1024'
|
72
|
+
system 'openssl req -new -key cert/key -out cert/csr'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/recipes/php.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
namespace :php do
|
4
|
+
namespace :config do
|
5
|
+
desc "Generate remote application config"
|
6
|
+
task :default, :roles => :app do
|
7
|
+
php.config.nginx
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Generate remote Nginx vhost"
|
11
|
+
task :nginx, :roles => :app do
|
12
|
+
upload_from_erb "#{nginx_dir}/vhosts/#{application}_#{stage}.conf", binding, :folder => 'php', :name => 'nginx.vhost'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|