Maintenance page on production
1. Mở đầu Maintenance page là gì? Khi dự án đã đưa vào hoạt động, chắc hẳn sẽ có những lúc cần tạm thời chặn các guest đang sử dụng hệ thống, thông báo bảo trì để cập nhật phiên bản, chạy job .... Lúc đó, chúng ta cần thông báo maintenace. Bài viết này mình muốn hướng dẫn cách tạo maintenace ...
1. Mở đầu
Maintenance page là gì? Khi dự án đã đưa vào hoạt động, chắc hẳn sẽ có những lúc cần tạm thời chặn các guest đang sử dụng hệ thống, thông báo bảo trì để cập nhật phiên bản, chạy job .... Lúc đó, chúng ta cần thông báo maintenace.
Bài viết này mình muốn hướng dẫn cách tạo maintenace page trong APP rails đang sử dụng capistrano để deploy, service nginx.
2. Cài đặt
gem 'capistrano', '~> 3.0' gem 'capistrano-maintenance', '~> 1.0', require: false
và tất nhiên là bundle install
3. Cách sử dụng
Capfile thêm dòng
require "capistrano/maintenance"
ssh vào các web servers vi /etc/nginx/sites-available/YOUR_APP.conf Thêm vào trong block server{}
server {
error_page 503 @503; # Return a 503 error if the maintenance page exists. if (-f /usr/local/rails_apps/YOUR_APP/current/public/system/maintenance.html) { return 503; } location @503 { # Serve static assets if found. if (-f $request_filename) { break; } # Set root to the shared directory. root /usr/local/rails_apps/YOUR_APP/current/public; rewrite ^(.*)$ /system/maintenance.html break; }
} Chuẩn bị file html.erb copy vào app/views/layouts/maintenance.html.erb
<!DOCTYPE html> <html> <head> <title>Maintenance</title> <style type="text/css"> body { awidth: 400px; margin: 100px auto; font: 300 120% "OpenSans", "Helvetica Neue", "Helvetica", Arial, Verdana, sans-serif; } h1 { font-weight: 300; } </style> </head> <body> <h1>Maintenance</h1> <p>The system is down for maintenance.</p> <p><%= deadline %></p> </body> </html>
Thêm vào app/config/deploy.rb
set :maintenance_template_path, File.expand_path("../../app/views/layouts/maintenance.html.erb", __FILE__)
Thực ra đến đây bạn đã có thể excute command này để bật maintenance:
cap maintenance:enable REASON="hardware upgrade" UNTIL="12pm Central Time"
Để tắt
cap maintenance:disable
Chúng ta có thể viết thêm rake task cho dễ sử dụng
namespace :maintenance do task enable: :environment do start_time = I18n.l Time.zone.now, format: Settings.timestamp end_time = I18n.l 2.hour.since, format: Settings.timestamp time_range = "#{start_time}〜#{end_time}" %x[DEPLOY_REF=master bundle exec cap #{Rails.env} maintenance:enable UNTIL="#{time_range}"] end task disable: :environment do %x[DEPLOY_REF=master bundle exec cap #{Rails.env} maintenance:disable] end end
Settings. app/config/settings.yml
timestamp: "%Y-%m-%d %H:%M:%S"
Đã config xong, Rake này có thể chạy cả trên staging và production, từ nay chúng ta chỉ cần quan tâm đến 2 command Bật maintenance
bundle exec rake maintenance:enable
Tắt
bundle exec rake maintenance:disable
4. Tổng kết
Như vậy, với việc sử dụng gem capistrano-maintenance chúng ta đã tạo ra maintenance page cho website, hi vọng bài viết này hữu ích. Dưới đây là link tham khảo https://github.com/capistrano/maintenance