mina-stack 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +62 -0
- data/Rakefile +1 -0
- data/lib/generators/mina/stack/install_generator.rb +43 -0
- data/lib/generators/mina/templates/deploy.rb +74 -0
- data/lib/generators/mina/templates/production.rb +13 -0
- data/lib/mina-stack/base.rb +30 -0
- data/lib/mina-stack/defaults.rb +108 -0
- data/lib/mina-stack/setup.rb +50 -0
- data/lib/mina-stack/version.rb +5 -0
- data/lib/mina-stack.rb +9 -0
- data/lib/recipes/bower.rb +43 -0
- data/lib/recipes/elastic_search.rb +31 -0
- data/lib/recipes/imagemagick.rb +11 -0
- data/lib/recipes/libs.rb +14 -0
- data/lib/recipes/memcached.rb +21 -0
- data/lib/recipes/monit.rb +54 -0
- data/lib/recipes/nginx.rb +49 -0
- data/lib/recipes/node.rb +12 -0
- data/lib/recipes/postgresql.rb +58 -0
- data/lib/recipes/private_pub.rb +35 -0
- data/lib/recipes/puma.rb +31 -0
- data/lib/recipes/rails.rb +22 -0
- data/lib/recipes/rbenv.rb +28 -0
- data/lib/recipes/redis.rb +23 -0
- data/lib/recipes/sidekiq.rb +42 -0
- data/lib/recipes/unicorn.rb +21 -0
- data/lib/templates/application.yml.erb +4 -0
- data/lib/templates/database.yml.erb +8 -0
- data/lib/templates/memcached.conf.erb +16 -0
- data/lib/templates/monit/memcached.erb +8 -0
- data/lib/templates/monit/monitrc.erb +21 -0
- data/lib/templates/monit/nginx.erb +5 -0
- data/lib/templates/monit/postgresql.erb +5 -0
- data/lib/templates/monit/private_pub.erb +6 -0
- data/lib/templates/monit/puma.erb +7 -0
- data/lib/templates/monit/redis.erb +4 -0
- data/lib/templates/monit/sidekiq.erb +6 -0
- data/lib/templates/monit/unicorn.erb +14 -0
- data/lib/templates/nginx.conf.erb +43 -0
- data/lib/templates/private_pub.yml.erb +4 -0
- data/lib/templates/puma.rb.erb +17 -0
- data/lib/templates/sidekiq.yml.erb +9 -0
- data/lib/templates/unicorn.rb.erb +41 -0
- data/lib/templates/unicorn_init.erb +86 -0
- data/lib/templates/upstart/puma.conf.erb +46 -0
- data/lib/templates/upstart/sidekiq.conf.erb +44 -0
- data/mina-stack.gemspec +25 -0
- data/mina-stack.rb +7 -0
- metadata +151 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
###########################################################################
|
2
|
+
# nginx Tasks
|
3
|
+
###########################################################################
|
4
|
+
|
5
|
+
namespace :nginx do
|
6
|
+
|
7
|
+
desc "Install latest stable release of nginx"
|
8
|
+
task :install do
|
9
|
+
invoke :sudo
|
10
|
+
queue "sudo add-apt-repository ppa:nginx/stable --yes"
|
11
|
+
queue "sudo apt-get -y update"
|
12
|
+
queue "sudo apt-get -y install nginx"
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Upload and update (link) all nginx config file"
|
16
|
+
task :setup => [:upload, :link, :reload]
|
17
|
+
|
18
|
+
desc "Symlink config file"
|
19
|
+
task :link do
|
20
|
+
invoke :sudo
|
21
|
+
queue %{echo "-----> Symlink nginx config file"}
|
22
|
+
queue echo_cmd %{sudo ln -fs "#{config_path}/nginx.conf" "#{nginx_config}"}
|
23
|
+
queue check_symlink nginx_config
|
24
|
+
queue echo_cmd %{sudo ln -fs "#{config_path}/nginx.conf" "#{nginx_config_e}"}
|
25
|
+
queue check_symlink nginx_config_e
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Parses nginx config file and uploads it to server"
|
29
|
+
task :upload do
|
30
|
+
template 'nginx.conf.erb', "#{config_path}/nginx.conf"
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "Parses config file and outputs it to STDOUT (local task)"
|
34
|
+
task :parse do
|
35
|
+
puts "#"*80
|
36
|
+
puts "# nginx.conf"
|
37
|
+
puts "#"*80
|
38
|
+
puts erb("#{config_templates_path}/nginx.conf.erb")
|
39
|
+
end
|
40
|
+
|
41
|
+
%w(stop start restart reload status).each do |action|
|
42
|
+
desc "#{action.capitalize} Nginx"
|
43
|
+
task action.to_sym do
|
44
|
+
invoke :sudo
|
45
|
+
queue %{echo "-----> #{action.capitalize} Nginx"}
|
46
|
+
queue echo_cmd "sudo service nginx #{action}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/recipes/node.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
namespace :node do
|
2
|
+
desc "Install the latest relase of Node.js"
|
3
|
+
task :install do
|
4
|
+
invoke :sudo
|
5
|
+
queue "sudo apt-get -y update"
|
6
|
+
queue "sudo apt-get -y install software-properties-common python-software-properties python g++ make"
|
7
|
+
queue "sudo add-apt-repository ppa:chris-lea/node.js --yes"
|
8
|
+
queue "sudo apt-get -y update"
|
9
|
+
queue "sudo apt-get -y install nodejs"
|
10
|
+
end
|
11
|
+
task(:setup) { }
|
12
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
namespace :postgresql do
|
2
|
+
|
3
|
+
require 'highline/import'
|
4
|
+
|
5
|
+
desc "Install the latest stable release of PostgreSQL."
|
6
|
+
task :install do
|
7
|
+
invoke :sudo
|
8
|
+
queue "sudo add-apt-repository ppa:pitti/postgresql --yes"
|
9
|
+
queue "sudo apt-get -y update"
|
10
|
+
queue "sudo apt-get -y install postgresql libpq-dev"
|
11
|
+
end
|
12
|
+
|
13
|
+
task :setup => [:upload]
|
14
|
+
|
15
|
+
desc "Create configuration and other files"
|
16
|
+
task :upload do
|
17
|
+
template "database.yml.erb"
|
18
|
+
queue %[echo "-----> Be sure to edit 'shared/config/database.yml'."]
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Create database"
|
22
|
+
task :create_db do
|
23
|
+
queue %{echo "-----> Create database"}
|
24
|
+
invoke :sudo
|
25
|
+
ask "PostgreSQL password:" do |psql_password|
|
26
|
+
psql_password.echo = "x"
|
27
|
+
queue echo_cmd %{sudo -u postgres psql -c "create user #{psql_user} with password '#{psql_password}';"}
|
28
|
+
queue echo_cmd %{sudo -u postgres psql -c "create database #{psql_database} owner #{psql_user};"}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
RYAML = <<-BASH
|
33
|
+
function ryaml {
|
34
|
+
ruby -ryaml -e 'puts ARGV[1..-1].inject(YAML.load(File.read(ARGV[0]))) {|acc, key| acc[key] }' "$@"
|
35
|
+
};
|
36
|
+
BASH
|
37
|
+
|
38
|
+
desc 'Pull remote db in development'
|
39
|
+
task :pull do
|
40
|
+
code = isolate do
|
41
|
+
invoke :environment
|
42
|
+
queue RYAML
|
43
|
+
queue "USERNAME=$(ryaml #{config_path!}/database.yml #{rails_env!} username)"
|
44
|
+
queue "PASSWORD=$(ryaml #{config_path!}/database.yml #{rails_env!} password)"
|
45
|
+
queue "DATABASE=$(ryaml #{config_path!}/database.yml #{rails_env!} database)"
|
46
|
+
queue %{echo "-----> Database $DATABASE will be dumped locally"}
|
47
|
+
queue "PGPASSWORD=$PASSWORD pg_dump -w -U $USERNAME $DATABASE -f #{tmp_path}/dump.sql"
|
48
|
+
queue "gzip -f #{tmp_path}/dump.sql"
|
49
|
+
run!
|
50
|
+
end
|
51
|
+
|
52
|
+
%x[scp #{user}@#{domain}:#{tmp_path}/dump.sql.gz .]
|
53
|
+
%x[gunzip -f dump.sql.gz]
|
54
|
+
%x[#{RYAML} psql -d $(ryaml config/database.yml development database) -f dump.sql]
|
55
|
+
%x[rm dump.sql]
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
namespace :private_pub do
|
2
|
+
|
3
|
+
task(:install) { }
|
4
|
+
|
5
|
+
desc "Setup Private Pub configuration"
|
6
|
+
task :setup => [:upload]
|
7
|
+
|
8
|
+
desc "Create configuration and other files"
|
9
|
+
task :upload do
|
10
|
+
template "private_pub.yml.erb", private_pub_config
|
11
|
+
queue %[echo "-----> Be sure to edit #{private_pub_config}."]
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Stop Private Pub"
|
15
|
+
task :stop do
|
16
|
+
queue %[ if [ -f #{private_pub_pid} ]; then
|
17
|
+
echo "-----> Stop Private Pub"
|
18
|
+
kill -s QUIT `cat #{private_pub_pid}` || true
|
19
|
+
fi ]
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "Start Private Pub"
|
23
|
+
task :start do
|
24
|
+
queue %{
|
25
|
+
echo "-----> Start Private Pub"
|
26
|
+
#{echo_cmd %[(cd #{deploy_to}/#{current_path}; #{private_pub_cmd} -s #{private_pub_server} -E #{rails_env} -P #{private_pub_pid} >> #{private_pub_log} 2>&1 </dev/null &) ] }
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Restart Private Pub"
|
31
|
+
task :restart do
|
32
|
+
invoke :'private_pub:stop'
|
33
|
+
invoke :'private_pub:start'
|
34
|
+
end
|
35
|
+
end
|
data/lib/recipes/puma.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
namespace :puma do
|
2
|
+
|
3
|
+
task(:install) { }
|
4
|
+
|
5
|
+
desc "Setup Puma configuration"
|
6
|
+
task :setup => [:upload]
|
7
|
+
|
8
|
+
desc "Create configuration and other files"
|
9
|
+
task :upload do
|
10
|
+
invoke :sudo
|
11
|
+
template "puma.rb.erb", puma_config
|
12
|
+
queue %[echo "-----> Be sure to edit #{puma_config}."]
|
13
|
+
template "upstart/puma.conf.erb", "/tmp/puma_conf"
|
14
|
+
queue "sudo mv /tmp/puma_conf #{puma_upstart}"
|
15
|
+
end
|
16
|
+
|
17
|
+
%w[start stop restart].each do |command|
|
18
|
+
desc "#{command.capitalize} puma"
|
19
|
+
task command do
|
20
|
+
# need to get rid of sudo here: have to figure out how it works with upstart
|
21
|
+
invoke :sudo
|
22
|
+
queue "sudo service #{puma_name} #{command}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "Phased-restart puma"
|
27
|
+
task :'phased-restart' do
|
28
|
+
queue "#{pumactl_cmd} -S #{puma_state} phased-restart"
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
namespace :rails do
|
2
|
+
|
3
|
+
task(:install) { }
|
4
|
+
task(:setup) { }
|
5
|
+
|
6
|
+
task :log do
|
7
|
+
queue 'echo "Contents of the log file are as follows:"'
|
8
|
+
queue "tail -f #{logs_path}/#{rails_env}.log"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
# desc "Open the rails console on one of the remote servers"
|
15
|
+
# task :console, :roles => :app do
|
16
|
+
# queue %{ssh #{domain} -t "#{default_shell} -c 'cd #{current_path} && bundle exec rails c #{rails_env}'"}
|
17
|
+
# end
|
18
|
+
|
19
|
+
# desc "remote rake task"
|
20
|
+
# task :rake do
|
21
|
+
# run "cd #{deploy_to}/current; RAILS_ENV=#{rails_env} rake #{ENV['TASK']}"
|
22
|
+
# end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
namespace :rbenv do
|
2
|
+
|
3
|
+
desc "Install rbenv, Ruby, and the Bundler gem"
|
4
|
+
task :install do
|
5
|
+
invoke :sudo
|
6
|
+
queue %{echo "-----> Installing Ruby"}
|
7
|
+
queue "sudo apt-get -y install curl git-core"
|
8
|
+
queue "curl -L https://raw.github.com/fesplugas/rbenv-installer/master/bin/rbenv-installer | bash"
|
9
|
+
bashrc = <<-BASHRC
|
10
|
+
if [ -d $HOME/.rbenv ]; then
|
11
|
+
export PATH="$HOME/.rbenv/bin:$PATH"
|
12
|
+
eval "$(rbenv init -)"
|
13
|
+
fi
|
14
|
+
BASHRC
|
15
|
+
put bashrc, "/tmp/rbenvrc"
|
16
|
+
queue "cat /tmp/rbenvrc ~/.bashrc > ~/.bashrc.tmp"
|
17
|
+
queue "mv ~/.bashrc.tmp ~/.bashrc"
|
18
|
+
queue %q{export PATH="$HOME/.rbenv/bin:$PATH"}
|
19
|
+
queue %q{eval "$(rbenv init -)"}
|
20
|
+
queue "sudo apt-get -y install build-essential zlib1g-dev libssl-dev libreadline-gplv2-dev"
|
21
|
+
queue "rbenv install #{ruby_version}"
|
22
|
+
queue "rbenv global #{ruby_version}"
|
23
|
+
queue "gem install bundler --no-ri --no-rdoc"
|
24
|
+
queue "rbenv rehash"
|
25
|
+
end
|
26
|
+
|
27
|
+
task(:setup) { }
|
28
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
namespace :redis do
|
2
|
+
|
3
|
+
desc "Install the latest release of Redis"
|
4
|
+
task :install do
|
5
|
+
invoke :sudo
|
6
|
+
queue %{echo "-----> Installing Redis..."}
|
7
|
+
queue "sudo add-apt-repository -y ppa:chris-lea/redis-server --yes"
|
8
|
+
queue "sudo apt-get -y update"
|
9
|
+
queue "sudo apt-get -y install redis-server"
|
10
|
+
end
|
11
|
+
|
12
|
+
task(:setup) { }
|
13
|
+
|
14
|
+
%w[start stop restart].each do |command|
|
15
|
+
desc "#{command} redis"
|
16
|
+
task command do
|
17
|
+
invoke :sudo
|
18
|
+
queue %{echo "-----> Trying to #{command} Redis..."}
|
19
|
+
queue "#{sudo} service redis #{command}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
namespace :sidekiq do
|
2
|
+
|
3
|
+
task(:install) { }
|
4
|
+
|
5
|
+
desc "Setup sidekiq configuration"
|
6
|
+
task :setup => [:upload]
|
7
|
+
|
8
|
+
desc "Create configuration and other files"
|
9
|
+
task :upload do
|
10
|
+
invoke :sudo
|
11
|
+
template "sidekiq.yml.erb", sidekiq_config
|
12
|
+
queue %[echo "-----> Be sure to edit #{sidekiq_config}."]
|
13
|
+
template "upstart/sidekiq.conf.erb", "/tmp/sidekiq_conf"
|
14
|
+
queue "sudo mv /tmp/sidekiq_conf #{sidekiq_upstart}"
|
15
|
+
end
|
16
|
+
|
17
|
+
# %w[quiet].each do |command|
|
18
|
+
# desc "#{command.capitalize} sidekiq"
|
19
|
+
# task command do
|
20
|
+
# queue %{ if [ -f #{sidekiq_pid} ]; then
|
21
|
+
# echo "-----> #{command.capitalize} sidekiq"
|
22
|
+
# #{echo_cmd %{(cd #{deploy_to}/#{current_path} && #{sidekiqctl_cmd} #{command} #{sidekiq_pid})} }
|
23
|
+
# fi }
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
|
27
|
+
# desc "Restart Sidekiq"
|
28
|
+
# task :restart do
|
29
|
+
# invoke :'sidekiq:stop'
|
30
|
+
# invoke :'sidekiq:start'
|
31
|
+
# end
|
32
|
+
|
33
|
+
# %w[start stop].each do |command|
|
34
|
+
# desc "#{command.capitalize} sidekiq"
|
35
|
+
# task command do
|
36
|
+
# # need to get rid of sudo here: have to figure out how it works with upstart
|
37
|
+
# invoke :sudo
|
38
|
+
# queue "sudo service #{sidekiq_name} #{command}"
|
39
|
+
# queue %[echo "-----> #{command.capitalize} sidekiq."]
|
40
|
+
# end
|
41
|
+
# end
|
42
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
namespace :unicorn do
|
2
|
+
|
3
|
+
task(:install) { }
|
4
|
+
|
5
|
+
desc "Setup Unicorn initializer and app configuration"
|
6
|
+
task :setup do
|
7
|
+
invoke :sudo
|
8
|
+
template "unicorn.rb.erb", unicorn_config
|
9
|
+
template "unicorn_init.erb", "/tmp/unicorn_init"
|
10
|
+
queue "chmod +x /tmp/unicorn_init"
|
11
|
+
queue "sudo mv /tmp/unicorn_init #{unicorn_script}"
|
12
|
+
queue "sudo update-rc.d -f #{unicorn_name} defaults"
|
13
|
+
end
|
14
|
+
|
15
|
+
%w[start stop restart].each do |command|
|
16
|
+
desc "#{command} unicorn"
|
17
|
+
task command do
|
18
|
+
queue "service #{unicorn_name} #{command}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
check process memcached with pidfile <%= memcached_pid! %>
|
2
|
+
start program = "/etc/init.d/memcached start"
|
3
|
+
stop program = "/etc/init.d/memcached stop"
|
4
|
+
if failed host 127.0.0.1 port 11211 then restart
|
5
|
+
if cpu > 60% for 2 cycles then alert
|
6
|
+
if cpu > 98% for 5 cycles then restart
|
7
|
+
if 2 restarts within 3 cycles then timeout
|
8
|
+
group cache
|
@@ -0,0 +1,21 @@
|
|
1
|
+
set daemon 30
|
2
|
+
|
3
|
+
set logfile /var/log/monit.log
|
4
|
+
set idfile /var/lib/monit/id
|
5
|
+
set statefile /var/lib/monit/state
|
6
|
+
|
7
|
+
set eventqueue
|
8
|
+
basedir /var/lib/monit/events
|
9
|
+
slots 100
|
10
|
+
|
11
|
+
# set mailserver smtp.gmail.com port 587
|
12
|
+
# username "foo@example.com" password "secret"
|
13
|
+
# using tlsv1
|
14
|
+
# with timeout 30 seconds
|
15
|
+
|
16
|
+
# set alert foo@example.com
|
17
|
+
|
18
|
+
set httpd port <%= monit_http_port %>
|
19
|
+
allow <%= monit_http_username %>:"<%= monit_http_password %>"
|
20
|
+
|
21
|
+
include /etc/monit/conf.d/*
|
@@ -0,0 +1,6 @@
|
|
1
|
+
check process <%= private_pub_name %>
|
2
|
+
with pidfile <%= private_pub_pid %>
|
3
|
+
start program = "<%= private_pub_start %>" with timeout 90 seconds
|
4
|
+
stop program = "kill -s TERM `cat <%= private_pub_config %>`" with timeout 90 seconds
|
5
|
+
if totalmem is greater than 200 MB for 2 cycles then restart # eating up memory?
|
6
|
+
group <%= private_pub_name %>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
check process <%= puma_name %> with pidfile <%= puma_pid %>
|
2
|
+
start program = "/sbin/start <%= puma_name %>"
|
3
|
+
stop program = "/sbin/stop <%= puma_name %>"
|
4
|
+
if cpu > 60% for 2 cycles then alert
|
5
|
+
if cpu > 98% for 5 cycles then restart
|
6
|
+
if 2 restarts within 3 cycles then timeout
|
7
|
+
if totalmem is greater than 300 MB for 10 cycles then restart
|
@@ -0,0 +1,6 @@
|
|
1
|
+
check process <%= sidekiq_name %>
|
2
|
+
with pidfile <%= sidekiq_pid %>
|
3
|
+
start program = "service <%= sidekiq_name %> start" with timeout 90 seconds
|
4
|
+
stop program = "service <%= sidekiq_name %> stop" with timeout 90 seconds
|
5
|
+
if totalmem is greater than 200 MB for 2 cycles then restart # eating up memory?
|
6
|
+
group sidekiq
|
@@ -0,0 +1,14 @@
|
|
1
|
+
check process <%= unicorn_name %> with pidfile <%= unicorn_pid %>
|
2
|
+
start program = "/etc/init.d/<%= unicorn_name %> start"
|
3
|
+
stop program = "/etc/init.d/<%= unicorn_name %> stop"
|
4
|
+
|
5
|
+
<% unicorn_workers.times do |n| %>
|
6
|
+
<% pid = unicorn_pid.sub(".pid", ".#{n}.pid") %>
|
7
|
+
check process <%= unicorn_name %>_worker_<%= n %> with pidfile <%= pid %>
|
8
|
+
start program = "/bin/true"
|
9
|
+
stop program = "/usr/bin/test -s <%= pid %> && /bin/kill -QUIT `cat <%= pid %>`"
|
10
|
+
if mem > 200.0 MB for 1 cycles then restart
|
11
|
+
if cpu > 50% for 3 cycles then restart
|
12
|
+
if 5 restarts within 5 cycles then timeout
|
13
|
+
if changed pid 2 times within 60 cycles then alert
|
14
|
+
<% end %>
|
@@ -0,0 +1,43 @@
|
|
1
|
+
<% rails_socket = server_stack.include?("puma") ? puma_socket : unicorn_socket %>
|
2
|
+
upstream <%= app %> {
|
3
|
+
server unix://<%= rails_socket %> fail_timeout=0;
|
4
|
+
}
|
5
|
+
|
6
|
+
server {
|
7
|
+
# listen 80 default deferred;
|
8
|
+
server_name <%= server_name %>;
|
9
|
+
keepalive_timeout 5;
|
10
|
+
|
11
|
+
root <%= deploy_to %>/<%= current_path %>/public;
|
12
|
+
|
13
|
+
client_max_body_size 4G;
|
14
|
+
|
15
|
+
if (-f $document_root/system/maintenance.html) {
|
16
|
+
return 503;
|
17
|
+
}
|
18
|
+
|
19
|
+
error_page 503 @maintenance;
|
20
|
+
location @maintenance {
|
21
|
+
rewrite ^(.*)$ /system/maintenance.html last;
|
22
|
+
break;
|
23
|
+
}
|
24
|
+
|
25
|
+
location ~ ^/(assets)/ {
|
26
|
+
gzip_static on;
|
27
|
+
expires max;
|
28
|
+
add_header Cache-Control public;
|
29
|
+
add_header Last-Modified "";
|
30
|
+
add_header ETag "";
|
31
|
+
}
|
32
|
+
|
33
|
+
location @rails {
|
34
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
35
|
+
proxy_set_header Host $http_host;
|
36
|
+
proxy_redirect off;
|
37
|
+
proxy_pass http://<%= app %>;
|
38
|
+
}
|
39
|
+
|
40
|
+
try_files $uri/index.html $uri @rails;
|
41
|
+
|
42
|
+
error_page 500 502 503 504 /500.html;
|
43
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Bind to a UNIX socket
|
2
|
+
bind "unix://<%= puma_socket %>"
|
3
|
+
activate_control_app "unix://<%= sockets_path %>/pumactl.sock"
|
4
|
+
|
5
|
+
# not deamonizing here - still can use -d flag
|
6
|
+
# daemonize true
|
7
|
+
environment "<%= rails_env %>"
|
8
|
+
directory '<%= "#{deploy_to!}/#{current_path!}" %>'
|
9
|
+
pidfile "<%= puma_pid %>"
|
10
|
+
state_path "<%= sockets_path %>/puma.state"
|
11
|
+
stdout_redirect '<%= puma_log %>', '<%= puma_error_log %>', true
|
12
|
+
|
13
|
+
workers <%= puma_workers %>
|
14
|
+
preload_app!
|
15
|
+
|
16
|
+
# 0-16 threads for production environment
|
17
|
+
# threads 0, 16
|
@@ -0,0 +1,41 @@
|
|
1
|
+
rails_root = "<%= "#{deploy_to!}/#{current_path!}" %>"
|
2
|
+
rails_env = "<%= rails_env %>"
|
3
|
+
pid_file = "<%= unicorn_pid %>"
|
4
|
+
socket_file= "<%= unicorn_socket %>"
|
5
|
+
log_file = "<%= unicorn_log %>"
|
6
|
+
err_log = "<%= unicorn_error_log %>"
|
7
|
+
old_pid = pid_file + '.oldbin'
|
8
|
+
|
9
|
+
timeout 60
|
10
|
+
worker_processes <%= unicorn_workers %>
|
11
|
+
|
12
|
+
# Listen on a Unix data socket
|
13
|
+
listen socket_file, :backlog => 2048
|
14
|
+
pid pid_file
|
15
|
+
|
16
|
+
stderr_path err_log
|
17
|
+
stdout_path log_file
|
18
|
+
|
19
|
+
preload_app true
|
20
|
+
|
21
|
+
GC.copy_on_write_friendly = true if GC.respond_to?(:copy_on_write_friendly=)
|
22
|
+
|
23
|
+
before_exec do |server|
|
24
|
+
ENV["BUNDLE_GEMFILE"] = "#{rails_root}/Gemfile"
|
25
|
+
end
|
26
|
+
|
27
|
+
before_fork do |server, worker|
|
28
|
+
# Using this method we get 0 downtime deploys.
|
29
|
+
if File.exists?(old_pid) && server.pid != old_pid
|
30
|
+
begin
|
31
|
+
Process.kill("QUIT", File.read(old_pid).to_i)
|
32
|
+
rescue Errno::ENOENT, Errno::ESRCH
|
33
|
+
# someone else did our job for us
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
after_fork do |server, worker|
|
39
|
+
child_pid = server.config[:pid].sub('.pid', ".#{worker.nr}.pid")
|
40
|
+
system("echo #{Process.pid} > #{child_pid}")
|
41
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
### BEGIN INIT INFO
|
3
|
+
# Provides: unicorn
|
4
|
+
# Required-Start: $remote_fs $syslog
|
5
|
+
# Required-Stop: $remote_fs $syslog
|
6
|
+
# Default-Start: 2 3 4 5
|
7
|
+
# Default-Stop: 0 1 6
|
8
|
+
# Short-Description: Manage unicorn server
|
9
|
+
# Description: Start, stop, restart unicorn server for a specific application.
|
10
|
+
### END INIT INFO
|
11
|
+
set -e
|
12
|
+
|
13
|
+
# Feel free to change any of the following variables for your app:
|
14
|
+
TIMEOUT=60
|
15
|
+
APP_ROOT="<%= "#{deploy_to!}/#{current_path!}" %>"
|
16
|
+
PID="<%= unicorn_pid %>"
|
17
|
+
CMD="<%= unicorn_cmd %>"
|
18
|
+
AS_USER="<%= unicorn_user %>"
|
19
|
+
ENVIRONMENT="<%= rails_env %>"
|
20
|
+
CONFIG="<%= unicorn_config %>"
|
21
|
+
set -u
|
22
|
+
|
23
|
+
OLD_PIN="$PID.oldbin"
|
24
|
+
|
25
|
+
sig () {
|
26
|
+
test -s "$PID" && kill -$1 `cat $PID`
|
27
|
+
}
|
28
|
+
|
29
|
+
oldsig () {
|
30
|
+
test -s $OLD_PIN && kill -$1 `cat $OLD_PIN`
|
31
|
+
}
|
32
|
+
|
33
|
+
run () {
|
34
|
+
if [ "$(id -un)" = "$AS_USER" ]; then
|
35
|
+
eval $1
|
36
|
+
else
|
37
|
+
su -c "$1" - $AS_USER
|
38
|
+
fi
|
39
|
+
}
|
40
|
+
|
41
|
+
case "$1" in
|
42
|
+
start)
|
43
|
+
sig 0 && echo >&2 "Already running" && exit 0
|
44
|
+
run "$CMD"
|
45
|
+
;;
|
46
|
+
stop)
|
47
|
+
sig QUIT && exit 0
|
48
|
+
echo >&2 "Not running"
|
49
|
+
;;
|
50
|
+
force-stop)
|
51
|
+
sig TERM && exit 0
|
52
|
+
echo >&2 "Not running"
|
53
|
+
;;
|
54
|
+
restart|reload)
|
55
|
+
sig USR2 && echo reloaded OK && exit 0
|
56
|
+
echo >&2 "Couldn't reload, starting '$CMD' instead"
|
57
|
+
run "$CMD"
|
58
|
+
;;
|
59
|
+
upgrade)
|
60
|
+
if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
|
61
|
+
then
|
62
|
+
n=$TIMEOUT
|
63
|
+
while test -s $OLD_PIN && test $n -ge 0
|
64
|
+
do
|
65
|
+
printf '.' && sleep 1 && n=$(( $n - 1 ))
|
66
|
+
done
|
67
|
+
echo
|
68
|
+
|
69
|
+
if test $n -lt 0 && test -s $OLD_PIN
|
70
|
+
then
|
71
|
+
echo >&2 "$OLD_PIN still exists after $TIMEOUT seconds"
|
72
|
+
exit 1
|
73
|
+
fi
|
74
|
+
exit 0
|
75
|
+
fi
|
76
|
+
echo >&2 "Couldn't upgrade, starting '$CMD' instead"
|
77
|
+
run "$CMD"
|
78
|
+
;;
|
79
|
+
reopen-logs)
|
80
|
+
sig USR1
|
81
|
+
;;
|
82
|
+
*)
|
83
|
+
echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
|
84
|
+
exit 1
|
85
|
+
;;
|
86
|
+
esac
|