So I am using Capistrano to deploy a rails application to my production server (apache+passenger) and at the moment deployment usually goes along the lines:
因此,我正在使用Capistrano将一个rails应用程序部署到我的生产服务器(apache+passenger)上,目前部署通常是这样的:
$cap deploy
$cap deploy:migrations
It got me wondering, let's say my db:migrations took a long time to execute on the production server (a big refactor of the db schema) - in this case what is best practice with Capistrano? What happens if users are connected to my application at the time of deployment? Should I gracefully send users to a static placeholder page while the database is being updated? Does Capistrano handle this automagically? Do I need to code up a recipe to help with this? Or does the internal mechanisms of rails / passenger mean that I don't have to worry at all about this particular case?
让我感到疑惑的是,假设我的db:迁移花了很长时间才在生产服务器上执行(这是db模式的一个大重构)——在这种情况下,Capistrano的最佳实践是什么?如果用户在部署时连接到我的应用程序会发生什么?在更新数据库时,是否应该优雅地将用户发送到静态占位符页面?Capistrano是自动处理这个问题的吗?我需要编个食谱来帮助你吗?或者是轨道/乘客的内部机制意味着我完全不需要担心这个特例?
Thanks.
谢谢。
2 个解决方案
#1
36
You should put up a maintenance page if the application is not going to be available for a while. I use this Capistrano task:
如果应用程序在一段时间内不可用,您应该建立一个维护页面。我使用这个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
The app/views/admin/maintenance.html.erb
file should contain:
app /视图/ 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>
The final step is to configure the Apache virtual host with some directives to look for the maintenance.html
file and redirect all requests to it if it's present:
最后一步是使用一些指令配置Apache虚拟主机来查找维护。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>
To put the application into maintenance mode, run cap deploy:web:disable
and to make it live again do cap deploy:web:enable
.
要使应用程序进入维护模式,运行cap deploy:web:disable并使其重新生效,请执行cap deploy:web:enable。
#2
5
My production deploys generally follow this process:
我的产品部署一般遵循以下流程:
-
cap production deploy:web:disable
which directs all requests to a static maintenance page - cap产品部署:web:禁用,它将所有请求定向到静态维护页面
cap production deploy
- 帽生产部署
- migrations etc, testing each of the servers individually to make sure things are OK
- 迁移等等,分别测试每个服务器以确保一切正常。
-
cap production deploy:web:enable
to make the site work as it should - cap产品部署:web:使站点能够正常工作
John Topley's response gives you some good in depth info here.
John Topley的回复给了你一些深入的信息。
#1
36
You should put up a maintenance page if the application is not going to be available for a while. I use this Capistrano task:
如果应用程序在一段时间内不可用,您应该建立一个维护页面。我使用这个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
The app/views/admin/maintenance.html.erb
file should contain:
app /视图/ 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>
The final step is to configure the Apache virtual host with some directives to look for the maintenance.html
file and redirect all requests to it if it's present:
最后一步是使用一些指令配置Apache虚拟主机来查找维护。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>
To put the application into maintenance mode, run cap deploy:web:disable
and to make it live again do cap deploy:web:enable
.
要使应用程序进入维护模式,运行cap deploy:web:disable并使其重新生效,请执行cap deploy:web:enable。
#2
5
My production deploys generally follow this process:
我的产品部署一般遵循以下流程:
-
cap production deploy:web:disable
which directs all requests to a static maintenance page - cap产品部署:web:禁用,它将所有请求定向到静态维护页面
cap production deploy
- 帽生产部署
- migrations etc, testing each of the servers individually to make sure things are OK
- 迁移等等,分别测试每个服务器以确保一切正常。
-
cap production deploy:web:enable
to make the site work as it should - cap产品部署:web:使站点能够正常工作
John Topley's response gives you some good in depth info here.
John Topley的回复给了你一些深入的信息。