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 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 {
        width: 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