Pamiętacie animowane gify z początku Internetu? Kilkanaście lat temu najważniejszą rzeczą w procesie tworzenia strony było wrzucenie na serwer świecącego animowanego gifa, obowiązkowo z widokiem placu budowy i wielkim under construction. Potem wystarczyło już nigdy nie zaglądać na ten serwer i mieliśmy piękną stronę wiecznie w budowie (jak Świątynia Opatrzności Bożej).

W dobie blogów w 15 minut i silinków ala demotywatory za 50zł, o wrzuceniu tekstu "strona w budowie" nikt już nie myśli. Czasem jednak chcielibyśmy mieć możliwość wygodnego poinformowania użytkowników, że robimy migrację lub właśnie coś zmieniamy. Dziś szybki przepis jak to zrobić.

Potrzebne nam będą:

  • Nginx z Passengerem jako serwer http.
  • Capistrano jako narzędzie do deploymentu.
  • Railsowa aplikacja.
  • Strona z gifem under construction, może być też jakiś stylowy licznik, że wracamy za 7 dni.
  • Butelka piwa - zawsze się przyda.

Nasz plik z gifem nazwijmy maintenance_file.html, umieśćmy w katalogu public i dodajmy go do repozytorium.

public/maintance_file.html

Na serwerze znajdźmy plik konfiguracyjny nginxa. Prawdopodobnie znajduje się w katalogu /opt/nginx/conf/nginx.conf. Wewnątrz dyrektywy server dodajmy następujący wpis:

if (-f $document_root/maintenance.html) {
  rewrite ^(.*)$ /maintenance.html break;
}

Cały dyrektywa server powinien wyglądać wtedy podobnie do poniższego.

server {
    server_name www.foo.com;
    listen 80;
    root /webapps/foo/public;
    passenger_enabled on;
		
    if (-f $document_root/maintenance.html) {
        rewrite ^(.*)$ /maintenance.html break;
    }
}

Jeśli w katalogu public jest plik maintance.html to wtedy o cokolwiek nie poprosimy, to dostaniemy ten plik. Dlatego plik w naszym repozytorium nazywa się inaczej (maintence_file.html). Zostało teraz tylko tak przygotować capistrano, by przed restartem w naszym katalogu public pojawiał się plik maintance i znikał po jego zakończeniu.

before 'deploy:restart', 'deploy:disable_site'
after 'deploy:restart', 'deploy:enable_site'

namespace :deploy do
  desc "Enables site"
  task :enable_site, :roles => :app do
    run "rm -f #{current_path}/public/maintenance.html"
  end

  desc "Disables site"
  task :disable_site, :roles => :app do
    run "ln -nfs #{current_path}/public/assets/maintenance.html /
     #{current_path}maintenance_file.html"
  end
end

I to wszystko. Osobną kwestią, pozostaje, w którym momencie chcemy pokazywać użytkownikowi informację o niedostępności strony, ale cały mechanizm pozostaje bez zmian. Użytkownicy Appacha, mogą zastosować podobny mechanizm.

Byłbym zapomniał. Jak wszystko zadziała ładnie, to możemy wypić piwo.