caploy 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/README.md +12 -0
- data/Rakefile +2 -0
- data/caploy.gemspec +29 -0
- data/lib/caploy/recipes/airbrake.rb +4 -0
- data/lib/caploy/recipes/assets.rb +26 -0
- data/lib/caploy/recipes/bundler.rb +23 -0
- data/lib/caploy/recipes/database.rb +58 -0
- data/lib/caploy/recipes/defaults.rb +90 -0
- data/lib/caploy/recipes/info.rb +38 -0
- data/lib/caploy/recipes/monitoring.rb +12 -0
- data/lib/caploy/recipes/nginx.rb +108 -0
- data/lib/caploy/recipes/paperclip.rb +11 -0
- data/lib/caploy/recipes/passenger.rb +32 -0
- data/lib/caploy/recipes/puma.rb +25 -0
- data/lib/caploy/recipes/rbenv.rb +7 -0
- data/lib/caploy/recipes/redis.rb +41 -0
- data/lib/caploy/recipes/rvm.rb +8 -0
- data/lib/caploy/recipes/seeding.rb +9 -0
- data/lib/caploy/recipes/setup.rb +75 -0
- data/lib/caploy/recipes/symlink.rb +24 -0
- data/lib/caploy/recipes/unicorn.rb +43 -0
- data/lib/caploy/recipes/unicorn_bluepill.rb +90 -0
- data/lib/caploy/recipes/whenever.rb +8 -0
- data/lib/caploy/render.rb +8 -0
- data/lib/caploy/templates/bluepill/init.erb +9 -0
- data/lib/caploy/templates/bluepill/unicorn_config.rb.erb +43 -0
- data/lib/caploy/templates/nginx/vhost.erb +130 -0
- data/lib/caploy/templates/unicorn/unicorn.rb.erb +34 -0
- data/lib/caploy/version.rb +3 -0
- data/lib/caploy.rb +1 -0
- data/lib/examples/deploy.rb +73 -0
- data/lib/mysql.rb +109 -0
- data/lib/util.rb +10 -0
- metadata +225 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
data/Rakefile
ADDED
data/caploy.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/caploy/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Michael Schiller"]
|
6
|
+
gem.email = ["michael.schiller@gmx.de"]
|
7
|
+
gem.description = %q{capistrano deployment task for my projects}
|
8
|
+
gem.summary = %q{capistrano deployment task for my projects}
|
9
|
+
gem.homepage = "https://github.com/mschiller/caploy"
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "caploy"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
|
17
|
+
gem.add_dependency('gemcutter')
|
18
|
+
|
19
|
+
gem.add_dependency('capistrano', '>= 2.12.0')
|
20
|
+
gem.add_dependency('capistrano-ext', '>= 1.2.1')
|
21
|
+
gem.add_dependency('capistrano_colors', '>= 0.5.5')
|
22
|
+
gem.add_dependency('capistrano-unicorn', '>= 0.1.6')
|
23
|
+
gem.add_dependency('capistrano-file_db', '>= 0.1.0')
|
24
|
+
gem.add_dependency('capistrano-uptodate', '>= 0.0.2')
|
25
|
+
gem.add_dependency('rvm-capistrano', '>= 1.2.2')
|
26
|
+
gem.add_dependency('erubis')
|
27
|
+
|
28
|
+
gem.version = Caploy::VERSION
|
29
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
load 'deploy/assets' unless ENV['NOASSETS'] # http://guides.rubyonrails.org/asset_pipeline.html#in-production
|
4
|
+
|
5
|
+
set :assets_dir, 'system' unless exists?(:assets_dir)
|
6
|
+
set :local_assets_dir, 'public' unless exists?(:local_assets_dir)
|
7
|
+
|
8
|
+
namespace :assets do
|
9
|
+
namespace :local do
|
10
|
+
desc 'Synchronize your local assets using remote assets'
|
11
|
+
task :sync do
|
12
|
+
if Util.prompt "Are you sure you want to erase your local assets with server assets"
|
13
|
+
servers = find_servers :roles => :app
|
14
|
+
[assets_dir].flatten.each do |dir|
|
15
|
+
system("rsync -a --del --progress --rsh='ssh -p #{fetch(:ssh_port, 22)}' #{user}@#{servers.first}:#{shared_path}/#{dir}/ #{local_assets_dir}")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'Synchronize your local assets using remote assets'
|
22
|
+
task :pull do
|
23
|
+
assets.local.sync
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
# defaults
|
4
|
+
#_cset :bundle_gemfile, "Gemfile"
|
5
|
+
#_cset :bundle_dir, File.join(fetch(:shared_path), 'bundle')
|
6
|
+
#_cset :bundle_roles, #{role_default} # e.g. [:app, :batch]
|
7
|
+
#_cset :bundle_cmd, "/home/deploy/.rbenv/shims/bundle"
|
8
|
+
_cset :bundle_without, [:development, :test, :deploy]
|
9
|
+
# http://shapeshed.com/journal/using-rbenv-to-manage-rubies/
|
10
|
+
# you can also apply a clever technique to allow you switch versions of ruby by pushing a new .rbenv-version file with capistrano. From version 1.1rc bundler allows you to specify a shebang for binstubs. To use this add the following to your capistrano recipe.
|
11
|
+
_cset :bundle_flags, "--deployment --quiet --binstubs --shebang ruby-local-exec"
|
12
|
+
_cset :rake, 'bundle exec rake'
|
13
|
+
|
14
|
+
require 'bundler/capistrano'
|
15
|
+
|
16
|
+
namespace :bundler do
|
17
|
+
task :install_gem do
|
18
|
+
run "cd #{release_path} && gem install bundler --no-ri --no-rdoc"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
#before "bundle:install", "bundler:install_gem"
|
23
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do |instance|
|
2
|
+
|
3
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../util")
|
4
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../mysql")
|
5
|
+
|
6
|
+
instance.set :local_rails_env, ENV['RAILS_ENV'] || 'development' unless exists?(:local_rails_env)
|
7
|
+
instance.set :db_local_clean, false unless exists?(:db_local_clean)
|
8
|
+
|
9
|
+
namespace :db do
|
10
|
+
namespace :remote do
|
11
|
+
desc 'Synchronize the local database to the remote database'
|
12
|
+
task :sync, :roles => :db do
|
13
|
+
if if Util.prompt 'Are you sure you want to REPLACE THE REMOTE DATABASE with local database'
|
14
|
+
Database.local_to_remote(instance)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
namespace :local do
|
20
|
+
desc 'Synchronize your local database using remote database data'
|
21
|
+
task :sync, :roles => :db do
|
22
|
+
puts "Local database: #{Database::Local.new(instance).database}"
|
23
|
+
if rails_env == 'production'
|
24
|
+
puts 'Never sync remote production database!'
|
25
|
+
else
|
26
|
+
if Util.prompt 'Are you sure you want to erase your local database with server database'
|
27
|
+
Database.remote_to_local(instance)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
desc 'Synchronize your local database using remote database data'
|
34
|
+
task :pull do
|
35
|
+
db.local.sync
|
36
|
+
end
|
37
|
+
|
38
|
+
desc 'Synchronize the local database to the remote database'
|
39
|
+
task :push do
|
40
|
+
db.remote.sync
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
namespace :deploy do
|
46
|
+
after 'deploy:make_symlinks', 'deploy:dynamic_migrations' if fetch(:dynamic_migration, false)
|
47
|
+
|
48
|
+
task :dynamic_migrations do
|
49
|
+
from = source.next_revision(current_revision)
|
50
|
+
if capture("cd #{latest_release} && #{source.local.log(from)} db/migrate | wc -l").to_i > 0
|
51
|
+
run "cd #{current_release} && RAILS_ENV=#{rails_env} bundle exec rake db:migrate"
|
52
|
+
logger.info "New migrations added - running migrations."
|
53
|
+
else
|
54
|
+
logger.info "Skipping migrations - there are not any new."
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../util")
|
4
|
+
|
5
|
+
set :keep_releases, 10
|
6
|
+
set :use_sudo, false
|
7
|
+
|
8
|
+
set :protocol, :both
|
9
|
+
|
10
|
+
set :scm, :git
|
11
|
+
set :git_enable_submodules, false
|
12
|
+
|
13
|
+
# set deployment strategy
|
14
|
+
set :deploy_via, :remote_cache
|
15
|
+
set :copy_exclude, %w(.git .svn .DS_Store test doc .gitkeep)
|
16
|
+
#_cset :repository_cache, "cached-copy" # defaults to :shared_path + 'cached-copy/'
|
17
|
+
|
18
|
+
# :forward_agent allows us to avoid using and distributing a deploy key.
|
19
|
+
# On problems run 'ssh-add' locally
|
20
|
+
# In your /etc/ssh/ssh_config or ~/.ssh/config you need to have ForwardAgent enabled for this to work.
|
21
|
+
set :ssh_options, {:port => fetch(:ssh_port, 22), :forward_agent => true, :paranoid => true}
|
22
|
+
|
23
|
+
default_run_options[:pty] = true
|
24
|
+
|
25
|
+
# if you want to remove the dump file after loading
|
26
|
+
set :db_local_clean, true
|
27
|
+
|
28
|
+
task :test_and_prepare_cap_env do
|
29
|
+
abort "You must set :user before using defaults" unless fetch(:user, nil)
|
30
|
+
abort "You must set :repository before using defaults" unless fetch(:repository, nil)
|
31
|
+
abort "You must set :branch before using defaults" unless fetch(:branch, nil)
|
32
|
+
abort "You must set :deploy_to before using defaults" unless fetch(:deploy_to, nil)
|
33
|
+
|
34
|
+
set :uptodate_branch, fetch(:branch)
|
35
|
+
set :uptodate_scm, :git
|
36
|
+
#:uptodate_scm_bynary ('git') - path to SCM binary
|
37
|
+
#:uptodate_remote_repository ('origin') - remote repository
|
38
|
+
#:uptodate_time (60) - time in seconds for checking remote repository
|
39
|
+
#:uptodate_behaviour - (:confirm)
|
40
|
+
# :confirm - show outdated message and ask to confirm the further execution
|
41
|
+
# :abort - show outdated message and abort further execution
|
42
|
+
require 'capistrano/uptodate'
|
43
|
+
|
44
|
+
require 'capistrano_colors'
|
45
|
+
capistrano_color_matchers = [
|
46
|
+
{:match => /command finished/, :color => :hide, :prio => 10},
|
47
|
+
{:match => /executing command/, :color => :blue, :prio => 10, :attribute => :underscore},
|
48
|
+
{:match => /^transaction: commit$/, :color => :magenta, :prio => 10, :attribute => :blink},
|
49
|
+
{:match => /git/, :color => :white, :prio => 20, :attribute => :reverse},
|
50
|
+
]
|
51
|
+
colorize(capistrano_color_matchers)
|
52
|
+
|
53
|
+
#Dynamically skip Capistrano hooks example
|
54
|
+
# before 'deploy:update_code', 'db:dump' unless fetch(:skip_dump, false)
|
55
|
+
# $ cap staging deploy -S skip_dump=true
|
56
|
+
end
|
57
|
+
|
58
|
+
before 'deploy', 'test_and_prepare_cap_env'
|
59
|
+
before 'deploy:migrations', 'test_and_prepare_cap_env'
|
60
|
+
after 'deploy:update', 'deploy:cleanup'
|
61
|
+
|
62
|
+
desc "Show currently deployed revision on server."
|
63
|
+
task :revisions, :roles => :app do
|
64
|
+
current, previous, latest = current_revision[0, 7], previous_revision[0, 7], real_revision[0, 7]
|
65
|
+
puts "\n" << "-"*63
|
66
|
+
puts "===== Master Revision: \033[1;33m#{latest}\033[0m\n\n"
|
67
|
+
puts "===== [ \033[1;36m#{application.capitalize} - #{stage.to_s.capitalize}\033[0m ]"
|
68
|
+
puts "=== Deployed Revision: \033[1;32m#{current}\033[0m"
|
69
|
+
puts "=== Previous Revision: \033[1;32m#{previous}\033[0m\n\n"
|
70
|
+
|
71
|
+
# If deployed and master are the same, show the difference between the last 2 deployments.
|
72
|
+
base_label, new_label, base_rev, new_rev = latest != current ? \
|
73
|
+
["deployed", "master", current, latest] : \
|
74
|
+
["previous", "deployed", previous, current]
|
75
|
+
|
76
|
+
# Show difference between master and deployed revisions.
|
77
|
+
if (diff = `git log #{base_rev}..#{new_rev} --oneline`) != ""
|
78
|
+
# Colorize refs
|
79
|
+
diff.gsub!(/^([a-f0-9]+) /, "\033[1;32m\\1\033[0m - ")
|
80
|
+
diff = " " << diff.gsub("\n", "\n ") << "\n"
|
81
|
+
# Indent commit messages nicely, max 80 chars per line, line has to end with space.
|
82
|
+
diff = diff.split("\n").map { |l| l.scan(/.{1,120}/).join("\n"<<" "*14).gsub(/([^ ]*)\n {14}/m, "\n"<<" "*14<<"\\1") }.join("\n")
|
83
|
+
puts "=== Difference between #{base_label} revision and #{new_label} revision:\n\n"
|
84
|
+
puts diff
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
after "deploy", "revisions"
|
89
|
+
after "deploy:migrations", "revisions"
|
90
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
namespace :info do
|
4
|
+
desc <<-DESC
|
5
|
+
Tail all or a single remote file
|
6
|
+
|
7
|
+
The logfile can be specified with a LOGFILE-environment variable.
|
8
|
+
It defaults to RAILS_ENV.log
|
9
|
+
DESC
|
10
|
+
task :tail, :roles => :app do
|
11
|
+
ENV["LOGFILE"] ||= "#{rails_env}.log"
|
12
|
+
begin
|
13
|
+
stream "tail -f #{shared_path}/log/#{ENV["LOGFILE"]}"
|
14
|
+
rescue Interrupt
|
15
|
+
puts "\n--interrupted by user--"
|
16
|
+
puts ""
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Display the currently deployed Application, Revision and Release"
|
21
|
+
task :version, :roles => :app, :except => { :no_release => true } do
|
22
|
+
rev = current_revision
|
23
|
+
rel = current_release.split('/').pop
|
24
|
+
|
25
|
+
puts ""
|
26
|
+
puts " AppName: #{fetch(:application)}"
|
27
|
+
puts " Version: #{rev}"
|
28
|
+
puts " Release: #{rel}"
|
29
|
+
puts ""
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "Display the uname"
|
33
|
+
task :uname do
|
34
|
+
run "uname -a"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
desc "tail production log files"
|
4
|
+
task :tail_logs, :roles => :app do
|
5
|
+
run "tail -f #{shared_path}/log/*.log" do |channel, stream, data|
|
6
|
+
trap("INT") { puts 'Interupted'; exit 0; }
|
7
|
+
puts # for an extra line break before the host name
|
8
|
+
puts "#{channel[:host]}: #{data}"
|
9
|
+
break if stream == :err
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require "ms_deploy/render"
|
2
|
+
|
3
|
+
Capistrano::Configuration.instance.load do
|
4
|
+
|
5
|
+
namespace :nginx do
|
6
|
+
desc <<-DESC
|
7
|
+
Starts the nginx web-server.
|
8
|
+
DESC
|
9
|
+
task :start do
|
10
|
+
#run "sudo god start nginx"
|
11
|
+
run "sudo /etc/init.d/nginx start"
|
12
|
+
end
|
13
|
+
|
14
|
+
desc <<-DESC
|
15
|
+
#Stops the nginx web-server.
|
16
|
+
DESC
|
17
|
+
task :stop do
|
18
|
+
#run "sudo god stop nginx"
|
19
|
+
run "sudo /etc/init.d/nginx stop"
|
20
|
+
end
|
21
|
+
|
22
|
+
desc <<-DESC
|
23
|
+
Restarts the nginx web-server.
|
24
|
+
DESC
|
25
|
+
task :restart do
|
26
|
+
#run "sudo god restart nginx"
|
27
|
+
run "sudo /etc/init.d/nginx restart"
|
28
|
+
end
|
29
|
+
|
30
|
+
task :setup, :roles => :web do
|
31
|
+
protocol = fetch(:protocol, nil).to_s
|
32
|
+
template_path = File.expand_path('../../templates/nginx/vhost.erb', __FILE__)
|
33
|
+
vars = {
|
34
|
+
'application' => application,
|
35
|
+
'project_root' => deploy_to + '/current',
|
36
|
+
'domain' => vhost_domain, 'stage' => stage,
|
37
|
+
'auth_basic_title' => fetch(:auth_basic_title, nil),
|
38
|
+
'auth_basic_password_file' => fetch(:auth_basic_password_file, nil),
|
39
|
+
'protocol' => 'http',
|
40
|
+
'nginx_cert_dir' => fetch(:nginx_cert_dir, '/etc/nginx/cert'),
|
41
|
+
'with_upstream_server' => true,
|
42
|
+
'with_file_expire_max' => fetch(:with_file_expire_max, true),
|
43
|
+
'optional_http_content' => fetch(:optional_nginx_server_http_content, ''),
|
44
|
+
'optional_https_content' => fetch(:optional_nginx_server_https_content, ''),
|
45
|
+
'optional_nginx_http_content' => fetch(:optional_nginx_http_content, ''),
|
46
|
+
'optional_nginx_https_content' => fetch(:optional_nginx_https_content, ''),
|
47
|
+
'cert_type' => fetch(:cert_type, 'pem'),
|
48
|
+
'key_type' => fetch(:cert_type, 'key'),
|
49
|
+
'serve_static_files' => fetch(:serve_static_files, true),
|
50
|
+
}
|
51
|
+
|
52
|
+
sites_path = fetch(:nginx_sites_enabled_path, "/etc/nginx/sites-enabled")
|
53
|
+
|
54
|
+
if protocol.nil? or protocol == 'http' or protocol == 'both'
|
55
|
+
config_path = "#{shared_path}/config/#{application}_vhost.conf"
|
56
|
+
|
57
|
+
put(render_erb_template(template_path, vars), config_path)
|
58
|
+
|
59
|
+
with_user(fetch(:setup_user, user)) do
|
60
|
+
try_sudo "rm -f #{sites_path}/#{application}_#{stage}.conf"
|
61
|
+
try_sudo "ln -s #{config_path} #{sites_path}/#{application}_#{stage}.conf"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
if protocol == 'https' or protocol == 'both'
|
65
|
+
vars.merge!({'protocol' => 'https'})
|
66
|
+
|
67
|
+
config_path = "#{shared_path}/config/#{application}_ssl_vhost.conf"
|
68
|
+
|
69
|
+
put(render_erb_template(template_path, vars), config_path)
|
70
|
+
|
71
|
+
with_user(fetch(:setup_user, user)) do
|
72
|
+
try_sudo "rm -f #{sites_path}/#{application}_#{stage}_ssl.conf"
|
73
|
+
try_sudo "ln -s #{config_path} #{sites_path}/#{application}_#{stage}_ssl.conf"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
task :uninstall do
|
79
|
+
protocol = fetch(:protocol, nil)
|
80
|
+
sites_path = fetch(:nginx_sites_enabled_path, "/etc/nginx/sites-enabled")
|
81
|
+
|
82
|
+
with_user(fetch(:setup_user, user)) do
|
83
|
+
if protocol.blank? or protocol == 'http' or protocol == 'both'
|
84
|
+
try_sudo "rm -f #{sites_path}/#{application}_#{stage}.conf"
|
85
|
+
elsif protocol == 'https' or protocol == 'both'
|
86
|
+
try_sudo "rm -f #{sites_path}/#{application}_#{stage}_ssl.conf"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
after :"deploy:setup", :"nginx:setup";
|
93
|
+
|
94
|
+
def with_user(new_user, &block)
|
95
|
+
old_user = user
|
96
|
+
set :user, new_user
|
97
|
+
close_sessions
|
98
|
+
yield
|
99
|
+
set :user, old_user
|
100
|
+
close_sessions
|
101
|
+
end
|
102
|
+
|
103
|
+
def close_sessions
|
104
|
+
sessions.values.each { |session| session.close }
|
105
|
+
sessions.clear
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
namespace :deploy do
|
4
|
+
desc "build missing paperclip styles"
|
5
|
+
task :build_missing_paperclip_styles, :roles => :app do
|
6
|
+
run "cd #{release_path}; RAILS_ENV=#{rails_env} bundle exec rake paperclip:refresh:missing_styles"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
#after("deploy:update_code", "deploy:build_missing_paperclip_styles")
|
11
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
namespace :passenger do
|
4
|
+
desc "Restart Application"
|
5
|
+
task :restart do
|
6
|
+
run "touch #{current_path}/tmp/restart.txt"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
namespace :deploy do
|
11
|
+
#desc "Archive images from public tree"
|
12
|
+
#task :archive_images do
|
13
|
+
# run "tar -c public/system > images.tar"
|
14
|
+
#end
|
15
|
+
#
|
16
|
+
#desc "Install images into deployed public tree"
|
17
|
+
#task :install_images do
|
18
|
+
# # scp images to server
|
19
|
+
# # untar images into public/
|
20
|
+
#end
|
21
|
+
|
22
|
+
task :restart do
|
23
|
+
passenger.restart
|
24
|
+
end
|
25
|
+
|
26
|
+
task :start do
|
27
|
+
end
|
28
|
+
|
29
|
+
task :stop do
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
_cset :puma_binary, "bundle exec puma"
|
4
|
+
_cset :pumactl_binary, "bundle exec pumactl"
|
5
|
+
_cset :puma_state, "tmp/puma_state"
|
6
|
+
_cset :puma_tcp_port, 9292
|
7
|
+
_cset :puma_control_tcp_port, puma_tcp_port.to_i + 1
|
8
|
+
_cset :puma_thread_pool, '0:16'
|
9
|
+
|
10
|
+
namespace :deploy do
|
11
|
+
task :start, :roles => :app, :except => { :no_release => true } do
|
12
|
+
set :puma_socket, fetch(:puma_socket, "unix:///tmp/sockets/#{application}_#{rails_env}.sock")
|
13
|
+
|
14
|
+
tcp = puma_tcp_port.nil? ? '' : "-b tcp://127.0.0.1:#{puma_tcp_port}"
|
15
|
+
run "cd #{current_path} && RAILS_ENV=#{rails_env} #{puma_binary} -t #{puma_thread_pool} -S #{puma_state} --control tcp://127.0.0.1:#{puma_control_tcp_port} -b #{puma_socket} #{tcp}" # --control-token xxx
|
16
|
+
end
|
17
|
+
task :stop, :roles => :app, :except => { :no_release => true } do
|
18
|
+
run "cd #{current_path} && RAILS_ENV=#{rails_env} #{pumactl_binary} -S #{puma_state} stop"
|
19
|
+
end
|
20
|
+
task :restart, :roles => :app, :except => { :no_release => true } do
|
21
|
+
run "cd #{current_path} && RAILS_ENV=#{rails_env} #{pumactl_binary} -S #{puma_state} restart"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
namespace :redis do
|
4
|
+
|
5
|
+
desc "Install redis"
|
6
|
+
task :install do
|
7
|
+
["#{sudo} rm -r /tmp/redis",
|
8
|
+
"#{sudo} rm /usr/local/bin/redis-*",
|
9
|
+
"git clone git://github.com/antirez/redis.git /tmp/redis",
|
10
|
+
"cd /tmp/redis && git pull",
|
11
|
+
"cd /tmp/redis && git checkout v2.0.4-stable",
|
12
|
+
"cd /tmp/redis && make clean",
|
13
|
+
"cd /tmp/redis && make",
|
14
|
+
"cd /tmp/redis && #{sudo} make install",
|
15
|
+
"#{sudo} cp /tmp/redis/redis.conf /etc/",
|
16
|
+
"#{sudo} sed -i 's/daemonize no/daemonize yes/' /etc/redis.conf",
|
17
|
+
"#{sudo} sed -i 's/# bind 127.0.0.1/bind 127.0.0.1/' /etc/redis.conf"
|
18
|
+
].each {|cmd| run cmd}
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Start the Redis server"
|
22
|
+
task :start do
|
23
|
+
run "redis-server /etc/redis.conf"
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "Stop the Redis server"
|
27
|
+
task :stop do
|
28
|
+
run 'echo "SHUTDOWN" | nc localhost 6379'
|
29
|
+
#sudo 'kill `cat /var/run/redis.pid`'
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "Restart the Redis server"
|
33
|
+
task :restart do
|
34
|
+
redis.stop
|
35
|
+
sleep(1)
|
36
|
+
redis.start
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
abort "You must set :ruby_version before using defaults" unless fetch(:ruby_version)
|
3
|
+
|
4
|
+
#$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
|
5
|
+
require "rvm/capistrano"
|
6
|
+
set :rvm_ruby_string, fetch(:ruby_version)
|
7
|
+
set :rvm_type, :user
|
8
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
namespace :deploy do
|
4
|
+
namespace :prepare do
|
5
|
+
task :create_config_files, :roles => :app do
|
6
|
+
run "mkdir -p #{shared_path}/config/"
|
7
|
+
config_file_to_setup.each do |config_file|
|
8
|
+
put(File.read(config_file_path(config_file)), "#{shared_path}/config/#{config_file}", :via => :scp)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Set up shared directory structure"
|
13
|
+
task :create_shared_folders, :roles => :app do
|
14
|
+
directories_to_create.each { |directory| run "mkdir -p #{directory}" }
|
15
|
+
end
|
16
|
+
|
17
|
+
task :set_permissions, :roles => :app do
|
18
|
+
try_sudo "chown -R #{user}:#{fetch(:group, user)} #{deploy_to}" if fetch(:use_sudo, false)
|
19
|
+
end
|
20
|
+
|
21
|
+
task :database, :roles => :db do
|
22
|
+
_cset :db_admin_user, 'root'
|
23
|
+
_cset :db_admin_password, Capistrano::CLI.password_prompt("Type your mysql password for user '#{db_admin_user}' (not set if empty): ")
|
24
|
+
_cset :db_name, application.gsub(/\W+/, '')[0..5] + '_' + rails_env.to_s
|
25
|
+
_cset :db_user_name, application
|
26
|
+
_cset :db_user_password, ''
|
27
|
+
|
28
|
+
unless db_admin_password.to_s.empty?
|
29
|
+
unless database_exits?
|
30
|
+
create_database
|
31
|
+
end
|
32
|
+
setup_database_permissions
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
before 'deploy:setup', 'deploy:prepare:database';
|
39
|
+
before :'deploy:setup', :'deploy:prepare:create_config_files';
|
40
|
+
before :'deploy:setup', :'deploy:prepare:create_shared_folders';
|
41
|
+
after 'deploy:setup', 'deploy:prepare:set_permissions';
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
def config_file_path(config_file_name)
|
46
|
+
config_file = "#{rails_root}/config/#{config_file_name}"
|
47
|
+
raise "No config file '#{config_file}'" unless File.exists? config_file
|
48
|
+
config_file
|
49
|
+
end
|
50
|
+
|
51
|
+
def database_exits?
|
52
|
+
exists = false
|
53
|
+
|
54
|
+
run "mysql --user=#{db_admin_user} --password=#{db_admin_password} --execute=\"show databases;\"" do |channel, stream, data|
|
55
|
+
exists = exists || data.include?(db_name)
|
56
|
+
end
|
57
|
+
|
58
|
+
exists
|
59
|
+
end
|
60
|
+
|
61
|
+
def create_database
|
62
|
+
create_sql = <<-SQL
|
63
|
+
CREATE DATABASE #{db_name};
|
64
|
+
SQL
|
65
|
+
|
66
|
+
run "mysql --user=#{db_admin_user} --password=#{db_admin_password} --execute=\"#{create_sql}\""
|
67
|
+
end
|
68
|
+
|
69
|
+
def setup_database_permissions
|
70
|
+
grant_sql = <<-SQL
|
71
|
+
GRANT ALL PRIVILEGES ON #{db_name}.* TO #{db_user_name}@localhost IDENTIFIED BY '#{db_user_password}';
|
72
|
+
SQL
|
73
|
+
|
74
|
+
run "mysql --user=#{db_admin_user} --password=#{db_admin_password} --execute=\"#{grant_sql}\""
|
75
|
+
end
|