0

Deploy Your Rails App to AWS Phần 1

Là một nhà phát triển chúng ta thường chỉ quan tâm đến các phần phát triển của các sản phẩm còn việc triển khai ứng dụng ra ngoài thì đó thường là trách nhiệm của các quản trị hệ thống. Nhưng không phải lúc nào chúng ta cũng có các quản trị hệ thống để triển khai sản phẩm của mình vì vậy chúng ta đôi lúc cũng phải tự mình triển khai sản phẩm của mình. Có rất nhiều lựa chọn để deploy 1 ứng dụng rails. Hôm nay tôi sẽ giới thiệu với các bạn về việc deploy một ứng dụng rails với aws(amazon web service) sử dụng Capistrano. Chúng ta sẽ sử dụng bộ ba Puma + Nginx + PostgreSQL. Puma sẽ là máy chủ ứng dụng, Nginx hoạt động như một reverse proxy server cho các giao thức HTTP, HTTPS, SMTP, POP3 và IMAP, cũng như cân bằng tải (load balancer) và HTTP cache, PostgreSQL là database server.

Sample Rails Application

Chúng ta tạo một ứng dụng rails mẫu với một model contact với đầy đủ chức năng thêm đọc sửa xóa.

rails new contactbook -d postgresql

sau khi tạo xong project mình tạo tiếp model contact vào các chức năng crud.

cd contactbook
rails g scaffold Contact name:string address:string city:string phone:string email:string

Cấu hình lại file config/database.yml và migrate database

rake db:create && rake db:migrate

chạy thử xem project đã chạy okay chưa.

rails s

Configuring Puma & Capistrano

Bây giờ chúng ta sẽ cấu hình project cho việc deploy. Như đã được nhắc đến từ trước, Puma là server của ứng dụng và Capistrano là một deployment tool. Capistrano cung cấp tích hợp cho Puma và RVM, vì vậy hãy thêm những gem này vào Gemfile. Chúng tôi cũng sẽ sử dụng figaro gem để lưu cấu hình ứng dụng, chẳng hạn như mật khẩu cơ sở dữ liệu sản xuất và khóa bí mật.

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

để cài đặt gem bạn chạy lệnh.

bundle install

Chúng ta bắt đầu cấu hình Capistrano. Đầu tiên chúng ta chạy lệnh sau để tạo ra cái file cần thiết.

cap install STAGES=production

Sau khi chạy lệnh trên sẽ tạo ra các file cần thiết như config/deploy.rb and config/deploy/production.rb . deploy.rb là file cấu hình chính, production.rb bao gồm các cài đặt môi trường cụ thể như IP, user name ... Thêm các dòng sau vào Capfile. Capfile bao gồm các nhiệm vụ tích hợp RVM, Rails và Puma khi hoàn thành

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

và bây giờ edit file deploy.rb như sau.

lock '3.4.0'

set :application, 'contactbook'
set :repo_url, '[email protected]:devdatta/contactbook.git' # Edit this to match your repository
set :branch, :master
set :deploy_to, '/home/deploy/contactbook'
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

Chúng ta sẽ sửa file product.rb sau vì bây giờ chúng ta không biết IP và user Ngoài ra, tạo config / application.yml để lưu các thiết lập môi trường cụ thể trong môi trường phát triển. Tập tin này được sử dụng bởi figaro gem để tải cài đặt vào các biến môi trường. Chúng ta sẽ tạo ra một file tương tự trên môi trường phát triển. Các bạn lưu ý rằng 2 file config/database.yml and config/application.yml không nên đẩy lên git vì nó chứa các thông tin nhạy cảm.

Creating an EC2 Instance

Bây giờ chúng ta sẽ tạo ra EC2 Instance sau khi đã cấu hình deploy cho project. Đăng nhập vào Amazon web service login

Click ‘Launch Instance’ chọn một Amazon Machine Image (AMI). Chúng ta sẽ chọn ‘Ubuntu Server 16.04 LTS’ Chọn một loại instance theo các yêu cầu của bạn. Ở đây t chọn t2.micro bởi vì nó free và rẻ. Click ‘Next:Configure Instance Details’ để tiếp tục

default setting là rất hợp lý cho việc hướng dần này nên bạn click ‘Next: Add Storage’. mắc định storage là 8GB. Click ‘Next: Tag Instance’ Điền tên của instance vào rồi Click ‘Next: Configure Security Group’ Click Add Rule và chọn HTTP. Điều này là cần thiết để làm cho máy chủ nginx truy cập được từ Internet. Click ‘Review and Launch’ Sau khi tạo thành công thì chúng ta sẽ được như sau

Chúng ta đã được 1/2 chặng đường còn phần cài đặt server mình sẽ trình bày ở phần tiếp theo.

Tham Khảo

Link tham khảo


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.