Capistrano do wdrożenia aplikacji rails - jak poradzić sobie z długimi migracjami?

Więc używam Capistrano do wdrożenia aplikacji rails na moim serwerze produkcyjnym (apache+passenger) i w tej chwili wdrożenie zwykle przebiega zgodnie z zasadami:

$cap deploy
$cap deploy:migrations

Zacząłem się zastanawiać, powiedzmy, że moje migracje db:zajęły dużo czasu, aby wykonać je na serwerze produkcyjnym (duży refaktor schematu db) - w tym przypadku jaka jest najlepsza praktyka z Capistrano? Co się stanie, jeśli użytkownicy są połączeni z moją aplikacją w czasie wdrażania? Czy z wdzięcznością wysyłam użytkowników do statycznego strona zastępcza podczas aktualizacji bazy danych? Czy Capistrano zajmuje się tym automagicznie? Czy muszę zakodować przepis, aby w tym pomóc? A może wewnętrzne mechanizmy szyn / pasażerów oznaczają, że w ogóle nie muszę się martwić o ten konkretny przypadek?

Dzięki.
Author: John Topley, 2010-02-11

2 answers

Powinieneś umieścić stronę konserwacji, jeśli aplikacja nie będzie dostępna przez jakiś czas. Używam tego zadania 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

Plik app/views/admin/maintenance.html.erb powinien zawierać:

<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>

Ostatnim krokiem jest skonfigurowanie wirtualnego hosta Apache z niektórymi dyrektywami w celu wyszukania pliku maintenance.html i przekierowania do niego wszystkich żądań, jeśli jest obecny:

<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>

Aby uruchomić aplikację w trybie konserwacji, Uruchom cap deploy:web:disable i przywróć ją do życia do cap deploy:web:enable.

 36
Author: John Topley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-11 13:46:43

Moje wdrożenia produkcyjne generalnie podążają za tym procesem:

  1. cap production deploy:web:disable który kieruje wszystkie żądania do statycznej strony obsługi
  2. cap production deploy
  3. migracje itp., testowanie każdego z serwerów indywidualnie, aby upewnić się, że wszystko jest OK
  4. cap production deploy:web:enable aby strona działała tak, jak powinna

Odpowiedź Johna Topleya daje Ci dobre szczegółowe informacje TUTAJ.

 5
Author: dylanfm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-11 13:50:41