gpt4 book ai didi

ruby-on-rails - Capistrano 部署 Rails 应用程序 - 如何处理长时间迁移?

转载 作者:行者123 更新时间:2023-12-03 10:38:16 25 4
gpt4 key购买 nike

所以我正在使用 Capistrano 将 Rails 应用程序部署到我的生产服务器(apache+passenger),目前部署通常是这样的:

$cap deploy
$cap deploy:migrations

这让我想知道,假设我的 db:migrations 在生产服务器上执行了很长时间(对 db 模式进行了很大的重构)——在这种情况下,Capistrano 的最佳实践是什么?如果用户在部署时连接到我的应用程序会发生什么?我应该在更新数据库时优雅地将用户发送到静态占位符页面吗? Capistrano 会自动处理这个问题吗?我需要编写一个食谱来帮助解决这个问题吗?或者rails/passenger的内部机制是否意味着我完全不必担心这个特殊情况?

谢谢。

最佳答案

如果应用程序暂时不可用,您应该建立一个维护页面。我使用这个 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 .

关于ruby-on-rails - Capistrano 部署 Rails 应用程序 - 如何处理长时间迁移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2244263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com