# 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