Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
How we setup servers from 2014 - 2016
# Digital Ocean / Rails 4.1.6 / Ruby 2.1.3 / nginx 1.4.6 / Ubuntu 14.04x64 / Capistrano 3.2.1
# https://gorails.com/deploy/ubuntu/14.04
# https://coderwall.com/p/yz8cha/deploying-rails-app-using-nginx-unicorn-postgres-and-capistrano-to-digital-ocean
# http://www.cubicleapps.com/articles/ubuntu-rails-ready-with-nginx-unicorn
# 1) SETUP DEPLOY USER AND GET ROOT ACCESS OUT OF THE WAY
you@local:~$ ssh root@IPADDRESS
root@remote:~$ adduser USERNAME
root@remote:~$ visudo
# # User privilege specification
# root ALL=(ALL:ALL) ALL
# USERNAME ALL=(ALL:ALL) ALL # Add
root@remote:~$ vi /etc/ssh/sshd_config
# Port PORT # change this to whatever port you wish to use: 1025..65536
# UseDNS no # Add to bottom
# AllowUsers USERNAME # Add to bottom
# AllowAgentForwarding yes # Add to bottom
root@remote:~$ reload ssh
root@remote:~$ exit
# Hand way to automagically upload your ssh key(s) to the server
you@local:~$ ssh-copy-id USERNAME@IPADDRESS -p PORT
# 2) INSTALL TIME
you@local:~$ ssh deploy@IPADDRESS -p PORT
deploy@remote:~$ sudo apt-get update
deploy@remote:~$ sudo apt-get install curl
deploy@remote:~$ gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3 # RVM 1.26.0 introduces signed releases and automated check of signatures when GPG software found.
deploy@remote:~$ curl -L get.rvm.io | bash -s stable
deploy@remote:~$ source ~/.rvm/scripts/rvm
deploy@remote:~$ rvm requirements
deploy@remote:~$ rvm install 2.1.3
deploy@remote:~$ rvm use 2.1.3 --default
deploy@remote:~$ rvm rubygems current
deploy@remote:~$ gem install rails --no-ri --no-rdoc
deploy@remote:~$ sudo apt-get install nodejs
# 3) LOCAL POSTGRESQL DATABASE (OPTIONAL)
deploy@remote:~$ sudo apt-get install postgresql postgresql-server-dev-9.3
deploy@remote:~$ gem install pg -- --with-pg-config=/usr/bin/pg_config
deploy@remote:~$ sudo -u postgres psql
postgres@psql:~$ create user deploy with password 'l2gVdgDDZmFOAGw';
postgres@psql:~$ alter role deploy superuser createrole createdb replication;
postgres@psql:~$ create database ksdetasn_production owner deploy;
postgres@psql:~$ \q # Quits
# 3) LOCAL MYSQL DATABASE (OPTIONAL)
deploy@remote:~$ sudo apt-get install mysql-server
deploy@remote:~$ mysql -u root -p
mysql> CREATE USER 'deploy'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON * . * TO 'deploy'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> quit
# 3) REMOTE MYSQL DATABASE (OPTIONAL)
deploy@remote:~$ sudo apt-get install libmysqlclient-dev
# 3.0) IMAGEMAGICK (OPTIONAL)
deploy@remote:~$ sudo apt-get install imagemagick
# 3.1) CONTINUED INSTALLATION
deploy@remote:~$ sudo apt-get install git-core
deploy@remote:~$ rvm use 2.1.3@PROJECTNAME --create
deploy@remote:~$ gem install bundler
deploy@remote:~$ sudo apt-get install nginx
deploy@remote:~$ sudo service nginx start
# At this point you should be able to see the nginx welcome page at your IPADDRESS
# 3.2) MOHR INSTALLATION
deploy@remote:~$ sudo apt-get install memcached # << Crazy, I know... but that's all it takes. No setup. No config.
# 3.2) LOCAL CAPISTRANO
# In your Gemfile
gem 'capistrano', '3.4.0'
gem 'capistrano-rvm'
gem 'capistrano-bundler'
gem 'capistrano-rails'
you@local:~$ bundle
you@local:~$ cap install
# Copy over "Capfile" from this gist. No substitutions needed.
# Copy over "production.rb" from this gist. Substitutions: SPECIAL_PORT, USERNAME, IPADDRESS
# Copy over "deploy.rb" from this gist. Substitutions: APPLICATION, RUBY, USERNAME
# 4) LOCAL SERVER CONFIG FILES
# In your gemfile
gem 'unicorn'
# Copy over "config/nginx.conf" from this gist. Substitutions: USERNAME, PROJECTNAME
# Copy over "config/unicorn.rb" from this gist. Substitutions: USERNAME, PROJECTNAME
# Copy over "config/unicorn_init.sh" from this gist. Substitutions: USERNAME, PROJECTNAME, RUBY
you@local:~$ chmod +x config/unicorn_init.sh
# Commit all that hard work you did! Good job, you!
you@local:~$ git add .
you@local:~$ git commit -m "Oh yeah"
you@local:~$ git push
# 5) Setup and Deploy Capistrano
# Setup ~/apps/APPLICATION/shared/config/secrets.yml
# I had to install bundler gem... not sure how that got stepped over
# I think it was becdause when I first installed the bundler gem, I was not inside my application gemset. I've changed that above
# Debug as necessary
you@local:~$ cap production deploy
# 6) LINK NGINX AND UNICORN
deploy@remote:~$ sudo ln -nfs CURRENTPATH/config/nginx.conf /etc/nginx/sites-enabled/projectname
deploy@remote:~$ sudo rm /etc/nginx/sites-enabled/default
deploy@remote:~$ sudo service nginx restart
deploy@remote:~$ sudo ln -nfs CURRENTPATH/config/unicorn_init.sh /etc/init.d/unicorn_projectname
deploy@remote:~$ sudo update-rc.d -f unicorn_projectname defaults
# 6) Get into Prodution Console
# A good first step. Means you're on the right path.
# Debug as necessary
deploy@remote:~$ bundle exec rails c production
# 7) RVM WRAPPER FOR UNICORN
# http://rvm.io/deployment/init-d
USERNAME@remote:~$ cd ~/apps/PROJECTNAME/shared/bin
USERNAME@remote:~$ rvm wrapper 2.1.3@PROJECTNAME PROJECTNAME unicorn_rails
# This will create:
# /home/USERNAME/.rvm/wrappers/ruby-2.1.3@PROJECTNAME/unicorn_rails
# Use this fully qualified path in your unicorn_init.sh
# 8) Lock Down
USERNAME@remote:~$ sudo vi /etc/ssh/sshd_config
# PermitRootLogin yes # change this to no
USERNAME@remote:~$ sudo reload ssh
# 9) TAKEAWAYS
--------------------------------------------------------------------
Unicorn
Log: /home/deploy/apps/projectname/current/log/unicorn.log
Config: /home/deploy/apps/projectname/config/unicorn.rb
Control: /etc/init.d/unicorn_projectname start|stop|restart
--------------------------------------------------------------------
Nginx
Generic Nginx Log: /var/log/nginx/*
Application Specific Log: /home/deploy/apps/projectname/current/log/nginx.*
Config: /etc/nginx/sites-enabled/projectname
Control: sudo service nginx start|stop|restart
--------------------------------------------------------------------
To get a list of available gems: gem list
To get a list of Rubies: rvm list
To get Gem environment: gem env
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.