Tworzymy stronę "Under construction"
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.

