Deploy rails app to EC2
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: ...
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 đượ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
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
https://www.sitepoint.com/deploy-your-rails-app-to-aws/