factorylabs-fdlcap 0.1.0 → 0.2.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/VERSION +1 -1
- data/fdlcap.gemspec +21 -18
- data/lib/fdlcap/defaults.rb +12 -0
- data/lib/fdlcap/extensions/configuration.rb +34 -0
- data/lib/fdlcap/extensions/recipe_definition.rb +14 -0
- data/lib/fdlcap/recipes.rb +11 -17
- data/lib/fdlcap/{autotagger.rb → recipes/autotagger.rb} +8 -2
- data/lib/fdlcap/recipes/craken.rb +5 -0
- data/lib/fdlcap/{database.rb → recipes/database.rb} +0 -0
- data/lib/fdlcap/{delayed_job.rb → recipes/delayed_job.rb} +0 -0
- data/lib/fdlcap/{deploy.rb → recipes/deploy.rb} +1 -1
- data/lib/fdlcap/recipes/geminstaller.rb +28 -0
- data/lib/fdlcap/{newrelic.rb → recipes/newrelic.rb} +2 -2
- data/lib/fdlcap/recipes/nginx.rb +102 -0
- data/lib/fdlcap/{performance.rb → recipes/performance.rb} +0 -0
- data/lib/fdlcap/{rake.rb → recipes/rake.rb} +0 -0
- data/lib/fdlcap/{rsync.rb → recipes/rsync.rb} +0 -0
- data/lib/fdlcap/recipes/sass.rb +20 -0
- data/lib/fdlcap/{slice.rb → recipes/slice.rb} +7 -6
- data/lib/fdlcap/{ssh.rb → recipes/ssh.rb} +0 -0
- data/lib/fdlcap/recipes/symlinks.rb +48 -0
- data/lib/fdlcap/recipes/thin.rb +119 -0
- data/lib/fdlcap/{thinking_sphinx.rb → recipes/thinking_sphinx.rb} +1 -2
- metadata +21 -18
- data/lib/fdlcap/craken.rb +0 -6
- data/lib/fdlcap/geminstaller.rb +0 -26
- data/lib/fdlcap/nginx.rb +0 -125
- data/lib/fdlcap/sass.rb +0 -13
- data/lib/fdlcap/symlinks.rb +0 -38
- data/lib/fdlcap/thin.rb +0 -112
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/fdlcap.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{fdlcap}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.2.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Factory Design Labs"]
|
@@ -27,27 +27,30 @@ Gem::Specification.new do |s|
|
|
27
27
|
"features/step_definitions/fdlcap_steps.rb",
|
28
28
|
"features/support/env.rb",
|
29
29
|
"lib/fdlcap.rb",
|
30
|
-
"lib/fdlcap/
|
31
|
-
"lib/fdlcap/
|
32
|
-
"lib/fdlcap/
|
33
|
-
"lib/fdlcap/delayed_job.rb",
|
34
|
-
"lib/fdlcap/deploy.rb",
|
35
|
-
"lib/fdlcap/geminstaller.rb",
|
36
|
-
"lib/fdlcap/newrelic.rb",
|
37
|
-
"lib/fdlcap/nginx.rb",
|
38
|
-
"lib/fdlcap/performance.rb",
|
39
|
-
"lib/fdlcap/rake.rb",
|
30
|
+
"lib/fdlcap/defaults.rb",
|
31
|
+
"lib/fdlcap/extensions/configuration.rb",
|
32
|
+
"lib/fdlcap/extensions/recipe_definition.rb",
|
40
33
|
"lib/fdlcap/recipes.rb",
|
41
|
-
"lib/fdlcap/
|
42
|
-
"lib/fdlcap/
|
43
|
-
"lib/fdlcap/
|
44
|
-
"lib/fdlcap/
|
45
|
-
"lib/fdlcap/
|
34
|
+
"lib/fdlcap/recipes/autotagger.rb",
|
35
|
+
"lib/fdlcap/recipes/craken.rb",
|
36
|
+
"lib/fdlcap/recipes/database.rb",
|
37
|
+
"lib/fdlcap/recipes/delayed_job.rb",
|
38
|
+
"lib/fdlcap/recipes/deploy.rb",
|
39
|
+
"lib/fdlcap/recipes/geminstaller.rb",
|
40
|
+
"lib/fdlcap/recipes/newrelic.rb",
|
41
|
+
"lib/fdlcap/recipes/nginx.rb",
|
42
|
+
"lib/fdlcap/recipes/performance.rb",
|
43
|
+
"lib/fdlcap/recipes/rake.rb",
|
44
|
+
"lib/fdlcap/recipes/rsync.rb",
|
45
|
+
"lib/fdlcap/recipes/sass.rb",
|
46
|
+
"lib/fdlcap/recipes/slice.rb",
|
47
|
+
"lib/fdlcap/recipes/ssh.rb",
|
48
|
+
"lib/fdlcap/recipes/symlinks.rb",
|
49
|
+
"lib/fdlcap/recipes/thin.rb",
|
50
|
+
"lib/fdlcap/recipes/thinking_sphinx.rb",
|
46
51
|
"lib/fdlcap/templates/nginx.auth.conf.erb",
|
47
52
|
"lib/fdlcap/templates/nginx.conf.erb",
|
48
53
|
"lib/fdlcap/templates/nginx.vhost.conf.erb",
|
49
|
-
"lib/fdlcap/thin.rb",
|
50
|
-
"lib/fdlcap/thinking_sphinx.rb",
|
51
54
|
"test/fdlcap_test.rb",
|
52
55
|
"test/test_helper.rb"
|
53
56
|
]
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
# Set up default stages for capistano-ext-multistage
|
4
|
+
unless exists?(:stages)
|
5
|
+
set :stages, [ :staging, :production ]
|
6
|
+
end
|
7
|
+
|
8
|
+
unless exists?(:default_stage)
|
9
|
+
set :default_stage, :staging
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class Capistrano::Configuration
|
2
|
+
|
3
|
+
##
|
4
|
+
# Print an informative message with asterisks.
|
5
|
+
|
6
|
+
def inform(message)
|
7
|
+
puts "#{'*' * (message.length + 4)}"
|
8
|
+
puts "* #{message} *"
|
9
|
+
puts "#{'*' * (message.length + 4)}"
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# Read a file and evaluate it as an ERB template.
|
14
|
+
# Path is relative to this file's directory.
|
15
|
+
|
16
|
+
def render_erb_template(filename)
|
17
|
+
template = File.read(filename)
|
18
|
+
result = ERB.new(template).result(binding)
|
19
|
+
end
|
20
|
+
|
21
|
+
##
|
22
|
+
# Run a command and return the result as a string.
|
23
|
+
#
|
24
|
+
# TODO May not work properly on multiple servers.
|
25
|
+
|
26
|
+
def run_and_return(cmd)
|
27
|
+
output = []
|
28
|
+
run cmd do |ch, st, data|
|
29
|
+
output << data
|
30
|
+
end
|
31
|
+
return output.to_s
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
set :fdlcap_recipes, {}
|
4
|
+
|
5
|
+
def define_recipe(name,&block)
|
6
|
+
recipes = fetch(:fdlcap_recipes)
|
7
|
+
recipes[name] = block
|
8
|
+
end
|
9
|
+
|
10
|
+
def use_recipe(recipe)
|
11
|
+
fetch(:fdlcap_recipes)[recipe].call
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
data/lib/fdlcap/recipes.rb
CHANGED
@@ -1,24 +1,15 @@
|
|
1
|
+
# Pull in cap extensions
|
2
|
+
require 'fdlcap/extensions/configuration'
|
3
|
+
require 'fdlcap/extensions/recipe_definition'
|
4
|
+
|
1
5
|
# Set up configuration defaults
|
2
|
-
|
3
|
-
unless exists?(:stages)
|
4
|
-
set :stages, [ :staging, :production ]
|
5
|
-
end
|
6
|
-
|
7
|
-
unless exists?(:use_release_tagger) && exists?(:autotagger_stages)
|
8
|
-
set :autotagger_stages, [ :ci, :staging, :production ]
|
9
|
-
end
|
10
|
-
|
11
|
-
unless exists?(:default_stage)
|
12
|
-
set :default_stage, :staging
|
13
|
-
end
|
14
|
-
end
|
6
|
+
require 'fdlcap/defaults'
|
15
7
|
|
16
|
-
# Load fdlcap dependencies
|
17
|
-
require 'release_tagger'
|
8
|
+
# Load external fdlcap dependencies
|
18
9
|
require 'capistrano/ext/multistage'
|
19
10
|
require 'eycap/recipes'
|
20
11
|
|
21
|
-
# Load up custom
|
12
|
+
# Load up custom recipe chunks
|
22
13
|
require 'fdlcap/recipes/autotagger'
|
23
14
|
require 'fdlcap/recipes/craken'
|
24
15
|
require 'fdlcap/recipes/database'
|
@@ -26,10 +17,13 @@ require 'fdlcap/recipes/delayed_job'
|
|
26
17
|
require 'fdlcap/recipes/deploy'
|
27
18
|
require 'fdlcap/recipes/geminstaller'
|
28
19
|
require 'fdlcap/recipes/newrelic'
|
20
|
+
require 'fdlcap/recipes/nginx'
|
29
21
|
require 'fdlcap/recipes/performance'
|
30
22
|
require 'fdlcap/recipes/rake'
|
31
23
|
require 'fdlcap/recipes/rsync'
|
32
24
|
require 'fdlcap/recipes/sass'
|
33
|
-
require 'fdlcap/recipes/ssh'
|
34
25
|
require 'fdlcap/recipes/slice'
|
26
|
+
require 'fdlcap/recipes/ssh'
|
27
|
+
require 'fdlcap/recipes/symlinks'
|
28
|
+
require 'fdlcap/recipes/thin'
|
35
29
|
require 'fdlcap/recipes/thinking_sphinx'
|
@@ -1,6 +1,12 @@
|
|
1
1
|
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
-
|
3
|
-
|
2
|
+
define_recipe :release_tagger do
|
3
|
+
# Set up some default stages
|
4
|
+
set :autotagger_stages, [ :ci, :staging, :production ] unless exists?(:autotagger_stages)
|
5
|
+
|
6
|
+
# This needs to be loaded after the stages are set up
|
7
|
+
require 'release_tagger'
|
8
|
+
|
9
|
+
# Run release tagger to get the right release for the deploy
|
4
10
|
before "deploy:update_code", "release_tagger:set_branch"
|
5
11
|
before "deploy:cleanup", "release_tagger:create_tag"
|
6
12
|
before "deploy:cleanup", "release_tagger:write_tag_to_shared"
|
File without changes
|
File without changes
|
@@ -17,7 +17,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
# Clean up old releases
|
20
|
-
|
20
|
+
define_recipe :perform_cleanup do
|
21
21
|
after "deploy", "deploy:cleanup"
|
22
22
|
after "deploy:migrations" , "deploy:cleanup"
|
23
23
|
after "deploy:long" , "deploy:cleanup"
|
@@ -0,0 +1,28 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
define_recipe :geminstaller do
|
3
|
+
#
|
4
|
+
# Tasks
|
5
|
+
#
|
6
|
+
namespace :geminstaller do
|
7
|
+
desc "Run geminstaller"
|
8
|
+
task :run, :only => { :geminstaller => true } do
|
9
|
+
sudo "/usr/bin/geminstaller -c #{release_path}/config/geminstaller.yml --geminstaller-output=all --rubygems-output=all"
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Install geminstaller"
|
13
|
+
task :install, :only => { :geminstaller => true } do
|
14
|
+
sudo "gem install geminstaller"
|
15
|
+
sudo "gem source -a http://gems.github.com"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
#
|
20
|
+
# Callbacks
|
21
|
+
#
|
22
|
+
after "deploy:setup", "geminstaller:install"
|
23
|
+
after "geminstaller:install", "geminstaller:run"
|
24
|
+
after "deploy:symlink", "geminstaller:run"
|
25
|
+
after "geminstaller:run", "deploy:migrate"
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
define_recipe :nginx do
|
4
|
+
#
|
5
|
+
# Configuration
|
6
|
+
#
|
7
|
+
|
8
|
+
# global vars
|
9
|
+
set :can_configure_nginx, true
|
10
|
+
set :nginx_user, 'nginx'
|
11
|
+
set :nginx_processes, 4
|
12
|
+
set :nginx_gzip_on, true
|
13
|
+
set :nginx_gzip_xml_on, false
|
14
|
+
|
15
|
+
# app specific vars
|
16
|
+
set :nginx_server_names, "_"
|
17
|
+
set :nginx_far_future, false
|
18
|
+
set :nginx_default_app, true
|
19
|
+
|
20
|
+
# http auth vars
|
21
|
+
set :nginx_auth_ip_masks, ['192.168.0.0/254']
|
22
|
+
set :nginx_http_auth_app, false
|
23
|
+
set :nginx_auth_locations, []
|
24
|
+
set :nginx_http_auth_users, []
|
25
|
+
|
26
|
+
#
|
27
|
+
# Tasks
|
28
|
+
#
|
29
|
+
|
30
|
+
namespace :nginx do
|
31
|
+
|
32
|
+
%w( start stop restart reload ).each do |cmd|
|
33
|
+
desc "#{cmd} your nginx servers"
|
34
|
+
task "#{cmd}".to_sym, :roles => :web do
|
35
|
+
default_run_options[:pty] = true
|
36
|
+
sudo "/etc/init.d/nginx #{cmd}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
desc "Setup Nginx vhost config"
|
41
|
+
task :vhost, :roles => :web do
|
42
|
+
result = render_erb_template(File.dirname(__FILE__) + "/templates/nginx.vhost.conf.erb")
|
43
|
+
put result, "/tmp/nginx.vhost.conf"
|
44
|
+
sudo "mkdir -p /etc/nginx/vhosts"
|
45
|
+
sudo "cp /tmp/nginx.vhost.conf /etc/nginx/vhosts/#{application}.conf"
|
46
|
+
inform "You must edit nginx.conf to include the vhost config file."
|
47
|
+
end
|
48
|
+
|
49
|
+
desc "Setup Nginx vhost auth config"
|
50
|
+
task :vhost_auth, :roles => :web do
|
51
|
+
result = render_erb_template(File.dirname(__FILE__) + "/templates/nginx.auth.conf.erb")
|
52
|
+
put result, "/tmp/nginx.auth.conf"
|
53
|
+
sudo "mkdir -p /etc/nginx/vhosts"
|
54
|
+
sudo "cp /tmp/nginx.vhost.conf /etc/nginx/vhosts/#{application}.auth.conf"
|
55
|
+
end
|
56
|
+
|
57
|
+
desc "Setup htpasswd file for nginx auth"
|
58
|
+
task :create_htpasswd, :roles => :web do
|
59
|
+
sudo "mkdir -p /etc/nginx/conf"
|
60
|
+
for user in nginx_http_auth_users
|
61
|
+
run "cd /etc/nginx/conf && htpasswd -b htpasswd #{user['name']} #{user['password']}"
|
62
|
+
# run <<-CMD
|
63
|
+
# cd /etc/nginx/conf;
|
64
|
+
# if [ ! -e /etc/nginx/conf/htpasswd ] ; then
|
65
|
+
# htpasswd -b -c htpasswd #{user['name']} #{user['password']};
|
66
|
+
# else
|
67
|
+
# htpasswd -b htpasswd #{user['name']} #{user['password']};
|
68
|
+
# fi
|
69
|
+
# CMD
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
desc "Setup Nginx.config"
|
74
|
+
task :conf, :roles => :web do
|
75
|
+
if can_configure_nginx
|
76
|
+
|
77
|
+
result = render_erb_template(File.dirname(__FILE__) + "/templates/nginx.conf.erb")
|
78
|
+
put result, "/tmp/nginx.conf"
|
79
|
+
sudo "cp /tmp/nginx.conf /etc/nginx/nginx.conf"
|
80
|
+
|
81
|
+
else
|
82
|
+
inform "Nginx configuration tasks have been disabled. Most likely you are deploying to engineyard which has it's own nginx conf setup."
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
desc "Setup Nginx vhost config and nginx.conf"
|
87
|
+
task :configure, :roles => :web do
|
88
|
+
if can_configure_nginx
|
89
|
+
|
90
|
+
conf
|
91
|
+
vhost
|
92
|
+
vhost_auth if nginx_auth_locations.length > 0 || nginx_http_auth_app
|
93
|
+
create_htpasswd if nginx_http_auth_users.length > 0
|
94
|
+
|
95
|
+
else
|
96
|
+
inform "Nginx configuration tasks have been disabled. Most likely you are deploying to engineyard which has it's own nginx conf setup."
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
define_recipe :sass do
|
3
|
+
#
|
4
|
+
# Tasks
|
5
|
+
#
|
6
|
+
namespace :sass do
|
7
|
+
desc 'Updates the stylesheets generated by Sass'
|
8
|
+
task :update, :roles => :app do
|
9
|
+
invoke_command "cd #{latest_release}; RAILS_ENV=#{rails_env} rake sass:update"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
#
|
14
|
+
# Callbacks
|
15
|
+
#
|
16
|
+
|
17
|
+
# Generate all the stylesheets manually (from their Sass templates) before each restart.
|
18
|
+
before 'deploy:restart', 'sass:update'
|
19
|
+
end
|
20
|
+
end
|
@@ -1,11 +1,6 @@
|
|
1
1
|
Capistrano::Configuration.instance(:must_exist).load do
|
2
2
|
|
3
3
|
namespace :slice do
|
4
|
-
|
5
|
-
desc "Copy the maintenance page from the public directory to the shared directory"
|
6
|
-
task :copy_maintenance_page, :roles => :app do
|
7
|
-
upload "public/maintenance.html","#{shared_path}/system/maintenance.html.custom", :via => :scp
|
8
|
-
end
|
9
4
|
|
10
5
|
desc "Tail the Rails import log for this environment"
|
11
6
|
task :tail_import_logs, :roles => :utility do
|
@@ -28,7 +23,13 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
28
23
|
end
|
29
24
|
|
30
25
|
# Deploy the custom maintenance page
|
31
|
-
|
26
|
+
define_recipe :custom_maintenance_page do
|
27
|
+
|
28
|
+
desc "Copy the maintenance page from the public directory to the shared directory"
|
29
|
+
task :copy_maintenance_page, :roles => :app do
|
30
|
+
upload "public/maintenance.html","#{shared_path}/system/maintenance.html.custom", :via => :scp
|
31
|
+
end
|
32
|
+
|
32
33
|
before "deploy:web:disable", "slice:copy_maintenance_page"
|
33
34
|
end
|
34
35
|
|
File without changes
|
@@ -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, :web] 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, :web] 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
|
@@ -1,6 +1,5 @@
|
|
1
1
|
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
-
|
3
|
-
if exists?(:use_thinking_sphinx)
|
2
|
+
define_recipe :thinking_sphinx do
|
4
3
|
after "deploy:update_code", "deploy:symlink_configs"
|
5
4
|
after "deploy:symlink_configs", "thinking_sphinx:symlink"
|
6
5
|
after "thinking_sphinx:symlink", "sphinx:configure"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: factorylabs-fdlcap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Factory Design Labs
|
@@ -74,27 +74,30 @@ files:
|
|
74
74
|
- features/step_definitions/fdlcap_steps.rb
|
75
75
|
- features/support/env.rb
|
76
76
|
- lib/fdlcap.rb
|
77
|
-
- lib/fdlcap/
|
78
|
-
- lib/fdlcap/
|
79
|
-
- lib/fdlcap/
|
80
|
-
- lib/fdlcap/delayed_job.rb
|
81
|
-
- lib/fdlcap/deploy.rb
|
82
|
-
- lib/fdlcap/geminstaller.rb
|
83
|
-
- lib/fdlcap/newrelic.rb
|
84
|
-
- lib/fdlcap/nginx.rb
|
85
|
-
- lib/fdlcap/performance.rb
|
86
|
-
- lib/fdlcap/rake.rb
|
77
|
+
- lib/fdlcap/defaults.rb
|
78
|
+
- lib/fdlcap/extensions/configuration.rb
|
79
|
+
- lib/fdlcap/extensions/recipe_definition.rb
|
87
80
|
- lib/fdlcap/recipes.rb
|
88
|
-
- lib/fdlcap/
|
89
|
-
- lib/fdlcap/
|
90
|
-
- lib/fdlcap/
|
91
|
-
- lib/fdlcap/
|
92
|
-
- lib/fdlcap/
|
81
|
+
- lib/fdlcap/recipes/autotagger.rb
|
82
|
+
- lib/fdlcap/recipes/craken.rb
|
83
|
+
- lib/fdlcap/recipes/database.rb
|
84
|
+
- lib/fdlcap/recipes/delayed_job.rb
|
85
|
+
- lib/fdlcap/recipes/deploy.rb
|
86
|
+
- lib/fdlcap/recipes/geminstaller.rb
|
87
|
+
- lib/fdlcap/recipes/newrelic.rb
|
88
|
+
- lib/fdlcap/recipes/nginx.rb
|
89
|
+
- lib/fdlcap/recipes/performance.rb
|
90
|
+
- lib/fdlcap/recipes/rake.rb
|
91
|
+
- lib/fdlcap/recipes/rsync.rb
|
92
|
+
- lib/fdlcap/recipes/sass.rb
|
93
|
+
- lib/fdlcap/recipes/slice.rb
|
94
|
+
- lib/fdlcap/recipes/ssh.rb
|
95
|
+
- lib/fdlcap/recipes/symlinks.rb
|
96
|
+
- lib/fdlcap/recipes/thin.rb
|
97
|
+
- lib/fdlcap/recipes/thinking_sphinx.rb
|
93
98
|
- lib/fdlcap/templates/nginx.auth.conf.erb
|
94
99
|
- lib/fdlcap/templates/nginx.conf.erb
|
95
100
|
- lib/fdlcap/templates/nginx.vhost.conf.erb
|
96
|
-
- lib/fdlcap/thin.rb
|
97
|
-
- lib/fdlcap/thinking_sphinx.rb
|
98
101
|
- test/fdlcap_test.rb
|
99
102
|
- test/test_helper.rb
|
100
103
|
has_rdoc: false
|
data/lib/fdlcap/craken.rb
DELETED
data/lib/fdlcap/geminstaller.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
-
namespace :geminstaller do
|
3
|
-
desc "Run geminstaller"
|
4
|
-
task :run, :only => { :geminstaller => true } do
|
5
|
-
sudo "/usr/bin/geminstaller -c #{release_path}/config/geminstaller.yml --geminstaller-output=all --rubygems-output=all"
|
6
|
-
end
|
7
|
-
|
8
|
-
desc "Install geminstaller"
|
9
|
-
task :install, :only => { :geminstaller => true } do
|
10
|
-
sudo "gem install geminstaller"
|
11
|
-
sudo "gem source -a http://gems.github.com"
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
#
|
16
|
-
# Configure Callbacks
|
17
|
-
#
|
18
|
-
# Run geminstaller to make sure gems are installed.
|
19
|
-
if exists?(:use_geminstaller)
|
20
|
-
after "deploy:setup", "geminstaller:install"
|
21
|
-
after "geminstaller:install", "geminstaller:run"
|
22
|
-
after "deploy:symlink", "geminstaller:run"
|
23
|
-
after "geminstaller:run", "deploy:migrate"
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
data/lib/fdlcap/nginx.rb
DELETED
@@ -1,125 +0,0 @@
|
|
1
|
-
|
2
|
-
#global vars
|
3
|
-
set(:can_configure_nginx, true)
|
4
|
-
set(:nginx_user, 'nginx')
|
5
|
-
set(:nginx_processes, 4)
|
6
|
-
set(:nginx_gzip_on, true)
|
7
|
-
set(:nginx_gzip_xml_on, false)
|
8
|
-
|
9
|
-
# app specific vars
|
10
|
-
set(:nginx_server_names, "_")
|
11
|
-
set(:nginx_far_future, false)
|
12
|
-
set(:nginx_default_app, true)
|
13
|
-
|
14
|
-
#http auth vars
|
15
|
-
set(:nginx_auth_ip_masks, ['192.168.0.0/254'])
|
16
|
-
set(:nginx_http_auth_app, false)
|
17
|
-
set(:nginx_auth_locations, [])
|
18
|
-
set(:nginx_http_auth_users, [])
|
19
|
-
|
20
|
-
namespace :nginx do
|
21
|
-
|
22
|
-
%w( start stop restart reload ).each do |cmd|
|
23
|
-
desc "#{cmd} your nginx servers"
|
24
|
-
task "#{cmd}".to_sym, :roles => :web do
|
25
|
-
default_run_options[:pty] = true
|
26
|
-
sudo "/etc/init.d/nginx #{cmd}"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
desc "Setup Nginx vhost config"
|
31
|
-
task :vhost, :roles => :web do
|
32
|
-
result = render_erb_template(File.dirname(__FILE__) + "/templates/nginx.vhost.conf.erb")
|
33
|
-
put result, "/tmp/nginx.vhost.conf"
|
34
|
-
sudo "mkdir -p /etc/nginx/vhosts"
|
35
|
-
sudo "cp /tmp/nginx.vhost.conf /etc/nginx/vhosts/#{application}.conf"
|
36
|
-
inform "You must edit nginx.conf to include the vhost config file."
|
37
|
-
end
|
38
|
-
|
39
|
-
desc "Setup Nginx vhost auth config"
|
40
|
-
task :vhost_auth, :roles => :web do
|
41
|
-
result = render_erb_template(File.dirname(__FILE__) + "/templates/nginx.auth.conf.erb")
|
42
|
-
put result, "/tmp/nginx.auth.conf"
|
43
|
-
sudo "mkdir -p /etc/nginx/vhosts"
|
44
|
-
sudo "cp /tmp/nginx.vhost.conf /etc/nginx/vhosts/#{application}.auth.conf"
|
45
|
-
end
|
46
|
-
|
47
|
-
desc "Setup htpasswd file for nginx auth"
|
48
|
-
task :create_htpasswd, :roles => :web do
|
49
|
-
sudo "mkdir -p /etc/nginx/conf"
|
50
|
-
for user in nginx_http_auth_users
|
51
|
-
run "cd /etc/nginx/conf && htpasswd -b htpasswd #{user['name']} #{user['password']}"
|
52
|
-
# run <<-CMD
|
53
|
-
# cd /etc/nginx/conf;
|
54
|
-
# if [ ! -e /etc/nginx/conf/htpasswd ] ; then
|
55
|
-
# htpasswd -b -c htpasswd #{user['name']} #{user['password']};
|
56
|
-
# else
|
57
|
-
# htpasswd -b htpasswd #{user['name']} #{user['password']};
|
58
|
-
# fi
|
59
|
-
# CMD
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
desc "Setup Nginx.config"
|
64
|
-
task :conf, :roles => :web do
|
65
|
-
if can_configure_nginx
|
66
|
-
|
67
|
-
result = render_erb_template(File.dirname(__FILE__) + "/templates/nginx.conf.erb")
|
68
|
-
put result, "/tmp/nginx.conf"
|
69
|
-
sudo "cp /tmp/nginx.conf /etc/nginx/nginx.conf"
|
70
|
-
|
71
|
-
else
|
72
|
-
inform "Nginx configuration tasks have been disabled. Most likely you are deploying to engineyard which has it's own nginx conf setup."
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
desc "Setup Nginx vhost config and nginx.conf"
|
77
|
-
task :configure, :roles => :web do
|
78
|
-
if can_configure_nginx
|
79
|
-
|
80
|
-
conf
|
81
|
-
vhost
|
82
|
-
vhost_auth if nginx_auth_locations.length > 0 || nginx_http_auth_app
|
83
|
-
create_htpasswd if nginx_http_auth_users.length > 0
|
84
|
-
|
85
|
-
else
|
86
|
-
inform "Nginx configuration tasks have been disabled. Most likely you are deploying to engineyard which has it's own nginx conf setup."
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
end
|
91
|
-
|
92
|
-
class Capistrano::Configuration
|
93
|
-
|
94
|
-
##
|
95
|
-
# Print an informative message with asterisks.
|
96
|
-
|
97
|
-
def inform(message)
|
98
|
-
puts "#{'*' * (message.length + 4)}"
|
99
|
-
puts "* #{message} *"
|
100
|
-
puts "#{'*' * (message.length + 4)}"
|
101
|
-
end
|
102
|
-
|
103
|
-
##
|
104
|
-
# Read a file and evaluate it as an ERB template.
|
105
|
-
# Path is relative to this file's directory.
|
106
|
-
|
107
|
-
def render_erb_template(filename)
|
108
|
-
template = File.read(filename)
|
109
|
-
result = ERB.new(template).result(binding)
|
110
|
-
end
|
111
|
-
|
112
|
-
##
|
113
|
-
# Run a command and return the result as a string.
|
114
|
-
#
|
115
|
-
# TODO May not work properly on multiple servers.
|
116
|
-
|
117
|
-
def run_and_return(cmd)
|
118
|
-
output = []
|
119
|
-
run cmd do |ch, st, data|
|
120
|
-
output << data
|
121
|
-
end
|
122
|
-
return output.to_s
|
123
|
-
end
|
124
|
-
|
125
|
-
end
|
data/lib/fdlcap/sass.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
-
namespace :sass do
|
3
|
-
desc 'Updates the stylesheets generated by Sass'
|
4
|
-
task :update, :roles => :app do
|
5
|
-
invoke_command "cd #{latest_release}; RAILS_ENV=#{rails_env} rake sass:update"
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
# Generate all the stylesheets manually (from their Sass templates) before each restart.
|
10
|
-
if exists?(:use_sass)
|
11
|
-
before 'deploy:restart', 'sass:update'
|
12
|
-
end
|
13
|
-
end
|
data/lib/fdlcap/symlinks.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
after "deploy:update_code", "symlinks:create"
|
2
|
-
|
3
|
-
set(:symlink_dirs, [])
|
4
|
-
set(:symlink_absolute_dirs, [])
|
5
|
-
|
6
|
-
namespace :symlinks do
|
7
|
-
|
8
|
-
desc <<-DESC
|
9
|
-
fix symlinks to shared directory
|
10
|
-
DESC
|
11
|
-
task :fix, :roles => [:app, :web] do
|
12
|
-
# for folders stored under public
|
13
|
-
symlink_dirs.each do |share|
|
14
|
-
run "rm -rf #{current_path}/#{share}"
|
15
|
-
run "mkdir -p #{shared_path}/#{share}"
|
16
|
-
run "ln -nfs #{shared_path}/#{share} #{current_path}/#{share}"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
desc <<-DESC
|
21
|
-
create symlinks to shared directory
|
22
|
-
DESC
|
23
|
-
task :create, :roles => [:app, :web] do
|
24
|
-
# for folders stored under public
|
25
|
-
symlink_dirs.each do |share|
|
26
|
-
run "rm -rf #{release_path}/#{share}"
|
27
|
-
run "mkdir -p #{shared_path}/#{share}"
|
28
|
-
run "ln -nfs #{shared_path}/#{share} #{release_path}/#{share}"
|
29
|
-
end
|
30
|
-
|
31
|
-
symlink_absolute_dirs.each do |share|
|
32
|
-
run "rm -rf #{share[:symlink]}"
|
33
|
-
run "mkdir -p #{share[:source]}"
|
34
|
-
run "ln -nfs #{share[:source]} #{share[:symlink]}"
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
data/lib/fdlcap/thin.rb
DELETED
@@ -1,112 +0,0 @@
|
|
1
|
-
set :thin_servers, 2
|
2
|
-
set :thin_port, 8000
|
3
|
-
set :thin_address, "127.0.0.1"
|
4
|
-
set :thin_environment, "production"
|
5
|
-
set :thin_conf, nil
|
6
|
-
set :thin_user, nil
|
7
|
-
set :thin_group, nil
|
8
|
-
set :thin_prefix, nil
|
9
|
-
set :thin_pid_file, nil
|
10
|
-
set :thin_log_file, nil
|
11
|
-
set :thin_config_script, nil
|
12
|
-
|
13
|
-
namespace :thin do
|
14
|
-
desc <<-DESC
|
15
|
-
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
|
16
|
-
set to true.
|
17
|
-
DESC
|
18
|
-
task :install , :roles => :app do
|
19
|
-
send(run_method, "gem install thin")
|
20
|
-
send(run_method, "thin install")
|
21
|
-
end
|
22
|
-
|
23
|
-
desc <<-DESC
|
24
|
-
Configure thin processes on the app server. This uses the :use_sudo
|
25
|
-
variable to determine whether to use sudo or not. By default, :use_sudo is
|
26
|
-
set to true.
|
27
|
-
DESC
|
28
|
-
task :configure, :roles => :app do
|
29
|
-
set_conf
|
30
|
-
|
31
|
-
argv = []
|
32
|
-
argv << "thin"
|
33
|
-
argv << "-s #{thin_servers.to_s}"
|
34
|
-
argv << "-p #{thin_port.to_s}"
|
35
|
-
argv << "-e #{thin_environment}"
|
36
|
-
argv << "-a #{thin_address}"
|
37
|
-
argv << "-c #{current_path}"
|
38
|
-
argv << "-C #{thin_conf}"
|
39
|
-
argv << "-P #{thin_pid_file}" if thin_pid_file
|
40
|
-
argv << "-l #{thin_log_file}" if thin_log_file
|
41
|
-
argv << "--user #{thin_user}" if thin_user
|
42
|
-
argv << "--group #{thin_group}" if thin_group
|
43
|
-
argv << "--prefix #{thin_prefix}" if thin_prefix
|
44
|
-
argv << "config"
|
45
|
-
cmd = argv.join " "
|
46
|
-
send(run_method, cmd)
|
47
|
-
end
|
48
|
-
|
49
|
-
task :setup, :roles => :app do
|
50
|
-
thin.install
|
51
|
-
thin.configure
|
52
|
-
end
|
53
|
-
|
54
|
-
desc <<-DESC
|
55
|
-
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
|
56
|
-
set to true.
|
57
|
-
DESC
|
58
|
-
task :start , :roles => :app do
|
59
|
-
set_conf
|
60
|
-
cmd = "thin start -C #{thin_conf}"
|
61
|
-
send(run_method, cmd)
|
62
|
-
end
|
63
|
-
|
64
|
-
desc <<-DESC
|
65
|
-
Restart the Thin processes on the app server by starting and stopping the cluster. This uses the :use_sudo
|
66
|
-
variable to determine whether to use sudo or not. By default, :use_sudo is set to true.
|
67
|
-
DESC
|
68
|
-
task :restart , :roles => :app do
|
69
|
-
set_conf
|
70
|
-
cmd = "thin restart -C #{thin_conf}"
|
71
|
-
send(run_method, cmd)
|
72
|
-
end
|
73
|
-
|
74
|
-
desc <<-DESC
|
75
|
-
Stop the Thin processes on the app server. This uses the :use_sudo
|
76
|
-
variable to determine whether to use sudo or not. By default, :use_sudo is
|
77
|
-
set to true.
|
78
|
-
DESC
|
79
|
-
task :stop , :roles => :app do
|
80
|
-
set_conf
|
81
|
-
cmd = "thin stop -C #{thin_conf}"
|
82
|
-
send(run_method, cmd)
|
83
|
-
end
|
84
|
-
|
85
|
-
|
86
|
-
def set_conf
|
87
|
-
set :thin_conf, "/etc/thin/#{application}.yml" unless thin_conf
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
namespace :deploy do
|
92
|
-
desc <<-DESC
|
93
|
-
Restart the Thin processes on the app server by calling thin:restart.
|
94
|
-
DESC
|
95
|
-
task :restart, :roles => :app do
|
96
|
-
thin.restart
|
97
|
-
end
|
98
|
-
|
99
|
-
desc <<-DESC
|
100
|
-
Start the Thin processes on the app server by calling thin:start.
|
101
|
-
DESC
|
102
|
-
task :start, :roles => :app do
|
103
|
-
thin.start
|
104
|
-
end
|
105
|
-
|
106
|
-
desc <<-DESC
|
107
|
-
Stop the Thin processes on the app server by calling thin:stop.
|
108
|
-
DESC
|
109
|
-
task :stop, :roles => :app do
|
110
|
-
thin.stop
|
111
|
-
end
|
112
|
-
end
|