+2

Deploy rails app to EC2

Deploy rails app to AWS EC2

Configuring Puma & Capistrano

Puma là application server và Capistrano sẽ là công cụ để deploy. Nên ta sẽ cần 1 số gem như sau trong app của bạn

gem 'figaro'
gem 'puma'
group :development do
  gem 'capistrano'
  gem 'capistrano3-puma'
  gem 'capistrano-rails', require: false
  gem 'capistrano-bundler', require: false
  gem 'capistrano-rvm'
end

Tạo file config capistrano , trong thư mục gốc run câu lệnh sau

cap install STAGES=production

Câu lệnh trên sẽ tạo ra file sau

config/deploy.rb
config/deploy/productioin.rb

Trong đó deploy.rb là file config chính chứa repo path, app name, branch .... và production.rb là file config môi trường server liên quan đến ip, user, role …

Tiếp đến thêm đoạn code sau file Capfile trong thư mục gốc

require 'capistrano/bundler'
require 'capistrano/rvm'
require 'capistrano/rails/assets' # for asset handling add
require 'capistrano/rails/migrations' # for running migrations
require 'capistrano/puma'

Tiếp đến update file

lock '3.4.0'

set :application, 'e-learning' # Tên ứng dụng của bạn
set :repo_url, 'github.com/khanhhd/e_learning.git' #link github repo của bạn
set :branch, :master
set :deploy_to, '/home/deploy/e-learning'
set :pty, true
set :linked_files, %w{config/database.yml config/application.yml}
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system public/uploads}
set :keep_releases, 5
set :rvm_type, :user
set :rvm_ruby_version, 'jruby-1.7.19' # Edit this if you are using MRI Ruby

set :puma_rackup, -> { File.join(current_path, 'config.ru') }
set :puma_state, "#{shared_path}/tmp/pids/puma.state"
set :puma_pid, "#{shared_path}/tmp/pids/puma.pid"
set :puma_bind, "unix://#{shared_path}/tmp/sockets/puma.sock"    #accept array for multi-bind
set :puma_conf, "#{shared_path}/puma.rb"
set :puma_access_log, "#{shared_path}/log/puma_error.log"
set :puma_error_log, "#{shared_path}/log/puma_access.log"
set :puma_role, :app
set :puma_env, fetch(:rack_env, fetch(:rails_env, 'production'))
set :puma_threads, [0, 8]
set :puma_workers, 0
set :puma_worker_timeout, nil
set :puma_init_active_record, true
set :puma_preload_app, false

Tạo instance aws ec2

Để tạo được instane ec2 bạn cần đăng ký tài khoản trên aws, khi tạo tài khoản bạn cần nhập thông tin về credit card. Bạn sẽ mất phí 1$ nhưng sau đó amazon sẽ trả lại, dùng free 1 năm. https://www.youtube.com/watch?v=2enN3FElYQw&feature=youtu.be

Cài đặt server sau khi đã tạo xong trên AWS ec2

ssh vào server dùng lệnh sau

 ssh -i "khanhhd-key.pem" ec2-user@ec2-52-40-175-145.us-west-2.compute.amazonaws.com

.pem là file là keypair mà bạn đã download trên amazon ec2 trước đó

Dùng lệnh sau để tạo ra một user tên là deploy

sudo useradd -d /home/deploy -m deploy

Câu lệnh trên sẽ tạo ra một user deploy cùng với thư mục tên là deploy bên trong thư mục home

Add quyền sudoer cho deploy user

deploy ALL=(ALL:ALL) ALL

Vì deploy sẽ lấy source từ github trong repo của bạn nên cần phải để cho deploy user access vào repo thông qua việc add ssh pub key vào github acc của bạn

su - deploy
ssh-keygen

Nó sẽ tạo ra 2 file chứa mã bí mật và mã public bạn copy mã public đưa vào github repo của mình

cat .ssh/id_rsa.pub

Việc deploy, Capistrano cần connect tới ec2 , vì vậy ta cần phải access aws thông qua ssh từ local của bạn. Copy public key từ local , sau đó dán vào file sau

vi .ssh/authorized_keys

và nhớ dùng lệnh sau nữa không nó sẽ luôn báo Permission denied khi bạn ssh

sudo chmod 600 .ssh/sh/authorized_keys

Cài môi trường trên server

Cài git

sudo yum install git

Cài nginx

sudo yum install nginx

Config nginx

sudo vi /etc/nginx/sites-available/default
upstream app {
  # Path to Puma SOCK file, as defined previously
  server unix:/home/deploy/e-learning/shared/tmp/sockets/puma.sock fail_timeout=0;
}

server {
  listen 80;
  server_name localhost;

  root /home/deploy/e-learning/public;

  try_files $uri/index.html $uri @app;

  location / {
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Connection '';
    proxy_pass http://app;
  }

  location ~ ^/(assets|fonts|system)/|favicon.ico|robots.txt {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

Cài đặt database server , rvm, ruby như trên ubuntu local

Tạo ra thư mục deploy cho capistrano như trong config trước

mkdir e-learning
mkdir -p e-learning/shared/config

Config lại database cho production như dưới local của bạn

vi e-learning/shared/config/database.yml

Add secret key

rake secret #dưới local
vi e-learning/shared/config/application.yml
SECRET_KEY_BASE: “secret key”

Việc cuối cùng đó là sửa lại cấu hình server cho file production.rb dưới local config/deploy/production.rb mà bạn tạo ra trước đó

server '52.40.175.145', user: 'deploy', roles: %w{web app db}

Server IP chính là IPv4 Public của instance mà bạn đã tạo, trong mục description

Như vậy là mọi việc đã hoàn tất và giờ dùng lệnh để deploy code lên server

sudo service nginx restart

Nguồn tham khảo

https://www.sitepoint.com/deploy-your-rails-app-to-aws/


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí