Ruby / Rails отображает общий экран, когда изменения выполняются на сервере - PullRequest
3 голосов
/ 09 марта 2010

У меня есть приложение ruby ​​on rails, на котором запущен сервер, и иногда его нужно удалить для обновлений / и т.д.На данный момент я вижу, что во время периодов обновления (когда приложение не работает) у меня есть общий экран отображения - это замена файлов в каталоге / srv / www / так, чтобы он отображал общий экран везде, где пользователь могперейдите к.Я также думал о том, чтобы иметь файл центрального контроллера, который соединяет все остальные (по сути, основной), но это кажется противоинтуитивным для рельсов.

Существует много внешних ссылок на эти различные компоненты сайта, по которым пользователь может перейтиизвне, и мне нужно убедиться, что они всегда получают этот общий экран обновлений, когда приложение отключается на некоторое время.

Мне было интересно, есть ли у кого-нибудь другие идеи ... может быть, библиотека или что-то в этом родепохоже, я ничего не могу найти в Интернете.любые предложения будут оценены.

Спасибо

Ответы [ 3 ]

3 голосов
/ 09 марта 2010

Я бы настроил ваш веб-сервер (nginx или apache) для поиска страницы maintenance.html и предоставления ей статуса 503, если он существует. Таким образом, отключить каждый URL вашего приложения так же просто, как загрузить файл .html и удалить его, когда это будет сделано.

См. здесь и здесь для получения дополнительной информации.

0 голосов
/ 09 марта 2010

Я использую это задание Capistrano:

namespace :deploy do
  namespace :web do
    desc <<-DESC
      Present a maintenance page to visitors. Disables your application's web \
      interface by writing a "maintenance.html" file to each web server. The \
      servers must be configured to detect the presence of this file, and if \
      it is present, always display it instead of performing the request.

      By default, the maintenance page will just say the site is down for \
      "maintenance", and will be back "shortly", but you can customize the \
      page by specifying the REASON and UNTIL environment variables:

        $ cap deploy:web:disable \\
              REASON="a hardware upgrade" \\
              UNTIL="12pm Central Time"

      Further customization will require that you write your own task.
    DESC
    task :disable, :roles => :web do
      require 'erb'
      on_rollback { run "rm #{shared_path}/system/maintenance.html" }

      reason = ENV['REASON']
      deadline = ENV['UNTIL']      
      template = File.read('app/views/admin/maintenance.html.erb')
      page = ERB.new(template).result(binding)

      put page, "#{shared_path}/system/maintenance.html", :mode => 0644
    end
  end
end

Файл app/views/admin/maintenance.html.erb должен содержать:

<p>We’re currently offline for <%= reason ? reason : 'maintenance' %> as of <%= Time.now.utc.strftime('%H:%M %Z') %>.</p>
<p>Sorry for the inconvenience. We’ll be back <%= deadline ? "by #{deadline}" : 'shortly' %>.</p>

Последний шаг - настроить виртуальный хост Apache с некоторыми директивами для поиска файла maintenance.html и перенаправления всех запросов к нему, если он присутствует:

<IfModule mod_rewrite.c>
  RewriteEngine On

  # Redirect all requests to the maintenance page if present
  RewriteCond %{REQUEST_URI} !\.(css|gif|jpg|png)$
  RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
  RewriteCond %{SCRIPT_FILENAME} !maintenance.html
  RewriteRule ^.*$ /system/maintenance.html [L]
</IfModule>

Чтобы перевести приложение в режим обслуживания, запустите cap deploy:web:disable и снова включите его, выполните cap deploy:web:enable.

0 голосов
/ 09 марта 2010

Capistrano имеет множество встроенных рецептов для отображения страниц обслуживания и полностью интегрирован с git / subversion. Делает развертывание и управление бризом.

...