Updated unicorn config

Updated gem versions
Removed foreman
This commit is contained in:
Luke Barratt 2014-03-25 11:15:49 +00:00
parent 28a1112a1c
commit 913bb3bb48
8 changed files with 77 additions and 111 deletions

View file

@ -1,7 +1,9 @@
RAILS_ENV= RAILS_ENV=
APP_SECRET= APP_SECRET=
UNICORN_WORKERS=3 UNICORN_USER=deploy
UNICORN_GROUP=deploy
UNICORN_WORKERS=4
UNICORN_PORT=5000 UNICORN_PORT=5000
UNICORN_SOCKET=/tmp/unicorn.ensl.sock UNICORN_SOCKET=/tmp/unicorn.ensl.sock

View file

@ -3,5 +3,6 @@ require 'capistrano/deploy'
require 'capistrano/rbenv' require 'capistrano/rbenv'
require 'capistrano/bundler' require 'capistrano/bundler'
require 'capistrano/rails' require 'capistrano/rails'
require 'capistrano3/unicorn'
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r } Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }

15
Gemfile
View file

@ -4,22 +4,20 @@ ruby '2.1.1'
gem 'rails', '~> 3.2.17' gem 'rails', '~> 3.2.17'
gem 'mysql2', '~> 0.3.15' gem 'mysql2', '~> 0.3.15'
gem 'foreman', '~> 0.63.0'
# Libraries # Libraries
gem 'jquery-rails' gem 'jquery-rails', '~> 2.0.2'
gem 'sass-rails' gem 'sass-rails'
gem 'coffee-rails' gem 'coffee-rails'
gem 'gruff' gem 'gruff'
gem 'nokogiri' gem 'nokogiri'
gem 'carrierwave'
gem 'rbbcode' gem 'rbbcode'
gem 'tinymce-rails' gem 'tinymce-rails', '~> 3.5.4.1'
gem 'carrierwave', '~> 0.10.0'
gem 'bluecloth', '~> 2.2.0' gem 'bluecloth', '~> 2.2.0'
gem 'bb-ruby' gem 'bb-ruby', '~> 1.0.4'
gem 'therubyracer' gem 'therubyracer', '~> 0.12.1'
gem 'acts_as_indexed' gem 'rmagick', '~> 2.13.2', require: false
gem 'rmagick', require: false
gem 'will_paginate', git: 'https://github.com/p7r/will_paginate.git', branch: 'rails3' gem 'will_paginate', git: 'https://github.com/p7r/will_paginate.git', branch: 'rails3'
gem 'newrelic_rpm', '~> 3.7.2.195' gem 'newrelic_rpm', '~> 3.7.2.195'
@ -32,6 +30,7 @@ group :development do
gem 'capistrano-rbenv', '~> 2.0.2' gem 'capistrano-rbenv', '~> 2.0.2'
gem 'capistrano-bundler', '~> 1.1.2' gem 'capistrano-bundler', '~> 1.1.2'
gem 'capistrano-rails', '~> 1.1' gem 'capistrano-rails', '~> 1.1'
gem 'capistrano3-unicorn', '~> 0.1.1'
gem 'annotate', '~> 2.6.2' gem 'annotate', '~> 2.6.2'
end end

View file

@ -35,12 +35,11 @@ GEM
activesupport (3.2.17) activesupport (3.2.17)
i18n (~> 0.6, >= 0.6.4) i18n (~> 0.6, >= 0.6.4)
multi_json (~> 1.0) multi_json (~> 1.0)
acts_as_indexed (0.7.8)
annotate (2.6.2) annotate (2.6.2)
activerecord (>= 2.3.0) activerecord (>= 2.3.0)
rake (>= 0.8.7) rake (>= 0.8.7)
arel (3.0.3) arel (3.0.3)
bb-ruby (0.9.5) bb-ruby (1.0.4)
bluecloth (2.2.0) bluecloth (2.2.0)
builder (3.0.4) builder (3.0.4)
capistrano (3.1.0) capistrano (3.1.0)
@ -56,15 +55,19 @@ GEM
capistrano-rbenv (2.0.2) capistrano-rbenv (2.0.2)
capistrano (~> 3.1) capistrano (~> 3.1)
sshkit (~> 1.3) sshkit (~> 1.3)
capistrano3-unicorn (0.1.1)
capistrano (>= 3.1.0)
capybara (2.2.1) capybara (2.2.1)
mime-types (>= 1.16) mime-types (>= 1.16)
nokogiri (>= 1.3.3) nokogiri (>= 1.3.3)
rack (>= 1.0.0) rack (>= 1.0.0)
rack-test (>= 0.5.4) rack-test (>= 0.5.4)
xpath (~> 2.0) xpath (~> 2.0)
carrierwave (0.6.2) carrierwave (0.10.0)
activemodel (>= 3.2.0) activemodel (>= 3.2.0)
activesupport (>= 3.2.0) activesupport (>= 3.2.0)
json (>= 1.7)
mime-types (>= 1.16)
cliver (0.3.2) cliver (0.3.2)
coderay (1.1.0) coderay (1.1.0)
coffee-rails (3.2.2) coffee-rails (3.2.2)
@ -94,13 +97,6 @@ GEM
factory_girl_rails (4.4.1) factory_girl_rails (4.4.1)
factory_girl (~> 4.4.0) factory_girl (~> 4.4.0)
railties (>= 3.0.0) railties (>= 3.0.0)
foreman (0.63.0)
dotenv (>= 0.7)
thor (>= 0.13.6)
foreman (0.63.0-x86-mingw32)
dotenv (>= 0.7)
thor (>= 0.13.6)
win32console (~> 1.3.0)
given_core (3.5.4) given_core (3.5.4)
sorcerer (>= 0.3.7) sorcerer (>= 0.3.7)
gruff (0.3.6) gruff (0.3.6)
@ -173,7 +169,7 @@ GEM
rdoc (3.12.2) rdoc (3.12.2)
json (~> 1.4) json (~> 1.4)
ref (1.0.5) ref (1.0.5)
rmagick (2.13.1) rmagick (2.13.2)
rspec (2.14.1) rspec (2.14.1)
rspec-core (~> 2.14.0) rspec-core (~> 2.14.0)
rspec-expectations (~> 2.14.0) rspec-expectations (~> 2.14.0)
@ -245,23 +241,22 @@ PLATFORMS
x86-mingw32 x86-mingw32
DEPENDENCIES DEPENDENCIES
acts_as_indexed
annotate (~> 2.6.2) annotate (~> 2.6.2)
bb-ruby bb-ruby (~> 1.0.4)
bluecloth (~> 2.2.0) bluecloth (~> 2.2.0)
capistrano (~> 3.1.0) capistrano (~> 3.1.0)
capistrano-bundler (~> 1.1.2) capistrano-bundler (~> 1.1.2)
capistrano-rails (~> 1.1) capistrano-rails (~> 1.1)
capistrano-rbenv (~> 2.0.2) capistrano-rbenv (~> 2.0.2)
capistrano3-unicorn (~> 0.1.1)
capybara (~> 2.2.1) capybara (~> 2.2.1)
carrierwave carrierwave (~> 0.10.0)
coffee-rails coffee-rails
dalli (~> 2.7.0) dalli (~> 2.7.0)
dotenv-rails (~> 0.10.0) dotenv-rails (~> 0.10.0)
factory_girl_rails (~> 4.4.1) factory_girl_rails (~> 4.4.1)
foreman (~> 0.63.0)
gruff gruff
jquery-rails jquery-rails (~> 2.0.2)
kgio (~> 2.9.2) kgio (~> 2.9.2)
mysql2 (~> 0.3.15) mysql2 (~> 0.3.15)
newrelic_rpm (~> 3.7.2.195) newrelic_rpm (~> 3.7.2.195)
@ -270,13 +265,13 @@ DEPENDENCIES
pry-debugger (~> 0.2.2) pry-debugger (~> 0.2.2)
rails (~> 3.2.17) rails (~> 3.2.17)
rbbcode rbbcode
rmagick rmagick (~> 2.13.2)
rspec-given (~> 3.5.4) rspec-given (~> 3.5.4)
rspec-rails (~> 2.14.1) rspec-rails (~> 2.14.1)
sass-rails sass-rails
simplecov (~> 0.7.1) simplecov (~> 0.7.1)
therubyracer therubyracer (~> 0.12.1)
tinymce-rails tinymce-rails (~> 3.5.4.1)
uglifier (~> 2.5.0) uglifier (~> 2.5.0)
unicorn (~> 4.8.2) unicorn (~> 4.8.2)
will_paginate! will_paginate!

View file

@ -1,32 +1,27 @@
# Ubuntu 13.10 x64 # Production Install (Ubuntu 13.10 x64 or Debian 7)
## Capistrano setup ## Capistrano setup
SSH as root, and install the basics SSH as a user with sudo access, update package lists and upgrade packages (new install only)
sudo apt-get update sudo apt-get update
sudo apt-get upgrade sudo apt-get upgrade
Create a deploy user. Disable password authentication and add it to the www-data group. Either use an existing sandboxed user account, or create a deploy user and disable password authentication. Instead, authenticate with a keypair.
sudo adduser deploy sudo adduser deploy
sudo passwd -l deploy sudo passwd -l deploy
sudo usermod -a -G www-data deploy
Create a new upstart config and set permissions ## Install Apache
touch /etc/init/ensl.conf sudo apt-get install apache2 apache2-mpm-prefork
chown deploy /etc/init/ensl.conf
Add the following to `/etc/sudoers` to allow the `deploy` user to manage nginx, rbenv and upstart commands via sudo without a password Now create the required directories, e.g. `/var/www/virtual/ensl.org/deploy`
# /etc/sudoers
deploy ALL=NOPASSWD:/etc/init.d/nginx
deploy ALL=NOPASSWD:/home/deploy/.rbenv/bin/rbenv
deploy ALL=NOPASSWD:/usr/sbin/service ensl start, /usr/sbin/service ensl stop, /usr/sbin/service ensl restart
## Install MySQL & Memcached ## Install MySQL & Memcached
You may need to re-configure MySQL. Use `sudo dpkg-reconfigure mysql-server-5.5`
sudo apt-get install mysql-server mysql-client libmysqlclient-dev memcached sudo apt-get install mysql-server mysql-client libmysqlclient-dev memcached
Login to mysql as root, and create the database and user account: Login to mysql as root, and create the database and user account:
@ -37,23 +32,20 @@ Login to mysql as root, and create the database and user account:
## Install rbenv, ruby, bundler and Image Magick ## Install rbenv, ruby, bundler and Image Magick
As root, install dependencies As a user with sudo, install dependencies
sudo apt-get install nginx git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libmysql-ruby imagemagick libmagickwand-dev sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev imagemagick libmagickwand-dev
Switch user to deploy, and install rbenv Switch user to deploy, and install rbenv
su deploy su deploy
cd ~ cd ~
git clone git://github.com/sstephenson/rbenv.git .rbenv git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.profile
echo 'eval "$(rbenv init -)"' >> ~/.bashrc echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL exec $SHELL
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.profile
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
exec $SHELL exec $SHELL
@ -63,15 +55,14 @@ Switch user to deploy, and install rbenv
echo "gem: --no-ri --no-rdoc" > ~/.gemrc echo "gem: --no-ri --no-rdoc" > ~/.gemrc
gem install bundler gem install bundler
Install the rbenv-sudo plugin
mkdir ~/.rbenv/plugins
git clone git://github.com/dcarley/rbenv-sudo.git ~/.rbenv/plugins/rbenv-sudo
## Install the ENSL site ## Install the ENSL site
Create the `.env` file with the appropriate credentials. Create the `.env` file with the appropriate credentials.
mkdir /var/www/virtual/ensl.org/deploy
mkdir /var/www/virtual/ensl.org/deploy/shared
touch /var/www/virtual/ensl.org/deploy/shared/.env touch /var/www/virtual/ensl.org/deploy/shared/.env
# Deployment
Use capistrano to deploy:
bundle exec cap production deploy

View file

@ -1 +0,0 @@
web: bundle exec unicorn -c ./config/unicorn.rb

View file

@ -3,6 +3,7 @@ lock '3.1.0'
set :application, 'ensl' set :application, 'ensl'
set :deploy_user, 'deploy' set :deploy_user, 'deploy'
set :deploy_to, '/var/www/virtual/ensl.org/deploy' set :deploy_to, '/var/www/virtual/ensl.org/deploy'
set :deploy_via, :remote_cache
set :pty, true set :pty, true
set :scm, :git set :scm, :git
@ -11,14 +12,18 @@ set :keep_releases, 10
set :rbenv_type, :user set :rbenv_type, :user
set :rbenv_ruby, '2.1.1' set :rbenv_ruby, '2.1.1'
set :rbenv_sudo, "sudo /home/#{fetch(:deploy_user)}/.rbenv/bin/rbenv sudo"
set :unicorn_config_path, "config/unicorn.rb"
set :unicorn_rack_env, fetch(:rails_env)
set :writable_dirs, %w{public tmp}
set :linked_files, %w{.env} set :linked_files, %w{.env}
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle
public/system public/local public/uploads} public/system public/local public/uploads}
set :writable_dirs, %w{public tmp} set :normalize_asset_timestamps, %{public/images
set :normalize_asset_timestamps, %{public/images public/javascripts public/stylesheets} public/javascripts
public/stylesheets}
namespace :deploy do namespace :deploy do
namespace :check do namespace :check do
@ -38,43 +43,9 @@ namespace :deploy do
end end
end end
desc 'Restart application'
task :restart do task :restart do
invoke 'foreman:export' invoke 'unicorn:restart'
invoke 'foreman:restart'
end end
after :publishing, :restart after :publishing, :restart
end end
namespace :foreman do
desc "Export the Procfile to Ubuntu's upstart scripts"
task :export do
on roles(:app) do |host|
within release_path do
execute fetch(:rbenv_sudo), "bundle exec foreman export upstart /etc/init -a #{fetch(:application)} -u #{fetch(:deploy_user)} -l #{fetch(:deploy_to)}/shared/log"
end
end
end
desc "Start the application services"
task :start do
on roles(:app) do |host|
execute "sudo service #{fetch(:application)} start"
end
end
desc "Stop the application services"
task :stop do
on roles(:app) do |host|
execute "sudo service #{fetch(:application)} stop"
end
end
desc "Restart the application services"
task :restart do
on roles(:app) do |host|
execute "sudo service #{fetch(:application)} start || #{sudo} service #{fetch(:application)} restart"
end
end
end

View file

@ -1,25 +1,33 @@
worker_processes Integer(ENV['UNICORN_WORKERS'] || 3) base_path = "/var/www/virtual/ensl.org/deploy"
current_path = "#{base_path}/current"
shared_path = "#{base_path}/shared"
working_directory current_path
worker_processes Integer(ENV['UNICORN_WORKERS'] || 4)
timeout 30 timeout 30
preload_app true preload_app true
listen ENV['UNICORN_PORT'] user ENV['UNICORN_USER'], ENV['UNICORN_GROUP']
listen ENV['UNICORN_SOCKET'] listen Integer(ENV['UNICORN_PORT'] || 4000), :tcp_nopush => true
listen ENV['UNICORN_SOCKET'], :backlog => 64
stderr_path "#{shared_path}/log/unicorn.stderr.log"
stdout_path "#{shared_path}/log/unicorn.stdout.log"
pid "#{shared_path}/tmp/pids/unicorn.pid"
before_fork do |server, worker| before_fork do |server, worker|
Signal.trap 'TERM' do ActiveRecord::Base.connection.disconnect!
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end
defined?(ActiveRecord::Base) and old_pid = "#{server.config[:pid]}.oldbin"
ActiveRecord::Base.connection.disconnect!
if File.exists?(old_pid) && server.pid != old_pid
begin
Process.kill('QUIT', File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
end
end
end end
after_fork do |server, worker| after_fork do |server, worker|
Signal.trap 'TERM' do ActiveRecord::Base.establish_connection
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end end