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.