Ako riešite „maintenance mode“?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
PhelixMad
Člen | 36
+
0
-

Zdravím, chcel by som sa spýtať ako riešite vy „maintenance mode“?

Riešite to len odkomentovanim requiru v index.php bez naslednej možnosti testovania?

Alebo ste si napísali v BasePresenter metodu starup? Alebo nejak inak?

Bol by som rad, ak by ste sa podelili o vás „algoritmus“ ako to riesite alebo ako si myslíte, že je to správne?!

Ďakujem :)

Michal Vyšinský
Člen | 608
+
+1
-

Ahoj. Otázka je, jestli je to vůbec potřeba, u nás máme staging environment, kde se vše důkladně otestuje a jednou za čas se udělá release do produkce, takže nepotřebujeme maintenance mód a testovat přímo na produkci. Deployment máme automatizovaný (bash skript spuštěný přes CircleCI).

Před začátkem kritické části deploye – composer, migrace, update zdrojáků – úplně přepíšeme soubor index.php. Po ukončení kritické části se se index.php znovu přepíše na aktuální a web běží dál… teda většinou :)

Editoval Michal Vyšinský (19. 5. 2015 12:32)

one-two
Člen | 80
+
0
-

mám upravený index.php, aby zapnul maintenance podle souboru maintenance.txt, takže pak přes nějakej deploy skript stačí echo "1" > maintenance.txt + soubor s IP adresama, pro který se nezapíná

Michal Vyšinský
Člen | 608
+
+1
-

@one-two u tohoto řešení je problém to, že i na produkci pak voláš při každém spuštění is_file()/file_exists() nebo podobnou funkci, která není zrovna nejrychlejší – šaháš na disk

Editoval Michal Vyšinský (19. 5. 2015 13:10)

newPOPE
Člen | 648
+
+2
-

V jednoduchosti: len prepiname symlink :)

Detailnejsie:

  1. stage server (kde bezi CI Jenkins) sosne zdrojaky
  2. urobi build (composer, gulp, …)
  3. nastavi symlinky (aj na neexistujuce cesty, oni existuju az na produkcii :)) na log, temp, upload foldre. obsah ktory je cross buildy persistentny (inspirovane capistranom)
  4. dany build zbali (tar)
  5. prenesie na production server
  6. tam to rozbali do priecinka (napriklad /var/www/<project>/builds/<nejaky timestamp>)
  7. spusti DB migracie
  8. prepne symlink current → na dany build
  9. end

struktura na produkcii je nasledovna:

  • builds = adresar s buildami
  • shared = obsah ktory je len na produkcii (napr. uploady obrazkov atd…)
  • current = symlink na posledny build

Pokial nemas nejak vytazenu app/server tonami pouzivatelov tak je to v pohode.

Editoval newPOPE (19. 5. 2015 13:57)

one-two
Člen | 80
+
0
-

@MichalVyšinský neni to trochu přehnaný? přiznám se, že jsem neprofiloval kolikrát se tyhle funkce volaj například v nette a doctrine, ale mam trochu pocit, že to „zbrždění“ je zanedbatelný… Nicméně přepsat celej index.php zní zajímavě :)

@newPOPE takže pokud někdo zrovna trefí request během db migrace, tak mu to spadne? :)

newPOPE
Člen | 648
+
0
-

@one-two asi. Ked mas riesenie rad sa poucim ako sa tomu vyhnut.

David Kudera
Člen | 455
+
0
-

Taky by mě zajímalo (na postgre). Všechno se provede při deployi bokem, ale kvůli db migracím se na chvíli musí spustit maintenance a vůbec se mi to nelíbí…

one-two
Člen | 80
+
0
-

@newPOPE bohužel moc ne, resp zapínám maintenance přesně akorát na ty migrace (reálně tak 2 sec), zbytek mam jinak stejně jako ty

jinak používám ShipitJS – je to vpodstatě to samé jako Capistrano, akorát nemusim psát nic v Ruby :)