Rails deployment

Chennai-Rails Workshop 

21 March 2015

Abhishek Yadav

@h6165

Deploy to heroku

  • Install heroku toolbelt 
  • heroku create tournament-tracker-<your_name>
  • git remote add heroku git@heroku.com:tournament-tracker-<your_name>.git
  • Edit Gemfile: replace 'sqlite3' with 'pg'
  • git init
  • git add
  • git commit -m 'first commit'
  • git push heroku master
  • heroku run rake db:migrate

 

Quick Rundown

Traditional deployment

  • Provision server from Digital Ocean website
  • Setup DNS/Cnames
  • Install build-tools, libs
  • Install Ruby, bundler
  • Copy code to the server
  • bundle install, db:migrate, asset precompile
  • Setup Unicorn/Puma + Nginx
  • Install database

Quick Rundown

Traditional deployment

sudo apt-get install build-essential \

zlib1g-dev \
libssl-dev openssl \
libreadline-dev \
sqlite3 libsqlite3-dev \
libxslt-dev libxml2-dev \
libffi-dev \
curl wget git-core

Install build-tools, libs

Traditional deployment

git clone git://github.com/sstephenson/ruby-build.git; cd ruby-build; sudo ./install.sh

 

sudo ruby-build -kv 2.2.0 /usr/local/
sudo gem install bundler

 

Install Ruby and bundler

Traditional deployment

mkdir -p /var/www/my_app; cd /var/www/my_app

git clone git@bitbucket.org:my_app

 

Or setup Capistrano

Copy code to the server

Traditional deployment

export RAILS_ENV=production

 

Edit database.yml to setup production config

bin/rake db:create

bin/rake db:schema:load

bin/rake db:seed

 

bin/rake assets:precompile

 

bundle install, db:migrate, asset precompile

Traditional deployment

Setup Unicorn/Puma + Nginx

Webrick only: bin/rails s -p 80 

 

Nginx: sudo apt-get install nginx

Unicorn: Add to Gemfile: gem 'unicorn'

Traditional deployment

Setup Unicorn + Nginx

Nginx site config: /etc/nginx/sites-available/my-app

upstream my_app {
      server 127.0.0.1:8080;
}
server{
      listen 80;

      server_name example.org;
      root /var/www/my_app/current/public;

      location / {
        proxy_set_header X_FORWARDED_PROTO $scheme;
        proxy_set_header Host $http_host;

        if (!-f $request_filename) {
          proxy_pass http://my_app;
          break;
        }
      }
}

Traditional deployment

Setup Unicorn + Nginx

Unicorn config: Rails.root/config/unicorn.rb

worker_processes 4

listen "/tmp/.sock", :backlog => 64
listen 8080, :tcp_nopush => true

pid "/var/www/my_app/tmp/pids/unicorn.pid"


stderr_path "/var/www/my_app/log/unicorn.stderr.log"
stdout_path "/var/www/my_app/log/unicorn.stdout.log"

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

Traditional deployment

Setup Unicorn + Nginx

Unicorn start:

bundle exec unicorn -c config/unicorn.rb -E production -D 

 

Nginx start:

sudo service nginx start

Traditional deployment

Setup Database: mysql

Install

sudo apt-get install mysql-server libclient-dev mysql-client

 

Edit database.yml

bin/rake db:create

bin/rake db:schema:load

Deployment

DNS setups

  • Don't buy from Godaddy. Use namecheap.com, gandi.net instead
  • Either provide a Name server, or setup records 
  • First option is better, since we can move DNS management out to our server vendor (like Digital-Ocean or Amazon Aws) or third party services (like DynDns)
  • For the second option, figure out the DNS editor, and edit 

DNS setups: setting up DNS Records

DNS setups: transferring Name Server

Rails deployment

By Abhishek Yadav

Rails deployment

  • 1,349