Таким образом, я использую Capistrano для развертывания приложения направляющих на моем рабочем сервере (apache+passenger), и в данный момент развертывание обычно продвигается строки:
$cap deploy
$cap deploy:migrations
Это получило меня удивление, скажем, мой db:migrations занял много времени для выполнения на рабочем сервере (большое осуществляют рефакторинг схемы дб) - в этом случае, что такое лучшая практика с Capistrano? Что происходит, если пользователи подключены к моему приложению во время развертывания? Я должен корректно отправить пользователей в статическую страницу заполнителя, в то время как база данных обновляется? Capistrano обрабатывает это автоволшебно? Я должен кодировать рецепт для помощи с этим? Или внутренние механизмы направляющих / пассажир означают, что я не должен волноваться вообще об этом конкретном случае?
Спасибо.
Вам следует разместить страницу обслуживания, если приложение не будет доступно в течение некоторого времени. Я использую эту задачу 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
.
Мои производственные развертывания обычно следуют следующему процессу:
cap production deploy: web: disable
, который направляет все запросы на статическую страницу обслуживания cap production deploy
cap production deploy: web: enable
, чтобы сайт работал должным образом Ответ Джона Топли дает вам здесь полезную подробную информацию.