caploy 0.1.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/.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
|