fdlcap 0.3.28

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +72 -0
  3. data/Rakefile +69 -0
  4. data/VERSION +1 -0
  5. data/bin/fdlcap +4 -0
  6. data/examples/deploy.rb +57 -0
  7. data/fdlcap.gemspec +98 -0
  8. data/features/fdlcap.feature +9 -0
  9. data/features/step_definitions/fdlcap_steps.rb +0 -0
  10. data/features/support/env.rb +6 -0
  11. data/lib/fdlcap/extensions/configuration.rb +34 -0
  12. data/lib/fdlcap/extensions/recipe_definition.rb +19 -0
  13. data/lib/fdlcap/recipes/autotagger.rb +51 -0
  14. data/lib/fdlcap/recipes/check_revision.rb +22 -0
  15. data/lib/fdlcap/recipes/craken.rb +5 -0
  16. data/lib/fdlcap/recipes/database.rb +204 -0
  17. data/lib/fdlcap/recipes/delayed_job.rb +28 -0
  18. data/lib/fdlcap/recipes/deploy.rb +26 -0
  19. data/lib/fdlcap/recipes/fdl_defaults.rb +16 -0
  20. data/lib/fdlcap/recipes/geminstaller.rb +53 -0
  21. data/lib/fdlcap/recipes/newrelic.rb +6 -0
  22. data/lib/fdlcap/recipes/nginx.rb +102 -0
  23. data/lib/fdlcap/recipes/passenger.rb +17 -0
  24. data/lib/fdlcap/recipes/performance.rb +78 -0
  25. data/lib/fdlcap/recipes/rake.rb +19 -0
  26. data/lib/fdlcap/recipes/rolling_restart.rb +31 -0
  27. data/lib/fdlcap/recipes/rsync.rb +42 -0
  28. data/lib/fdlcap/recipes/ruby_inline.rb +19 -0
  29. data/lib/fdlcap/recipes/sass.rb +20 -0
  30. data/lib/fdlcap/recipes/sinatra_passenger.rb +21 -0
  31. data/lib/fdlcap/recipes/slice.rb +59 -0
  32. data/lib/fdlcap/recipes/ssh.rb +42 -0
  33. data/lib/fdlcap/recipes/stages.rb +12 -0
  34. data/lib/fdlcap/recipes/symlink_configs.rb +7 -0
  35. data/lib/fdlcap/recipes/symlinks.rb +48 -0
  36. data/lib/fdlcap/recipes/thin.rb +119 -0
  37. data/lib/fdlcap/recipes/thinking_sphinx.rb +12 -0
  38. data/lib/fdlcap/recipes.rb +11 -0
  39. data/lib/fdlcap/templates/nginx.auth.conf.erb +9 -0
  40. data/lib/fdlcap/templates/nginx.conf.erb +57 -0
  41. data/lib/fdlcap/templates/nginx.vhost.conf.erb +85 -0
  42. data/lib/fdlcap.rb +3 -0
  43. data/test/fdlcap_test.rb +7 -0
  44. data/test/test_helper.rb +10 -0
  45. metadata +140 -0
@@ -0,0 +1,21 @@
1
+ Capistrano::Configuration.instance(:must_exist).load do
2
+ define_recipe :sinatra_passenger do
3
+ use_recipe :passenger
4
+
5
+ namespace :sinatra_passenger do
6
+ desc "Set file permissions"
7
+ task :chmod_directories_config do
8
+ run "cd #{release_path} && find -maxdepth 1 -type d -exec chmod 755 {} \\;"
9
+ end
10
+
11
+ desc "Set public folder permissions"
12
+ task :chmod_directories_public do
13
+ run "cd #{release_path}/public && find -type d -exec chmod 755 {} \\;"
14
+ end
15
+ end
16
+
17
+ after "deploy:update_code", "sinatra_passenger:chmod_directories_config"
18
+ after "deploy:update_code", "sinatra_passenger:chmod_directories_public"
19
+ end
20
+
21
+ end
@@ -0,0 +1,59 @@
1
+ Capistrano::Configuration.instance(:must_exist).load do
2
+
3
+ namespace :slice do
4
+
5
+ desc "Tail the Rails log for this environment"
6
+ task :tail_logs, :roles => :app do
7
+ run "tail -f #{shared_path}/log/#{rails_env}.log" do |channel, stream, data|
8
+ puts # for an extra line break before the host name
9
+ puts "#{channel[:server]} -> #{data}"
10
+ break if stream == :err
11
+ end
12
+ end
13
+
14
+ desc "Tail the system log for this environment"
15
+ task :tail_syslog, :roles => :app do
16
+ sudo "tail -f /var/log/syslog" do |channel, stream, data|
17
+ puts # for an extra line break before the host name
18
+ puts "#{channel[:server]} -> #{data}"
19
+ break if stream == :err
20
+ end
21
+ end
22
+
23
+ desc "Tail the message log for this environment"
24
+ task :tail_messages, :roles => :app do
25
+ sudo "tail -f /var/log/messages" do |channel, stream, data|
26
+ puts # for an extra line break before the host name
27
+ puts "#{channel[:server]} -> #{data}"
28
+ break if stream == :err
29
+ end
30
+ end
31
+
32
+ desc <<-DESC
33
+ grep the production.log to find long running queries
34
+ DESC
35
+ task :grep_requests, :roles => :app do
36
+ run "grep 'Completed in [0-9]*' #{shared_path}/log/#{rails_env}.log"
37
+ end
38
+
39
+ desc <<-DESC
40
+ grep the production.log to find long running queries
41
+ DESC
42
+ task :grep_long_requests, :roles => :app do
43
+ run "grep 'Completed in [0-9][0-9]' #{shared_path}/log/#{rails_env}.log"
44
+ end
45
+
46
+ end
47
+
48
+ # Deploy the custom maintenance page
49
+ define_recipe :custom_maintenance_page do
50
+
51
+ desc "Copy the maintenance page from the public directory to the shared directory"
52
+ task :copy_maintenance_page, :roles => :app do
53
+ upload "public/maintenance.html","#{shared_path}/system/maintenance.html.custom", :via => :scp
54
+ end
55
+
56
+ before "deploy:web:disable", "slice:copy_maintenance_page"
57
+ end
58
+
59
+ end
@@ -0,0 +1,42 @@
1
+ Capistrano::Configuration.instance(:must_exist).load do
2
+ task :ssh do
3
+ role = (ENV['ROLE'] || :app).to_sym
4
+ servers = find_servers :roles => role
5
+ server = servers.first
6
+ ssh_cmd = fetch(:ssh_cmd, '/usr/bin/ssh')
7
+ if server
8
+ `echo '#{password}' | /usr/bin/pbcopy`
9
+ exec "#{ssh_cmd} #{user}@#{server.host} -p #{server.port || 22} "
10
+ end
11
+ end
12
+
13
+ task :ssh_forever do
14
+ ssh_forever_binary = '/usr/bin/ssh-forever'
15
+ if File.exists?(ssh_forever_binary)
16
+ set :ssh_cmd, ssh_forever_binary
17
+ ssh
18
+ else
19
+ puts "#{ssh_forever_binary} not found - do you have the ssh-forever gem installed?"
20
+ exit 1
21
+ end
22
+ end
23
+
24
+ #namespace :ssh do
25
+ task :tunnel do
26
+ remote_port = ENV['REMOTE_PORT'] || 80
27
+ local_port = ENV['LOCAL_PORT'] || 2000
28
+ role = (ENV['ROLE'] || :app).to_sym
29
+
30
+ servers = find_servers :roles => role
31
+ server = servers.first
32
+ if server
33
+ puts "Opening a tunnel from port #{local_port} locally to port #{remote_port} on #{server.host}"
34
+ Net::SSH.start(server.host, user, :password => password, :port => server.port) do |ssh|
35
+ ssh.forward.local(local_port, "127.0.0.1", remote_port)
36
+ ssh.loop { true }
37
+ end
38
+ end
39
+ end
40
+ #end
41
+
42
+ end
@@ -0,0 +1,12 @@
1
+ Capistrano::Configuration.instance(:must_exist).load do
2
+ define_recipe :stages do |*stages|
3
+
4
+ set :stages, stages.flatten unless exists?(:stages) && !stages.empty?
5
+
6
+ unless exists?(:default_stage)
7
+ set :default_stage, :staging
8
+ end
9
+
10
+ require 'capistrano/ext/multistage'
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ Capistrano::Configuration.instance(:must_exist).load do
2
+
3
+ define_recipe :symlink_configs do
4
+ after "deploy:update_code", "deploy:symlink_configs"
5
+ end
6
+
7
+ end
@@ -0,0 +1,48 @@
1
+ Capistrano::Configuration.instance(:must_exist).load do
2
+
3
+ define_recipe :symlinks do
4
+ #
5
+ # Callbacks
6
+ #
7
+ after "deploy:update_code", "symlinks:create"
8
+
9
+ #
10
+ # Configuration
11
+ #
12
+ set :symlink_dirs, []
13
+ set :symlink_absolute_dirs, []
14
+
15
+ #
16
+ # Tasks
17
+ #
18
+ namespace :symlinks do
19
+
20
+ desc "fix symlinks to shared directory"
21
+ task :fix, :roles => :app, :except => { :no_release => true } do
22
+ # for folders stored under public
23
+ symlink_dirs.each do |share|
24
+ run "rm -rf #{current_path}/#{share}"
25
+ run "mkdir -p #{shared_path}/#{share}"
26
+ run "ln -nfs #{shared_path}/#{share} #{current_path}/#{share}"
27
+ end
28
+ end
29
+
30
+ desc "create symlinks to shared directory"
31
+ task :create, :roles => :app, :except => { :no_release => true } do
32
+ # for folders stored under public
33
+ symlink_dirs.each do |share|
34
+ run "rm -rf #{release_path}/#{share}"
35
+ run "mkdir -p #{shared_path}/#{share}"
36
+ run "ln -nfs #{shared_path}/#{share} #{release_path}/#{share}"
37
+ end
38
+
39
+ symlink_absolute_dirs.each do |share|
40
+ run "rm -rf #{share[:symlink]}"
41
+ run "mkdir -p #{share[:source]}"
42
+ run "ln -nfs #{share[:source]} #{share[:symlink]}"
43
+ end
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,119 @@
1
+ Capistrano::Configuration.instance(:must_exist).load do
2
+
3
+ define_recipe :thin do
4
+
5
+ set :thin_servers, 2
6
+ set :thin_port, 8000
7
+ set :thin_address, "127.0.0.1"
8
+ set :thin_environment, "production"
9
+ set :thin_conf, nil
10
+ set :thin_user, nil
11
+ set :thin_group, nil
12
+ set :thin_prefix, nil
13
+ set :thin_pid_file, nil
14
+ set :thin_log_file, nil
15
+ set :thin_config_script, nil
16
+
17
+ namespace :thin do
18
+ desc <<-DESC
19
+ Install Thin script on the app server. This uses the :use_sudo variable to determine whether to use sudo or not. By default, :use_sudo is
20
+ set to true.
21
+ DESC
22
+ task :install , :roles => :app do
23
+ send(run_method, "gem install thin")
24
+ send(run_method, "thin install")
25
+ end
26
+
27
+ desc <<-DESC
28
+ Configure thin processes on the app server. This uses the :use_sudo
29
+ variable to determine whether to use sudo or not. By default, :use_sudo is
30
+ set to true.
31
+ DESC
32
+ task :configure, :roles => :app do
33
+ set_conf
34
+
35
+ argv = []
36
+ argv << "thin"
37
+ argv << "-s #{thin_servers.to_s}"
38
+ argv << "-p #{thin_port.to_s}"
39
+ argv << "-e #{thin_environment}"
40
+ argv << "-a #{thin_address}"
41
+ argv << "-c #{current_path}"
42
+ argv << "-C #{thin_conf}"
43
+ argv << "-P #{thin_pid_file}" if thin_pid_file
44
+ argv << "-l #{thin_log_file}" if thin_log_file
45
+ argv << "--user #{thin_user}" if thin_user
46
+ argv << "--group #{thin_group}" if thin_group
47
+ argv << "--prefix #{thin_prefix}" if thin_prefix
48
+ argv << "config"
49
+ cmd = argv.join " "
50
+ send(run_method, cmd)
51
+ end
52
+
53
+ task :setup, :roles => :app do
54
+ thin.install
55
+ thin.configure
56
+ end
57
+
58
+ desc <<-DESC
59
+ Start Thin processes on the app server. This uses the :use_sudo variable to determine whether to use sudo or not. By default, :use_sudo is
60
+ set to true.
61
+ DESC
62
+ task :start , :roles => :app do
63
+ set_conf
64
+ cmd = "thin start -C #{thin_conf}"
65
+ send(run_method, cmd)
66
+ end
67
+
68
+ desc <<-DESC
69
+ Restart the Thin processes on the app server by starting and stopping the cluster. This uses the :use_sudo
70
+ variable to determine whether to use sudo or not. By default, :use_sudo is set to true.
71
+ DESC
72
+ task :restart , :roles => :app do
73
+ set_conf
74
+ cmd = "thin restart -C #{thin_conf}"
75
+ send(run_method, cmd)
76
+ end
77
+
78
+ desc <<-DESC
79
+ Stop the Thin processes on the app server. This uses the :use_sudo
80
+ variable to determine whether to use sudo or not. By default, :use_sudo is
81
+ set to true.
82
+ DESC
83
+ task :stop , :roles => :app do
84
+ set_conf
85
+ cmd = "thin stop -C #{thin_conf}"
86
+ send(run_method, cmd)
87
+ end
88
+
89
+
90
+ def set_conf
91
+ set :thin_conf, "/etc/thin/#{application}.yml" unless thin_conf
92
+ end
93
+ end
94
+
95
+ namespace :deploy do
96
+ desc <<-DESC
97
+ Restart the Thin processes on the app server by calling thin:restart.
98
+ DESC
99
+ task :restart, :roles => :app do
100
+ thin.restart
101
+ end
102
+
103
+ desc <<-DESC
104
+ Start the Thin processes on the app server by calling thin:start.
105
+ DESC
106
+ task :start, :roles => :app do
107
+ thin.start
108
+ end
109
+
110
+ desc <<-DESC
111
+ Stop the Thin processes on the app server by calling thin:stop.
112
+ DESC
113
+ task :stop, :roles => :app do
114
+ thin.stop
115
+ end
116
+ end
117
+ end
118
+
119
+ end
@@ -0,0 +1,12 @@
1
+ Capistrano::Configuration.instance(:must_exist).load do
2
+ # These recipies assume an engineyard configuration
3
+
4
+ # searchd assumes indexing and configuring being called directly on searchd
5
+ define_recipe :thinking_sphinx do
6
+ after "deploy:symlink_configs", "thinking_sphinx:symlink"
7
+ after "thinking_sphinx:symlink", "sphinx:configure"
8
+ after "deploy:update", "deploy:migrate"
9
+ after "deploy:migrate", "sphinx:reindex"
10
+ end
11
+
12
+ end
@@ -0,0 +1,11 @@
1
+ # Pull in cap extensions
2
+ require 'fdlcap/extensions/configuration'
3
+ require 'fdlcap/extensions/recipe_definition'
4
+
5
+ # Load external fdlcap dependencies
6
+ require 'eycap/recipes'
7
+
8
+ # Load up custom recipe chunks
9
+ Dir.glob(File.join(File.dirname(__FILE__),'recipes','*.rb')).each do |file|
10
+ require file
11
+ end
@@ -0,0 +1,9 @@
1
+ satisfy_any on;
2
+
3
+ <% for allow in nginx_auth_ip_masks -%>
4
+ <%= "allow #{allow};" %>
5
+ <% end -%>
6
+ deny all;
7
+
8
+ auth_basic "Restricted";
9
+ auth_basic_user_file /etc/nginx/conf/htpasswd;
@@ -0,0 +1,57 @@
1
+ # taken mostly from "The Rails Way" page 663
2
+
3
+ # user and group to run as
4
+ user <%= nginx_user %>;
5
+ # number of nginx workers
6
+ worker_processes <%= nginx_processes %>;
7
+ # pid of nginx master process
8
+ pid /var/run/nginx.pid;
9
+
10
+ error_log /var/log/nginx/default.error.log debug;
11
+ #error_log /var/log/nginx/error.log notice;
12
+ #error_log /var/log/nginx/error.log info;
13
+
14
+ # number of worker connections. 1024 is a good default
15
+ events {
16
+ worker_connections 1024;
17
+ use epoll; # linux only!
18
+ }
19
+
20
+
21
+ http {
22
+ # pull in mime-types. You can break out your config
23
+ # into as many include's as you want.
24
+ include /etc/nginx/mime.types;
25
+ # set a default type for the rare situation that nothing matches.
26
+ default_type application/octet-stream;
27
+ # configure log format
28
+ log_format main '$remote_addr - $remote_user [$time_local] $request '
29
+ '"$status" $body_bytes_sent "$http_referer" '
30
+ '"$http_user_agent" "$http_x_forwarded_for"';
31
+
32
+ # no sendfile on OS X
33
+ sendfile on;
34
+ tcp_nopush on;
35
+ tcp_nodelay on;
36
+
37
+ #keepalive_timeout 0;
38
+ keepalive_timeout 65;
39
+
40
+ <% if nginx_gzip_on %>
41
+ gzip on;
42
+ gzip_http_version 1.0;
43
+ gzip_comp_level 2;
44
+ gzip_proxied any;
45
+
46
+ <% if nginx_gzip_xml_on %>
47
+ # IE 6 doesn't pass compressed xml to flash. So if no flash xml consumption on site can add
48
+ # text/xml application/xml application/xml+rss
49
+ <% end %>
50
+ gzip_types text/plain text/html text/css application/x-javascript text/javascript;
51
+ <% end %>
52
+
53
+ access_log /var/log/nginx/nginx.default.access.log main;
54
+ error_log /var/log/nginx/nginx.default.error.log info;
55
+
56
+ include /etc/nginx/vhosts/*.conf;
57
+ }
@@ -0,0 +1,85 @@
1
+ # location of mongrel servers to proxy too
2
+ upstream mongrel_<%= application.gsub('.', '_') %> {
3
+ <% mongrel_port.upto(mongrel_port + mongrel_servers) do |port| %>
4
+ server 127.0.0.1:<%= port %>;
5
+ <% end %>
6
+ }
7
+
8
+ server {
9
+ # port to listen on. Can also be set to an IP:PORT
10
+ listen 80 <%= "default" if nginx_default_app %>;
11
+ # set max size for file uploads to 50mb
12
+ client_max_body_size 50M;
13
+ # sets the domain[s] that this vhost server requests for
14
+ # if two apps are on this box remove the ip and setup your hosts file
15
+ server_name <%= nginx_server_names %>;
16
+ # doc root
17
+ root <%= current_path %>/public;
18
+ # vhost specific logs
19
+ access_log <%= shared_path %>/log/<%= application %>.access.log main;
20
+ error_log <%= shared_path %>/log/<%= application %>.error.log notice;
21
+
22
+ # this rewrites all the requests to the maintenance.thml page if it exists in the doc root.
23
+ # this is for capistrano's disable web task
24
+ if (-f $document_root/system/maintenance.html) {
25
+ rewrite ^(.*)$ /system/maintenance.html last;
26
+ break;
27
+ }
28
+ # block access to paths containing .svn
29
+ location ~* ^.*\.svn.*$ {
30
+ internal;
31
+ }
32
+
33
+ location / {
34
+
35
+ <%= "include /etc/nginx/vhosts/#{application}.auth.conf" if nginx_http_auth_app %>
36
+
37
+ index index.html index.htm;
38
+ # forward the user's IP address to Rails
39
+ proxy_set_header X-Real-IP $remote_addr;
40
+ # needed for HTTPS must add an additional server block to configure it.
41
+ # see "The Rails Way" page 665 for more info
42
+ proxy_set_header X-FORWARD_PROTO https;
43
+ # Forward information about the client and host
44
+ # Otherwise our Rails app wouldn't have access to it
45
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
46
+ proxy_set_header Host $http_host;
47
+ proxy_redirect false;
48
+ proxy_max_temp_file_size 0;
49
+
50
+ # use this as a reference for a full production deployment
51
+ # do not use on a dev box. this adds far futures expires.
52
+ <%= "#" if nginx_far_future %> location ~ ^/(images|javascripts|stylesheets)/ {
53
+ <%= "#" if nginx_far_future %> expires 10y;
54
+ <%= "#" if nginx_far_future %> }
55
+
56
+ # if file exists break execution and serve up file for example files in images, javascripts, and stylesheets
57
+ if (-f $request_filename) {
58
+ break;
59
+ }
60
+ # Rails page caching, if file path plus index.html exists break execution and serve up file
61
+ if (-f $request_filename/index.html) {
62
+ rewrite (.*) $1/index.html break;
63
+ }
64
+ # Rails page caching, if file.html exists break execution and serve up file
65
+ if (-f $request_filename.html) {
66
+ rewrite (.*) $1.html break;
67
+ }
68
+ # if file does not exist forward to mongrel
69
+ if (!-f $request_filename) {
70
+ proxy_pass http://mongrel_<%= application.gsub('.', '_') %>;
71
+ break;
72
+ }
73
+ }
74
+ <% for location in nginx_auth_locations %>
75
+ location <%= location %> {
76
+ <%= "include /etc/nginx/vhosts/#{application}.auth.conf" %>
77
+ }
78
+ <% end %>
79
+ # must be an error so point to error page.
80
+ error_page 500 502 503 504 /500.html;
81
+ location = /500.html {
82
+ root <%= current_path %>/public;
83
+ }
84
+
85
+ }
data/lib/fdlcap.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Fdlcap
2
+
3
+ end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class FdlcapTest < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require 'fdlcap'
8
+
9
+ class Test::Unit::TestCase
10
+ end
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fdlcap
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.28
5
+ platform: ruby
6
+ authors:
7
+ - Factory Design Labs
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-08 00:00:00 -06:00
13
+ default_executable: fdlcap
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: engineyard-eycap
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.4.7
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: zilkey-auto_tagger
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.0.9
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: capistrano
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 2.5.5
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: capistrano-ext
47
+ type: :runtime
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 1.2.1
54
+ version:
55
+ description:
56
+ email: interactive@factorylabs.com
57
+ executables:
58
+ - fdlcap
59
+ extensions: []
60
+
61
+ extra_rdoc_files:
62
+ - LICENSE
63
+ - README.rdoc
64
+ files:
65
+ - LICENSE
66
+ - README.rdoc
67
+ - Rakefile
68
+ - VERSION
69
+ - bin/fdlcap
70
+ - examples/deploy.rb
71
+ - fdlcap.gemspec
72
+ - features/fdlcap.feature
73
+ - features/step_definitions/fdlcap_steps.rb
74
+ - features/support/env.rb
75
+ - lib/fdlcap.rb
76
+ - lib/fdlcap/extensions/configuration.rb
77
+ - lib/fdlcap/extensions/recipe_definition.rb
78
+ - lib/fdlcap/recipes.rb
79
+ - lib/fdlcap/recipes/autotagger.rb
80
+ - lib/fdlcap/recipes/check_revision.rb
81
+ - lib/fdlcap/recipes/craken.rb
82
+ - lib/fdlcap/recipes/database.rb
83
+ - lib/fdlcap/recipes/delayed_job.rb
84
+ - lib/fdlcap/recipes/deploy.rb
85
+ - lib/fdlcap/recipes/fdl_defaults.rb
86
+ - lib/fdlcap/recipes/geminstaller.rb
87
+ - lib/fdlcap/recipes/newrelic.rb
88
+ - lib/fdlcap/recipes/nginx.rb
89
+ - lib/fdlcap/recipes/passenger.rb
90
+ - lib/fdlcap/recipes/performance.rb
91
+ - lib/fdlcap/recipes/rake.rb
92
+ - lib/fdlcap/recipes/rolling_restart.rb
93
+ - lib/fdlcap/recipes/rsync.rb
94
+ - lib/fdlcap/recipes/ruby_inline.rb
95
+ - lib/fdlcap/recipes/sass.rb
96
+ - lib/fdlcap/recipes/sinatra_passenger.rb
97
+ - lib/fdlcap/recipes/slice.rb
98
+ - lib/fdlcap/recipes/ssh.rb
99
+ - lib/fdlcap/recipes/stages.rb
100
+ - lib/fdlcap/recipes/symlink_configs.rb
101
+ - lib/fdlcap/recipes/symlinks.rb
102
+ - lib/fdlcap/recipes/thin.rb
103
+ - lib/fdlcap/recipes/thinking_sphinx.rb
104
+ - lib/fdlcap/templates/nginx.auth.conf.erb
105
+ - lib/fdlcap/templates/nginx.conf.erb
106
+ - lib/fdlcap/templates/nginx.vhost.conf.erb
107
+ - test/fdlcap_test.rb
108
+ - test/test_helper.rb
109
+ has_rdoc: true
110
+ homepage: http://github.com/factorylabs/fdlcap
111
+ licenses: []
112
+
113
+ post_install_message:
114
+ rdoc_options:
115
+ - --charset=UTF-8
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: "0"
123
+ version:
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: "0"
129
+ version:
130
+ requirements: []
131
+
132
+ rubyforge_project:
133
+ rubygems_version: 1.3.5
134
+ signing_key:
135
+ specification_version: 3
136
+ summary: a set of capistrano recipies we use regularly at Factory Design Labs
137
+ test_files:
138
+ - test/fdlcap_test.rb
139
+ - test/test_helper.rb
140
+ - examples/deploy.rb