-1

Triển khai ứng dụng RAILS trên EC2 INSTANCE với CAPISTRANO sử dụng NGINX và PUMA

Đây là hướng dẫn / hướng dẫn về cách thiết lập và triển khai ứng dụng Rails của bạn tới trường hợp AWS Ec2 (Ubuntu Server). Trong hướng dẫn này, tôi đã làm việc từ một Ubuntu 16.10 và gần đây tôi đã quyết định thử nó trên Linux Mint (cũng là Debian dựa như Ubuntu) và nó đã làm việc! Trong hướng dẫn này tôi đã sử dụng các công cụ sau:

  • RVM (on local machine as well as Ec2 instance)
  • PostgreSQL
  • Capistrano
  • GitHub Hãy bắt đầu triển khai ứng dụng rails của bạn tới Ec2 instance với Capistrano bằng nginx và puma server:

1. Create Rails App

rails new commodre -d postgresql

Tạo một trang blog đơn giản

cd commodre
rails g scaffold Blog title:string content:text

chỉnh sửa file config/database.yml với các thông tin cần thiết như là username, password, host: localhost. Thêm vào file /config/routes.rb:

root 'blogs#index'

Create database và tạo bảng

rake db:create
rake db:migrate
rails s

Chuyển tới trang localhost:3000 Nếu nó hoạt động tốt, hãy tắt server bằng tổ hợp lệnh Ctrl + C

2. Cài đặt Capistrano and Puma (trên local machine)

Thêm vào trong Gemfile

gem 'figaro'

gem 'puma' #Should already be in your Gemfile

group :development do

  gem 'capistrano'

  gem 'capistrano3-puma'

  gem 'capistrano-rails' #Should already be in your Gemfile

  gem 'capistrano-bundler'

  gem 'capistrano-rvm'

end

Chạy bundle install trong terminal Để generate Capistrano configuration, chay lệnh

cap install STAGES=production

(Trong trường hợp nó không hoạt động thử với đoạn lệnh bundle exec cap install STAGES=production) Thêm vào Capfile

require 'capistrano/rvm'

require 'capistrano/bundler'

require 'capistrano/rails/migrations'

require 'capistrano/rails/assets' 

require 'capistrano/puma'

Thêm vào file deploy.rb

set :application, 'commodre'

set :repo_url, 'git@github.com:ohiodn8/commodre.git' # should match git repo

set :branch, :master

set :deploy_to, '/home/deploy/commodre'

set :pty, true

set :linked_files, %w{config/database.yml config/secrets.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, 'ruby-2.4.0' # Should match ruby version


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

3. Cài đặt Ec2

Việc dùng accout là bắt buộc, nếu bạn chưa có thì có thể đăng kí ở đây aws.amazon.com (Tuy nhiên bạn co thể tham khảo thêm trang https://qwiklabs.com/ ) Thêm security group giống như bạn nhìn hình ở tren và sau đó nhấn nút launch app.... tiếp đến là lựa chọn một cặp khóa. Scroll down và click view Instances button Di chuyển cặp key silence.pem đã tải xuống thư mục. Chúng ta sẽ tạo một folder (cred) trên Desktop cho cặp key

4. START A NEW TERMINAL FOR YOUR EC2 INSTANCE/SERVER

Tại local machin, start new termial cho các bước tiếp theo cd vào thư mục

cd /home/odion/Desktop/Cred

Bạn nên sử dụng account của mình (hihi)

chmod 400 silence.pem

Login into to the ec2 instance/server (copy your IPV4 public DNS from your running Ec2 Instance)

ssh -i silence.pem ubuntu@ec2-34-210-21-124.us-west-2.compute.amazonaws.com

Xin chúc mừng, bây giờ bạn đã ở trong EC2 instance. Chúng ta sẽ path các instance bằng việc thực hiện

sudo apt-get update && sudo apt-get -y upgrade

Create a user

sudo su

Di chuyển vào thư mục gốc

adduser deploy

Kiểm tra người dùng có được tạo hay chưa

id deploy

Cấp quyền cho người dùng mới

sudo nano /etc/sudoers

Add

deploy  ALL=(ALL:ALL) ALL

Thực hiện save file bằng tổ hợp phím ctrl x and type y and Enter Chuyển sang deploy user và tạo ssh key cho user

su - deploy
ssh - keygen

Không cần đặt passpharse và chỉ cần click vào Hiển thị danh sach file thư mục

ls -al

Chúng ta đã có file .ssh trong thư mục

cd .ssh
ls
cat id_rsa.pub

Thực hiện việc copy and paste vào notepad

5

Bước này chúng ta sẽ chuyển qua Lcal Machine terminal... một bước rất quan trọng. Nếu bạn đã từng thử cài đặt Capistrano trước đây, và trong khi triển khai nó có một số lỗi SSH NET, điều này chỉ có thể khắc phục được nó. Tại local machine terminal của bạn:

cd home
ls

Bạn sẽ lthaays thư mục user, của mình là odion.

cd idion/.ssh
ls

Tôi đã generated id_rsa vaf id_rsa.pub tại đây và sau đó nhận về SSH NET error và fixed

6. Cài đặt NGINX

Tại Ec2 install/server:

cd ..
pwd

Bạn sẽ nhận được môt vài thứ như là /home/deploy

sudo apt-get install nginx

Trong lần đầu tiên nginx được cài đặt, thực hiện logout nó

exit

Điều này sẽ đưa bạn trở lại người dùng gốc và đăng nhập lại

su - deploy

Chúng ta sẽ sửa một tập tin. Thay vì nano, chúng ta sẽ sử dụng vim

sudo vi /etc/nginx/sites-available/default

Thên đoạn mã vào cuối trang

upstream app {
  # Path to Puma SOCK file, as defined previously
  server unix:/home/deploy/commodre/shared/tmp/sockets/puma.sock fail_timeout=0;
}

server {
  listen 80;
  server_name localhost;

  root /home/deploy/commodre/current/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;
}

Click ESC , shift : and type wq! and bấm Enter

7. Hoàn tất

Chuyển tới thư mục Local Machine /config/deploy/production.rb Thêm dòng này vào cuối trang server '34.210.21.124', user: 'deploy', roles: %w{web app db} Đặt vào Ec2 public IPV4 nơi mà nó nói là máy chủ và thực hiện save. Tại local machine terminal, cố gắng tìm đưuòng đến ứng dụng của bạn

pwd
cd /home/odion/sites/commodre

(Đây là dành cho tôi,... cố gắng thực thực hiện với ứng dụng của bạn) Now run...

cap production deploy

Thực hiện việc add secret key cho app

cd /home/deploy/commodre/current
ls

Cần liệt kê thư mục gốc của ứng dụng

rake secret

Hoặc bundle exec rake secret nếu câu lệnh trên không hoạt động Bạn sẽ nhận được một đoạn string. Copy and paste vào notepad sau đó chạy

sudo nano /etc/environment

paste vào cuối file

export SECRET_KEY_BASE=rake secret

ruby -e 'p ENV["SECRET_KEY_BASE"]

Nơi rake secret mà bạn đã lưu

Chạy lệnh

echo $SECRET_KEY_BASE

Nếu ko thấy kết quả có thể bạn sẽ phải logout và thực hiện lại.

Restart nginx server. . .

sudo service nginx restart

Để xem các tiến trình đang chạy:

ps aux | grep puma

Restart the daemon puma server : kill -s SIGUSR2 24673

Stop the server: kill -s SIGTERM 24673

Tổng kết

Hi vọng giúp ích được phần nào cho các bạn đang tìm hiểu về việc cài đặt và triển khai ứng dụng rails với capistrano sử dụng nginx và puma Nguồn: http://www.dsolc.com/blogs/8-deploying-rails-app-to-ec2-instance-with-capistrano-using-nginx-and-puma


All Rights Reserved

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