Deploy rails app to EC2
Bài đăng này đã không được cập nhật trong 6 năm
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
All rights reserved