sunshine 1.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
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