Search

Tutorial deploy multiple aplikasi Ruby on Rails di AWS menggunakan Capistrano dan Passenger

Updated: May 20, 2019

Halo teman teman Gruper kali ini kita mau membagikan bagiamana caranya untuk mendeploy aplikasi di AWS (Amazon Web Services) menggunakan Capistrano dan Passenger. Oke langsung saja mari kita mulai.

Yang pertama kali kita akan lakukan adalah mulai dengan menginstall ruby version manager dan juga dependencies yang diperlukan untuk setup deployment kita. Pada step ini teman teman diharapkan sudah menyiapkan ssh login pada server teman teman sendiri ya.

~$: curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
~$: curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
~$: echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
~$: sudo add-apt-repository ppa:chris-lea/redis-server
~$: sudo apt-get update
~$: sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev software-properties-common libffi-dev dirmngr gnupg apt-transport-https ca-certificates redis-server redis-tools nodejs yarn

Bila dependencies di atas telah selesai kita dapat melanjutkan ke proses instalasi Ruby version manager. Ruby version manager yang akan kita gunakan di sini adalah rbenv. Version manager ini lah yang paling mudah dan simpel untuk me-manage environment pada komputer local atau production kita.

~$: git clone https://github.com/rbenv/rbenv.git ~/.rbenv
~$: echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
~$: echo 'eval "$(rbenv init -)"' >> ~/.bashrc
~$: git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
~$: echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
~$: git clone https://github.com/rbenv/rbenv-vars.git ~/.rbenv/plugins/rbenv-vars
~$: exec $SHELL
~$: rbenv install 2.5.3
~$: rbenv global 2.5.3
~$: ruby -v (untuk mengecek ruby version apakah instalasi berhasil, bila berhasil maka akan muncul versi dari ruby yang kita install tersebut)

Berikut nya kita akan install bundler.

~$: gem install bundler
~$: bundle -v (untuk mengecek bundler version apakah instalasi berhasil, bila berhasil maka akan muncul versi dari ruby yang kita install tersebut)
~$: rbenv rehash

Selanjutnya kita akan melakukan konfigurasi web server yang akan. Pada postingan ini kita menggunakan AWS t2 micro dengan akses ssh melalui pem. Di production server rails tidak akan jalan dengan sendiri nya setelah kita setup config seperti di atas, oleh karena itu kita akan menginstall Nginx (engine x) dan Passenger. Passenger sendiri kita gunakan untuk sebagai module tambahan pada Nginx untuk memforward request ke aplikasi Rails kita. Sedangkan Nginx akan kita gunakan sebagai HTTP web server untuk menerima HTTP request dari user yang mana pada request tersebut akan di teruskan oleh Passenger yang akan menjalankan aplikasi Rails kita.

~$: sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
~$: sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list'
~$: sudo apt-get update
~$: sudo apt-get install -y nginx-extras libnginx-mod-http-passenger
~$: if [ ! -f /etc/nginx/modules-enabled/50-mod-http-passenger.conf ]; then sudo ln -s /usr/share/nginx/modules-available/mod-http-passenger.load /etc/nginx/modules-enabled/50-mod-http-passenger.conf ; fi
~$: sudo ls /etc/nginx/conf.d/mod-http-passenger.conf

Setelah selesai kita lakukan konfigurasi Passenger.

~$: sudo nano /etc/nginx/conf.d/mod-http-passenger.conf
~$: passenger_ruby /home/ubuntu/.rbenv/versions/2.5.3/bin/ruby; (masukkan syntax di sebelah untuk mengarahkan Ruby path ke passenger)

Bila sudah di save dan jalankan Nginx server.

~$: sudo service nginx start

Selanjutnya kita akan melakukan konfigurasi pada sites-enabled yang ada pada Nginx kita.

~$: sudo rm /etc/nginx/sites-enabled/default (hapus file default konfigurasi dari Nginx)
~$: sudo nano /etc/nginx/sites-enabled/user-panel
~$: sudo nano /etc/nginx/sites-enabled/admin-panel

Lalu masukkan konfigurasi seperti berikut untuk sites-enabled/user-panel.

server {
  listen 80;
  listen [::]:80;
  server_name youripaddress;
  root /home/ubuntu/apps/front-end-panel/current/public;  
  passenger_enabled on;
  passenger_app_env production;
  passenger_ruby /home/ubuntu/.rbenv/versions/2.5.3/bin/ruby;

  client_max_body_size 100m;

  location ~ ^/(assets|packs) {
    expires max;
    gzip_static on;
  }
}

Berikut untuk konfigurasi untuk sites-enabled/admin-panel.

server {
  listen 8080;
  listen [::]:8080;

  server_name youripaddress;
  root /home/ubuntu/apps/admin-panel/current/public;

  passenger_enabled on;
  passenger_app_env production;
  passenger_ruby /home/ubuntu/.rbenv/versions/2.5.3/bin/ruby;

  client_max_body_size 100m;
  location ~ ^/(assets|packs) {
    expires max;
    gzip_static on;
  }
}

Bila sudah lalu reload server Nginx nya.

~$: sudo service nginx reload

Setelah konfigurasi Nginx kita dapat melanjutkan ke tahap selanjutnya yaitu konfigurasi database. Di sini kami menggunakan PostgreSQL untuk menyimpan database.

~$: sudo apt-get install postgresql postgresql-contrib libpq-dev
~$: sudo su - postgres
~$: createuser --pwprompt ubuntu
~$: createdb -O ubuntu database-admin
~$: exit

Sekarang kita konfigurasi Capistrano pada aplikasi Rails kita.

gem 'capistrano', '~> 3.11'
gem 'capistrano-rails', '~> 1.4'
gem 'capistrano-passenger', '~> 0.2.0'
gem 'capistrano-rbenv', '~> 2.1', '>= 2.1.4'

Lalu jalankan bundle install. Setelah installasi jalankan perintah cap install STAGES=production ini akan generate Capfile, config/deploy.rb, config/ubuntu/production.rb. Setelah itu kita buka Capfile dan setup sebagai berikut.

require "capistrano/setup"
require "capistrano/deploy"
require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git
require "capistrano/rails"
require "capistrano/passenger"
require "capistrano/rbenv"
set :rbenv_type, :user
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }

Selanjutnya kita konfigurasi config/deploy.rb.

lock "~> 3.11.0"
set :application, "admin-panel"
set :repo_url, "alamat git repo kalian ya"
set :branch, "production"
set :rbenv_ruby, '2.5.3'
set :ssh_options, { forward_agent: true, user: fetch(:user), keys: 
%w(~/ubuntu/keypair-kalian.pem) }
set :deploy_to, "~/apps/admin-panel"
set :linked_files, %w{config/master.key}
append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "vendor/bundle", ".bundle", "public/system", "public/uploads"
set :keep_releases, 5

Dan yang terakhir memasukkan ip address kita pada config/deploy/production.rb

server "ipaddress kalian ya", user: "ubuntu", roles: %w{app web}

Nah pada tahap ini kita sudah konfigurasi aplikasi dan juga web server nya. Sekarang kita akan bahas mengenai kendala kendala yang di hadapi ketika deploy. Pada config/deploy.rb di sana kita menambahkan

set :ssh_options, { forward_agent: true, user: fetch(:user), keys: %w(~/ubuntu/keypair-kalian.pem) }

alasan nya kita menambahkan ini karena si capistrano ternyata minta authentication dari ubuntu server nya which is AWS nya gak pakai password dan hanya pakai pem aja jadi yaudah kita taro file pem di server nya, memang agak sedikit tricky teman teman, masih lebih baik dari kalo harus provide password di aplikasi kita, sebaiknya itu di hindari ya teman teman. Selanjutnya untuk database dan juga user, kalian juga harus samakan konfigurasi nya ya dengan konfigurasi database di atas dengan config/database.yml di aplikasi kalian. Lakukan hal yang sama pada aplikasi yang user-panel untuk konfigurasi capistrano nya, tapi di bedain path nya ya dan jangan sampai salah. Bila teman teman sudah melakukan nya dengan benar, kita buat direktori di main console seperti code di sebelah kanan "~:" lalu buat direktori apps dengan perintah.

~$: mkdir apps
~$: git clone url-git-admin-panel
~$: git clone url-git-user-panel

Bila sudah kalian masuk ke dalam direktori admin-panel yang ada di dalam apps direktori lalu jalankan bundle exec cap production deploy, sama hal nya dengan user-panel. Setelah itu jangan lupa di restart server nya dengan sudo service nginx restart.

28 views

Recent Posts

See All

Tutorial Using Git Rebase

Hi guys, today I’m gonna share with you how to use git rebase. The most important word here is “reapply” because a rebase is not simply a ctrl-x/ctrl-v of a branch to another. A rebase will sequential

LINKS
ABOUT

ask-us@gruper.co

Tel: +62 21 7567 6868

Ruko Boulevard Tekno, Blok C No 5

Jalan Tekno Widya, Serpong, Tangerang Selatan, 15314

Indonesia

SOCIAL
  • White LinkedIn Icon
  • White Facebook Icon

© 2019 by Gruper Technology