Triển khai ứng dụng RAILS trên EC2 INSTANCE với CAPISTRANO sử dụng NGINX và PUMA
Bài đăng này đã không được cập nhật trong 3 năm
Đâ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