sunshine 1.0.0.pre

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.
Files changed (71) hide show
  1. data/History.txt +237 -0
  2. data/Manifest.txt +70 -0
  3. data/README.txt +277 -0
  4. data/Rakefile +46 -0
  5. data/bin/sunshine +5 -0
  6. data/examples/deploy.rb +61 -0
  7. data/examples/deploy_tasks.rake +112 -0
  8. data/examples/standalone_deploy.rb +31 -0
  9. data/lib/commands/add.rb +96 -0
  10. data/lib/commands/default.rb +169 -0
  11. data/lib/commands/list.rb +322 -0
  12. data/lib/commands/restart.rb +62 -0
  13. data/lib/commands/rm.rb +83 -0
  14. data/lib/commands/run.rb +151 -0
  15. data/lib/commands/start.rb +72 -0
  16. data/lib/commands/stop.rb +61 -0
  17. data/lib/sunshine/app.rb +876 -0
  18. data/lib/sunshine/binder.rb +70 -0
  19. data/lib/sunshine/crontab.rb +143 -0
  20. data/lib/sunshine/daemon.rb +380 -0
  21. data/lib/sunshine/daemons/ar_sendmail.rb +28 -0
  22. data/lib/sunshine/daemons/delayed_job.rb +30 -0
  23. data/lib/sunshine/daemons/nginx.rb +104 -0
  24. data/lib/sunshine/daemons/rainbows.rb +35 -0
  25. data/lib/sunshine/daemons/server.rb +66 -0
  26. data/lib/sunshine/daemons/unicorn.rb +26 -0
  27. data/lib/sunshine/dependencies.rb +103 -0
  28. data/lib/sunshine/dependency_lib.rb +200 -0
  29. data/lib/sunshine/exceptions.rb +54 -0
  30. data/lib/sunshine/healthcheck.rb +83 -0
  31. data/lib/sunshine/output.rb +131 -0
  32. data/lib/sunshine/package_managers/apt.rb +48 -0
  33. data/lib/sunshine/package_managers/dependency.rb +349 -0
  34. data/lib/sunshine/package_managers/gem.rb +54 -0
  35. data/lib/sunshine/package_managers/yum.rb +62 -0
  36. data/lib/sunshine/remote_shell.rb +241 -0
  37. data/lib/sunshine/repo.rb +128 -0
  38. data/lib/sunshine/repos/git_repo.rb +122 -0
  39. data/lib/sunshine/repos/rsync_repo.rb +29 -0
  40. data/lib/sunshine/repos/svn_repo.rb +78 -0
  41. data/lib/sunshine/server_app.rb +554 -0
  42. data/lib/sunshine/shell.rb +384 -0
  43. data/lib/sunshine.rb +391 -0
  44. data/templates/logrotate/logrotate.conf.erb +11 -0
  45. data/templates/nginx/nginx.conf.erb +109 -0
  46. data/templates/nginx/nginx_optimize.conf +23 -0
  47. data/templates/nginx/nginx_proxy.conf +13 -0
  48. data/templates/rainbows/rainbows.conf.erb +18 -0
  49. data/templates/tasks/sunshine.rake +114 -0
  50. data/templates/unicorn/unicorn.conf.erb +6 -0
  51. data/test/fixtures/app_configs/test_app.yml +11 -0
  52. data/test/fixtures/sunshine_test/test_upload +0 -0
  53. data/test/mocks/mock_object.rb +179 -0
  54. data/test/mocks/mock_open4.rb +117 -0
  55. data/test/test_helper.rb +188 -0
  56. data/test/unit/test_app.rb +489 -0
  57. data/test/unit/test_binder.rb +20 -0
  58. data/test/unit/test_crontab.rb +128 -0
  59. data/test/unit/test_git_repo.rb +26 -0
  60. data/test/unit/test_healthcheck.rb +70 -0
  61. data/test/unit/test_nginx.rb +107 -0
  62. data/test/unit/test_rainbows.rb +26 -0
  63. data/test/unit/test_remote_shell.rb +102 -0
  64. data/test/unit/test_repo.rb +42 -0
  65. data/test/unit/test_server.rb +324 -0
  66. data/test/unit/test_server_app.rb +425 -0
  67. data/test/unit/test_shell.rb +97 -0
  68. data/test/unit/test_sunshine.rb +157 -0
  69. data/test/unit/test_svn_repo.rb +55 -0
  70. data/test/unit/test_unicorn.rb +22 -0
  71. metadata +217 -0
data/lib/sunshine.rb ADDED
@@ -0,0 +1,391 @@
1
+ require 'rubygems'
2
+ require 'open4'
3
+ require 'rainbow'
4
+ require 'highline'
5
+ require 'tmpdir'
6
+
7
+ require 'yaml'
8
+ require 'erb'
9
+ require 'logger'
10
+ require 'optparse'
11
+ require 'time'
12
+ require 'fileutils'
13
+
14
+ ##
15
+ # Sunshine is an object oriented deploy tool for rack applications.
16
+ #
17
+ # Writing a Sunshine config script is easy:
18
+ #
19
+ # options = {
20
+ # :name => 'myapp',
21
+ # :repo => {:type => :svn, :url => 'svn://blah...'},
22
+ # :deploy_path => '/usr/local/myapp',
23
+ # :remote_shells => ['user@someserver.com']
24
+ # }
25
+ #
26
+ # Sunshine::App.deploy(options) do |app|
27
+ #
28
+ # app.yum_install 'sqlite'
29
+ # app.gem_install 'sqlite3-ruby'
30
+ #
31
+ # app.rake "db:migrate"
32
+ #
33
+ # app_server = Sunshine::Rainbows.new(app)
34
+ # app_server.restart
35
+ #
36
+ # Sunshine::Nginx.new(app, :point_to => app_server).restart
37
+ #
38
+ # end
39
+ #
40
+ # The App::deploy and App::new methods also support passing
41
+ # a path to a yaml file:
42
+ #
43
+ # app = Sunshine::App.new("path/to/config.yml")
44
+ # app.deploy{|app| Sunshine::Rainbows.new(app).restart }
45
+ #
46
+ #
47
+ # Command line execution:
48
+ #
49
+ # Usage:
50
+ # sunshine -h/--help
51
+ # sunshine -v/--version
52
+ # sunshine command [arguments...] [options...]
53
+ #
54
+ # Examples:
55
+ # sunshine run deploy_script.rb
56
+ # sunshine restart myapp -r user@server.com,user@host.com
57
+ # sunshine list myapp myotherapp --health -r user@server.com
58
+ # sunshine list myapp --status
59
+ #
60
+ # Commands:
61
+ # add Register an app with sunshine
62
+ # list Display deployed apps
63
+ # restart Restart a deployed app
64
+ # rm Unregister an app with sunshine
65
+ # run Run a Sunshine script
66
+ # start Start a deployed app
67
+ # stop Stop a deployed app
68
+ #
69
+ # For more help on sunshine commands, use 'sunshine COMMAND --help'
70
+
71
+ module Sunshine
72
+
73
+ ##
74
+ # Sunshine version.
75
+ VERSION = '1.0.0.pre'
76
+
77
+
78
+ ##
79
+ # Handles input/output to the shell. See Sunshine::Shell.
80
+
81
+ def self.shell
82
+ @shell ||= Sunshine::Shell.new
83
+ end
84
+
85
+ ##
86
+ # The default deploy environment to use. Set with the -e option.
87
+ # See App#deploy_env for app specific deploy environments.
88
+
89
+ def self.deploy_env
90
+ @config['deploy_env'].to_s
91
+ end
92
+
93
+
94
+ ##
95
+ # Returns the main Sunshine dependencies library.
96
+
97
+ def self.dependencies
98
+ @dependency_lib ||= DependencyLib.new
99
+ end
100
+
101
+
102
+ ##
103
+ # The default directory where apps should be deployed to:
104
+ # '/var/www' by default. Overridden in the ~/.sunshine config file.
105
+ # See also App#deploy_path.
106
+
107
+ def self.web_directory
108
+ @config['web_directory']
109
+ end
110
+
111
+
112
+ ##
113
+ # Should sunshine ever ask for user input? True by default; overridden with
114
+ # the -a option.
115
+
116
+ def self.interactive?
117
+ !@config['auto']
118
+ end
119
+
120
+
121
+ ##
122
+ # Handles all output for sunshine. See Sunshine::Output.
123
+
124
+ def self.logger
125
+ @logger ||= Sunshine::Output.new \
126
+ :level => Logger.const_get(@config['level'].upcase)
127
+ end
128
+
129
+
130
+ ##
131
+ # Maximum number of deploys (history) to keep on the remote server,
132
+ # 5 by default. Overridden in the ~/.sunshine config file.
133
+
134
+ def self.max_deploy_versions
135
+ @config['max_deploy_versions']
136
+ end
137
+
138
+
139
+ ##
140
+ # Check if trace log should be output at all.
141
+ # This value can be assigned by default in ~/.sunshine
142
+ # or switched off with the run command's --no-trace option.
143
+ # Defaults to true.
144
+
145
+ def self.trace?
146
+ @config['trace']
147
+ end
148
+
149
+
150
+ ##
151
+ # Adds an INT signal trap with its description on the stack.
152
+ # Returns a trap_item Array.
153
+
154
+ def self.add_trap desc, &block
155
+ trap_item = [desc, block]
156
+ (@trap_stack ||= []).unshift trap_item
157
+ trap_item
158
+ end
159
+
160
+ add_trap "Disconnecting all remote shells." do
161
+ RemoteShell.disconnect_all
162
+ end
163
+
164
+
165
+ ##
166
+ # Call a trap item and display it's message.
167
+
168
+ def self.call_trap trap_item
169
+ return unless trap_item
170
+
171
+ msg, block = trap_item
172
+
173
+ logger.info :INT, msg do
174
+ block.call
175
+ end
176
+ end
177
+
178
+
179
+ ##
180
+ # Remove a trap_item from the stack.
181
+
182
+ def self.delete_trap trap_item
183
+ @trap_stack.delete trap_item
184
+ end
185
+
186
+
187
+ trap "INT" do
188
+ $stderr << "\n\n"
189
+ logger.indent = 0
190
+ logger.fatal :INT, "Caught INT signal!"
191
+
192
+ call_trap @trap_stack.shift
193
+ Kernel.exit 1
194
+ end
195
+
196
+
197
+ ##
198
+ # Global value of sudo to use. Returns true, nil, or a username.
199
+ # This value can be assigned by default in ~/.sunshine
200
+ # or with the --sudo [username] option. Defaults to nil.
201
+
202
+ def self.sudo
203
+ @config['sudo']
204
+ end
205
+
206
+
207
+ ##
208
+ # Path to the list of installed sunshine apps.
209
+ APP_LIST_PATH = "~/.sunshine_list"
210
+
211
+ READ_LIST_CMD = "test -f #{Sunshine::APP_LIST_PATH} && "+
212
+ "cat #{APP_LIST_PATH} || echo ''"
213
+
214
+ ##
215
+ # Commands supported by Sunshine
216
+ COMMANDS = %w{add list restart rm run start stop}
217
+
218
+ ##
219
+ # Default Sunshine config file
220
+ USER_CONFIG_FILE = File.expand_path("~/.sunshine")
221
+
222
+ ##
223
+ # Default configuration
224
+ DEFAULT_CONFIG = {
225
+ 'level' => 'info',
226
+ 'deploy_env' => :development,
227
+ 'auto' => false,
228
+ 'max_deploy_versions' => 5,
229
+ 'web_directory' => '/var/www'
230
+ }
231
+
232
+ ##
233
+ # Temp directory used by various sunshine classes
234
+ # for uploads, checkouts, etc...
235
+ TMP_DIR = File.join Dir.tmpdir, "sunshine_#{$$}"
236
+ FileUtils.mkdir_p TMP_DIR
237
+
238
+ ##
239
+ # Path where sunshine assumes repo information can be found if missing.
240
+ PATH = Dir.getwd
241
+
242
+ ##
243
+ # File DATA from sunshine run files.
244
+ DATA = defined?(::DATA) ? ::DATA : nil
245
+
246
+ ##
247
+ # Root directory of the Sunshine gem.
248
+ ROOT = File.expand_path File.join(File.dirname(__FILE__), "..")
249
+
250
+ ##
251
+ # Cleanup after sunshine has run, remove temp dirs, etc...
252
+
253
+ def self.cleanup
254
+ FileUtils.rm_rf TMP_DIR if Dir.glob("#{TMP_DIR}/*").empty?
255
+ end
256
+
257
+
258
+ ##
259
+ # Setup sunshine with a custom config:
260
+ # Sunshine.setup 'level' => 'debug', 'deploy_env' => :production
261
+
262
+ def self.setup new_config={}, reset=false
263
+ @config = DEFAULT_CONFIG.dup if !defined?(@config) || reset
264
+ @config.merge! new_config
265
+ @config
266
+ end
267
+
268
+
269
+ ##
270
+ # Run sunshine with the passed argv and exits with appropriate exitcode.
271
+ # run %w{run my_script.rb -l debug}
272
+ # run %w{list -d}
273
+
274
+ def self.run argv=ARGV
275
+ unless File.file? USER_CONFIG_FILE
276
+ File.open(USER_CONFIG_FILE, "w+"){|f| f.write DEFAULT_CONFIG.to_yaml}
277
+
278
+ msg = "Missing config file was created for you: #{USER_CONFIG_FILE}\n\n"
279
+ msg << DEFAULT_CONFIG.to_yaml
280
+
281
+ self.exit 1, msg
282
+ end
283
+
284
+ command_name = find_command argv.first
285
+ argv.shift if command_name
286
+ command_name ||= "default"
287
+
288
+ command = Sunshine.const_get("#{command_name.capitalize}Command")
289
+
290
+ config = YAML.load_file USER_CONFIG_FILE
291
+ config.merge! command.parse_args(argv)
292
+
293
+ self.setup config, true
294
+
295
+ result = command.exec argv, config
296
+
297
+ self.exit(*result)
298
+ end
299
+
300
+
301
+ ##
302
+ # Find the sunshine command to run based on the passed name.
303
+ # Handles partial command names if they can be uniquely mapped to a command.
304
+ # find_command "dep" #=> "run"
305
+ # find_command "zzz" #=> false
306
+
307
+ def self.find_command name
308
+ commands = COMMANDS.select{|c| c =~ /^#{name}/}
309
+ commands.length == 1 && commands.first
310
+ end
311
+
312
+
313
+ ##
314
+ # Exits sunshine process and returns the appropriate exit code
315
+ # exit 0, "ok"
316
+ # exit false, "ok"
317
+ # # both output: stdout >> ok - exitcode 0
318
+ # exit 1, "oh noes"
319
+ # exit true, "oh noes"
320
+ # # both output: stderr >> oh noes - exitcode 1
321
+
322
+ def self.exit status, msg=nil
323
+ self.cleanup
324
+
325
+ status = case status
326
+ when true
327
+ 0
328
+ when false
329
+ 1
330
+ when Integer
331
+ status
332
+ else
333
+ status.to_i
334
+ end
335
+
336
+ output = status == 0 ? $stdout : $stderr
337
+
338
+ output << "#{msg}\n" if !msg.nil?
339
+
340
+ Kernel.exit status
341
+ end
342
+
343
+
344
+ require 'sunshine/exceptions'
345
+
346
+ require 'sunshine/shell'
347
+ require 'sunshine/output'
348
+
349
+ require 'sunshine/binder'
350
+
351
+ require 'sunshine/dependency_lib'
352
+ require 'sunshine/package_managers/dependency'
353
+ require 'sunshine/package_managers/apt'
354
+ require 'sunshine/package_managers/yum'
355
+ require 'sunshine/package_managers/gem'
356
+
357
+ require 'sunshine/repo'
358
+ require 'sunshine/repos/svn_repo'
359
+ require 'sunshine/repos/git_repo'
360
+ require 'sunshine/repos/rsync_repo'
361
+
362
+ require 'sunshine/daemon'
363
+ require 'sunshine/daemons/server'
364
+ require 'sunshine/daemons/nginx'
365
+ require 'sunshine/daemons/unicorn'
366
+ require 'sunshine/daemons/rainbows'
367
+ require 'sunshine/daemons/ar_sendmail'
368
+ require 'sunshine/daemons/delayed_job'
369
+
370
+ require 'sunshine/crontab'
371
+
372
+ require 'sunshine/healthcheck'
373
+
374
+ require 'sunshine/remote_shell'
375
+
376
+ require 'sunshine/server_app'
377
+ require 'sunshine/app'
378
+
379
+ require 'commands/default'
380
+ require 'commands/list'
381
+ require 'commands/add'
382
+ require 'commands/run'
383
+ require 'commands/restart'
384
+ require 'commands/rm'
385
+ require 'commands/start'
386
+ require 'commands/stop'
387
+ end
388
+
389
+
390
+ Sunshine.setup
391
+ require 'sunshine/dependencies'
@@ -0,0 +1,11 @@
1
+ <%= log_path %>/* {
2
+ missingok
3
+ rotate 168
4
+ compress
5
+ delaycompress
6
+ olddir <%= log_path %>/rotate
7
+ create 0666 <%= server_app.shell.user %>
8
+ lastaction
9
+ logpush <%= log_path %>/rotate/*
10
+ endscript
11
+ }
@@ -0,0 +1,109 @@
1
+ <% darwin = shell.os_name =~ /^darwin$/i %>
2
+
3
+ <% if sudo == true || sudo == 'root' %>
4
+ user nobody nobody;
5
+ <% end %>
6
+ worker_processes <%= processes %>;
7
+ pid <%= expand_path pid %>;
8
+ error_log <%= expand_path log_file(:stderr) %> info;
9
+
10
+ events {
11
+ worker_connections 1024;
12
+ <% unless darwin %>
13
+ use epoll;
14
+ <% end %>
15
+ }
16
+
17
+ http {
18
+
19
+ <% if use_passenger? %>
20
+ passenger_root <%= passenger_root %>;
21
+ <% end %>
22
+
23
+ client_body_temp_path <%= darwin ? '/var/tmp/nginx' : '/dev/shm' %>;
24
+ proxy_temp_path <%= darwin ? '/var/tmp/nginx' : '/dev/shm' %>;
25
+
26
+ include <%= File.join nginx_conf_path, 'mime.types' %>;
27
+ default_type application/octet-stream;
28
+
29
+ log_format sunshine '$remote_addr - $remote_user [$time_local] '
30
+ '"$request" $status $body_bytes_sent "$http_referer" '
31
+ '"$http_user_agent" "$http_cookie" $request_time '
32
+ '$upstream_http_x_urid';
33
+ access_log <%= expand_path log_file(:stdout) %> sunshine;
34
+
35
+
36
+ # This should be some other include file
37
+ include <%= expand_path config_path %>/nginx_optimize.conf;
38
+
39
+
40
+ ##
41
+ # gZip config
42
+ gzip on;
43
+ gzip_disable "MSIE [1-6]\.";
44
+ gzip_min_length 1100;
45
+ gzip_buffers 4 8k;
46
+ gzip_http_version 1.0;
47
+ gzip_comp_level 5;
48
+ gzip_proxied any;
49
+ gzip_types text/plain text/html text/css application/x-javascript application/xml application/xml+rss text/javascript;
50
+
51
+ <% if target.is_a?(Sunshine::Server) %>
52
+ upstream app_server {
53
+ server 0:<%= target.port %> fail_timeout=<%= timeout %>;
54
+ }
55
+ <% end %>
56
+
57
+ ##
58
+ # 301 redirect www to non-www host.
59
+ server {
60
+ listen <%= port %>;
61
+ server_name www.<%= server_name %>;
62
+ rewrite ^/(.*) http://<%= server_name %>/$1 permanent;
63
+ }
64
+
65
+ ##
66
+ # Main server definition.
67
+ server {
68
+ listen <%= port %> default;
69
+ server_name <%= server_name %>;
70
+ port_in_redirect off; # needed for the F5, unfortunately
71
+ server_name_in_redirect off;
72
+
73
+
74
+ root <%= expand_path app.current_path %>/public;
75
+
76
+ <% if use_passenger? %>
77
+ passenger_enabled on;
78
+
79
+ <% else %>
80
+
81
+ ##
82
+ # Main proxy
83
+ location / {
84
+ <% if darwin %>
85
+ ssi on;
86
+ <% end %>
87
+ if (-f $request_filename) {
88
+ break;
89
+ }
90
+
91
+ include <%= expand_path config_path %>/nginx_proxy.conf;
92
+ expires -1;
93
+
94
+ <% if target.is_a?(Sunshine::Server) %>
95
+ if (!-f $request_filename) {
96
+ proxy_pass http://app_server;
97
+ break;
98
+ }
99
+ <% end %>
100
+
101
+ error_page 500 502 503 504 /500.html;
102
+ location = /500.html {
103
+ root <%= expand_path app.current_path %>/public;
104
+ }
105
+ }
106
+ <% end %>
107
+ }
108
+
109
+ }
@@ -0,0 +1,23 @@
1
+ server_name_in_redirect off;
2
+
3
+ sendfile on;
4
+ tcp_nodelay on;
5
+ tcp_nopush off;
6
+ keepalive_timeout 75 20;
7
+ server_names_hash_bucket_size 128; # Seems to be required for vhosts.
8
+
9
+ ##
10
+ # Optimizations: http://www.typemiss.net/blog/kounoike/20060227-75
11
+ client_header_timeout 10m;
12
+ client_body_timeout 10m;
13
+ send_timeout 10m;
14
+
15
+ connection_pool_size 256;
16
+ client_header_buffer_size 12k;
17
+ large_client_header_buffers 4 8k;
18
+ request_pool_size 4k;
19
+
20
+ output_buffers 1 32k;
21
+ postpone_output 1460;
22
+
23
+ ignore_invalid_headers on;
@@ -0,0 +1,13 @@
1
+ proxy_redirect off;
2
+ proxy_set_header Host $host;
3
+ proxy_set_header X-Real-IP $remote_addr;
4
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
5
+ client_max_body_size 10m;
6
+ client_body_buffer_size 128k;
7
+ proxy_connect_timeout 90;
8
+ proxy_send_timeout 90;
9
+ proxy_read_timeout 90;
10
+ proxy_buffer_size 4k;
11
+ proxy_buffers 4 32k;
12
+ proxy_busy_buffers_size 64k;
13
+ proxy_temp_file_write_size 64k;
@@ -0,0 +1,18 @@
1
+ timeout <%= timeout %>
2
+ worker_processes <%= processes %>
3
+ listen "0.0.0.0:<%= port %>"
4
+ pid File.expand_path("<%= pid %>")
5
+ stderr_path File.expand_path("<%= log_file :stderr %>")
6
+ stdout_path File.expand_path("<%= log_file :stdout %>")
7
+
8
+ <% if concurrency && !concurrency.empty? %>
9
+ Rainbows! do
10
+ use <%= concurrency[:model].inspect %>
11
+ <% if concurrency[:connections] %>
12
+ worker_connections <%= concurrency[:connections] %>
13
+ <% end %>
14
+ <% if concurrency[:timeout] %>
15
+ keepalive_timeout <%= concurrency[:timeout] %>
16
+ <% end %>
17
+ end
18
+ <% end %>
@@ -0,0 +1,114 @@
1
+ require 'sunshine'
2
+
3
+ namespace :sunshine do
4
+
5
+ ##
6
+ # If using rails, have rails information available by updating :app task to:
7
+ # task :app => :environment do
8
+ # ...
9
+ # end
10
+
11
+ desc "Instantiate Sunshine"
12
+ task :app do
13
+ deploy_env = ENV['env'] || ENV['RACK_ENV'] || ENV['RAILS_ENV']
14
+
15
+ Sunshine.setup 'deploy_env' => ( deploy_env || "development" )
16
+
17
+
18
+ # View the Sunshine README, scripts in the sunshine/examples
19
+ # directory, or the docs for Sunshine::App for more information on
20
+ # App instantiation.
21
+
22
+ @app = Sunshine::App.new "path/to/app_deploy_config.yml"
23
+ # or
24
+ # @app = Sunshine::App.new app_config_hash
25
+ end
26
+
27
+
28
+ desc "Deploy the app"
29
+ task :deploy => :app do
30
+ Sunshine.setup 'trace' => true
31
+
32
+ @app.deploy do |app|
33
+
34
+ # Do deploy-specific stuff here, e.g.
35
+ #
36
+ # app.run_bundler
37
+ #
38
+ # unicorn = Sunshine::Unicorn.new app, :port => 3000,
39
+ # :processes => 8
40
+ # unicorn.setup
41
+
42
+ end
43
+
44
+ @app.start :force => true
45
+ end
46
+
47
+
48
+ # Post-deploy control tasks:
49
+
50
+ desc "Run db:migrate on remote :db servers"
51
+ task :db_migrate => :app do
52
+ @app.rake 'db:migrate', :role => :db
53
+ end
54
+
55
+
56
+ desc "Run the remote start script"
57
+ task :start => :app do
58
+ @app.start
59
+ puts @app.status.to_yaml
60
+ end
61
+
62
+
63
+ desc "Run the remote stop script"
64
+ task :stop => :app do
65
+ @app.stop
66
+ puts @app.status.to_yaml
67
+ end
68
+
69
+
70
+ desc "Run the remote restart script"
71
+ task :restart => :app do
72
+ @app.restart
73
+ puts @app.status.to_yaml
74
+ end
75
+
76
+
77
+ desc "Check if the deployed app is running"
78
+ task :status => :app do
79
+ puts @app.status.to_yaml
80
+ end
81
+
82
+
83
+ desc "Get deployed app info"
84
+ task :info => :app do
85
+ puts @app.deploy_details.to_yaml
86
+ end
87
+
88
+
89
+ desc "Get the health state"
90
+ task :health => :app do
91
+ puts @app.health.to_yaml
92
+ end
93
+
94
+
95
+ namespace :health do
96
+
97
+ desc "Turn on health check"
98
+ task :enable => :app do
99
+ puts @app.health(:enable).to_yaml
100
+ end
101
+
102
+
103
+ desc "Turn off health check"
104
+ task :disable => :app do
105
+ puts @app.health(:disable).to_yaml
106
+ end
107
+
108
+
109
+ desc "Remove health check"
110
+ task :remove => :app do
111
+ puts @app.health(:remove).to_yaml
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,6 @@
1
+ timeout <%= timeout %>
2
+ worker_processes <%= processes %>
3
+ listen "0.0.0.0:<%= port %>"
4
+ pid File.expand_path("<%= pid %>")
5
+ stderr_path File.expand_path("<%= log_file :stderr %>")
6
+ stdout_path File.expand_path("<%= log_file :stdout %>")
@@ -0,0 +1,11 @@
1
+ :default:
2
+ :name: other_app
3
+ :repo:
4
+ :type: svn
5
+ :url: svn://subversion/path/to/other_app/tags/release001
6
+
7
+ :root_path: /usr/local/my_user/other_app
8
+
9
+ :remote_shells:
10
+ - - "user@some_server.com"
11
+ - :roles: web db app
File without changes