Deploy web aplikace na linuxový server

harrison314

Deploy web aplikace na linuxový server
« kdy: 09. 07. 2018, 18:59:53 »
Hladam sposob ako jednoducho deployovat nove verzie webobych palikacii na linux servery (ubuntu, centos).
Pochadzam z Windows sveta, kde je na to Web Deploy.

Momentalna situacia je taka:
  • Vyvojari vyrvoria novy balicek z apliaciu (zip subor zo spustitelnou aplikaciu)
  • Admin si ho stiahne k sebe.
  • Zastavi systemd sluzbu danej webovej apliacie.
  • Nahra nove subory aplikacie na server a pri tom dava pozor aby si neprepisal nezalohovane konfigy.
  • Admin spusti sluzbu a dufa, ze znovu nabehne.

Ako zacat z automatizaciou tohto procesu vramci Ci/Di, nejde mi teraz ani o to ako veci buildovat, ide mi o to co pouzit na nasadenie aplikacie na sever.
Ake programy alebo nastroje sa pouzivaju na strane produkcneho serveru aby slo aplikaciu nasadit automaticky napriklad pouzitim jej postnutim cez HTTP (ako to ma Azure pomocou Kudu), alebo inak, proste nieco na co viem napojit ine nastroje.
Aj je daco nejasne pytajte sa.
« Poslední změna: 09. 07. 2018, 20:43:54 od Petr Krčmář »


kraxna

Re:Deploy web aplikacie na Linuxovy server
« Odpověď #1 kdy: 09. 07. 2018, 19:01:48 »
Kubernates + integrace do libovolneho CI

harrison314

Re:Deploy web aplikacie na Linuxovy server
« Odpověď #2 kdy: 09. 07. 2018, 19:02:55 »
Zabudol som dodat, ze na deploy a prveadzku sa nesmie pouzit Docker ani ina kontainerizacna technologia (to je na tom tazke).

Jose D

  • *****
  • 850
    • Zobrazit profil
Re:Deploy web aplikacie na Linuxovy server
« Odpověď #3 kdy: 09. 07. 2018, 19:12:59 »
puppet nebo jakykoliv jiny automate tool.

kraxna

Re:Deploy web aplikacie na Linuxovy server
« Odpověď #4 kdy: 09. 07. 2018, 19:19:54 »
Zabudol som dodat, ze na deploy a prveadzku sa nesmie pouzit Docker ani ina kontainerizacna technologia (to je na tom tazke).

To je dost ... pitomy omezeni :-)
Jak uz tu psal Jose, puppet je urcite dobra volba.

Ale stejne tak to asi muzes zautomatizovat i treba pomoci obycejneho Jenkinse a SSH pluginu, prip. spustit Jenkins slave na tom danem stroji.

Ale je to uplne jiny pristup / architektura nez jakou ma Web Deploy


Re:Deploy web aplikacie na Linuxovy server
« Odpověď #5 kdy: 09. 07. 2018, 20:15:37 »
  • Oddělí se konfigurace od samotné aplikace, aby nebylo při instalaci nové verze dávat pozor, aby se něco nepřepsalo.
  • Aplikace se rozbaluje do nového umístění (původní služba stále běží).
  • Aplikace se přehodí do nového umístění

Ten třetí krok záleží na konkrétním způsobu fungování aplikace – pokud běží pod webovým serverem, který pouze servíruje soubory z disku (třeba PHP aplikace nebo statický web), stačí web serveru změnit symlink na kořenový adresář aplikace. Pokud má ta aplikace integrovaný web server a umí spolupracovat se socketovou aktivací systemd, dá se použít k bezvýpadkové změně to. Jinak je pro co nejkratší výpadek potřeba spolupráce aplikace, aby si uměla prohodit port se starou verzí. A pokud krátký výpadek nevadí, tak se prostě zastaví stará verze služby a pak nastartuje nová verze.

Puppet, Kubernetes, Ansible, distribuční balíčkovací nástroje a další mají smysl tehdy, pokud tím chcete spravovat víc aplikací, nebo vám ta aplikace běží v několika instancích. Pokud ta aplikace běží na jednom serveru, stačí shell skripty – bylo by pracnější starat se o ty automatizační nástroje než o tu samotnou aplikaci.

dustin

Re:Deploy web aplikacie na Linuxovy server
« Odpověď #6 kdy: 09. 07. 2018, 20:46:04 »
Nevím, zda je to "systémové", ale u systémů, které se nikam nedistribuují a provozujeme si je sami (či já sám v případě domácích projektů), se mi vždycky osvědčilo verzovat i konfigy minimálně pro cílový stroj a před nasazením je deploy skriptem symlinkovat do finálních cest/názvý souborů.

Vygeneruje se app-cadidate, shodí aktuální verze app-current, přesune do app-previous, app-candidate se  přesune (rychlý mv) do app-current, spustí, hodí se základní test, že to běží a když ten neprojde, shodí se, přesune se do app-failed-datum, vratí app-previous -> app-current a nastartuje. Tenhle deploy dělá skript, je to triviální, žádná věda. Nepoužíváme kontejnery, vše je v jednom adresáři.

app-failed-datum je pak čas prozkoumat, proč se deploy nepovedl. V app je  samozřejmě soubor s informací o head commitu buildu.

harrison314

Re:Deploy web aplikacie na Linuxovy server
« Odpověď #7 kdy: 10. 07. 2018, 07:54:38 »
Zabudol som dodat, ze na deploy a prveadzku sa nesmie pouzit Docker ani ina kontainerizacna technologia (to je na tom tazke).
To je dost ... pitomy omezeni :-)
Jak uz tu psal Jose, puppet je urcite dobra volba.

Problem je, ze robim vo vysoko secure prostredi, siete zo servermi a z gitlabom sa navzajom nevidia, kontainer je v podstate nadavka, sambu a sietove disky pouzit nemozem, v podstate nic co saha na system, plus dane stroje su v DMZ a nemaju pristup k internetu.

Pre to som dufal v nieco ako Web Deploy alebo Kudu, kde by som to proste na dany endpoint deployol cez HTTPS.


  • Oddělí se konfigurace od samotné aplikace, aby nebylo při instalaci nové verze dávat pozor, aby se něco nepřepsalo.
  • Aplikace se rozbaluje do nového umístění (původní služba stále běží).
  • Aplikace se přehodí do nového umístění

1. Krok jedna uz je zvladnuty davno, ale ked to nasadzujes rucne nehody sa stanu aj tak, preto chcem ten ludsky faktor vytlacit.

Tu mam problem s krokom 3, je to samsostane beziaca aplikacia, ziadne skripty, ktora bezi na danom porte a ten nejde prehodit pocas behu.

dustin

Re:Deploy web aplikace na linuxový server
« Odpověď #8 kdy: 10. 07. 2018, 08:37:48 »
Shodíš, přesuneš, nahodíš v původním místě se stejným portem. Stejně to musíš shodit. Co na tom nejde?

andy

Re:Deploy web aplikace na linuxový server
« Odpověď #9 kdy: 10. 07. 2018, 08:41:24 »
Tu mam problem s krokom 3, je to samsostane beziaca aplikacia, ziadne skripty, ktora bezi na danom porte a ten nejde prehodit pocas behu.
Tento krok moze znamenat tolko, ze presmerujes symbolicky odkaz. To co by si chcel urobit sa systemovo da, pozri sa ako to riesia napr tu https://github.com/rcrowley/goagain.
Jednoduche riesenie je ale bindnut na localhost a nejaky vhodny port, pred to sa da reverse proxy (napr nginx). Potom co nahodis novu apku a vsetko je ok (test napr cez healthcheck url), zmenis port v nginx na novu verziu a reloadnes config. Ma to zopar hacikov a obmedzeni, ale je to asi najjednoduchsie riesenie.

j

Re:Deploy web aplikace na linuxový server
« Odpověď #10 kdy: 10. 07. 2018, 08:49:02 »
Hele a co od toho cekas? Ty resis atomovku, a pritom chces mozna jen trikolku ...

1) muzes pouzit standardni balickovac dotycnyho distra, tzn vyrobit si prislusnej balicek (a kazdy jedno distro umi pridat privatni repo, takze to muzes mit i centralne distribuovany)
2) muzes proste napsat par radku v bashi
...
milion dalsich moznosti

Vse zavisi jen na tom, co od toho chces, a to si tu nenapsal. Pokud ti jde jen o to, ze potrebujes vymenit A za B a restart sluzby nevadi, tak na to nepotrebujes vubec nic, jen tech par radku scriptu. Normalne to stopnes, vymenis a nastartujes.

Pokud potrebujes aby to bylo bez vypadku, musi to podporovat i ta tvoje aplikace. Trebas SSH restartnes pripojenej na to sshcko, a ani te neodpoji, narozdil od widlordp. Jednoduse pro aktivni sessions zustava bezet puvodni aplikace, ale uz neposloucha na portu pro nove prichozi.

andy

Re:Deploy web aplikace na linuxový server
« Odpověď #11 kdy: 10. 07. 2018, 09:02:02 »
Jj, vymysli si najprv co chces mat ako konecny stav a nie ze nieco nejako. Ked napises, ze nema ten server nikde pristup a je to high secure prostredie, tak neviem ci tu je vobec co riesit. Ten admin to robi rucne asi z nejakeho dovodu.

Re:Deploy web aplikacie na Linuxovy server
« Odpověď #12 kdy: 10. 07. 2018, 09:31:26 »
Tu mam problem s krokom 3, je to samsostane beziaca aplikacia, ziadne skripty, ktora bezi na danom porte a ten nejde prehodit pocas behu.
Udělal bych na to jednoduchý skript, který rozbalí noovu verzi do nového adresáře, zastaví službu, přehodí symlink na novou verzi a službu nastartuje.

Kód: [Vybrat]
#!/bin/sh
set -e
cd "$(dirname "$0")"

VERSION=`cat upload/version.txt`

mkdir /opt/server/$VERSION
unzip -q upload/server-$VERSION.zip -d /opt/server/$VERSION

sudo systemctl stop server.service
ln -sn --backup=simple $VERSION /opt/server/current
sudo systemctl start server.service

ttt

Re:Deploy web aplikace na linuxový server
« Odpověď #13 kdy: 10. 07. 2018, 09:47:52 »
Ansible, vlastní skript nebo něco hotového (třeba https://github.com/ansistrano/deploy). Na serveru je potřeba mít nainstalovaný python. Má to čitelnější výstup než shell skript, výsledek bude podobný.

harrison314

Re:Deploy web aplikace na linuxový server
« Odpověď #14 kdy: 10. 07. 2018, 10:11:24 »
Hele a co od toho cekas? Ty resis atomovku, a pritom chces mozna jen trikolku ...

Skumam ake mam moznosti.
Rad by som sa vyhol custom skriptom (treba ich pisat, odladovat a udrzovat) na druhej strane by som sa aj rad vyhol riesniam ako Pupet, lebo mi to pride ako kanon na vrabce.

Proste zistujem ake su moznosti a co sa pouziva inde.

Co sa tyka resrtu sluzbu, tak ten je potrebny a v sucastnosti vypadok sluzby pre zakaznika na par minut nevadi, no rad by som sa dostal do stavu, kedy by zakaznik vypadok sluzby ani nezaznamenal.