Jednoduchý deployment s pomocou SSHFS a dobrého hostingu
Kopírovať súbory na webserver pomôcou FTP je hrôza, no môžete si to uľahčiť použitím rsync. Čo však robiť, keď ich chcete nahrávať na server priamo z repozitára?
Predvčerom Igor Hlina (@srigi) publikoval na ich firemnom blogu skvelý článok o protokole rsync. Tí, ktorí kopírujete dáta na server pomocou FTP, by ste si ho určite mali pozrieť - ušetríte si kopec času.
V mojom článku sa však nebudem venovať ani FTP ani rsync, ale ukážem vám, ako spraviť deployment na 2 kroky.
SSHFS
Ak ste doteraz nepoznali SSHFS (Secure SHell FileSystem), tak je najvyšší čas ho spoznať, pretože práve pomocou sshfs
sa môžete pripojiť k svojmu hostingu (napríklad vo WebSupporte).
Stačí vám akákoľvek linuxová mašina s nainštalovaným sshfs
(kľudne Ubuntu, kde ho nainštalujete príkazom apt-get install sshfs
) a podpora šifrovaného pripojenia cez SSH k vášmu hostingu u poskytovateľa - čo už je na Slovensku väčší problém.
SSHFS vám umožní namountovať si celý webhosting do lokálneho adresára vášho PC.
vlado@pc:~$ mkdir ujovlado.sk
vlado@pc:~$ sshfs username@ujovlado.sk:/ ujovlado.sk/
Posledný príkaz si podobne ako pri rsync
vypýta heslo.
Buď heslo budete stále zadávať alebo použijete program expect
(vďaka Igor), no najlepším riešením je pripojiť sa so svojím kľúčom.
S kľúčom, ktorý nájete na svojej mašine v ~/.ssh/id_rsa.pub
. Tento kľúč si skopírujete k sebe na hosting.
vlado@pc:~$ cd ujovlado.sk/
vlado@pc:~/ujovlado.sk$ mkdir .ssh
vlado@pc:~/ujovlado.sk$ cp ~/.ssh/id_rsa.pub .ssh/authorized_keys
V authorized_keys
môže byť aj viac kľúčov. Je to rovnaká autentifikácia ako na štandardných serveroch - teda každý kľúč, ktorý je v spomínanom súbore, sa vie pripojiť na server.
A vyskúšame, či to funguje. Najprv unmount a potom opäť pripojenie. Tentokrát už bez hesla.
vlado@pc:~/ujovlado.sk$ cd ..
vlado@pc:~$ fusermount -u ujovlado.sk
vlado@pc:~$ sshfs username@ujovlado.sk:/ ujovlado.sk/
Výborne!
Použitie verziovacieho systému
Keď už máte svoj hosting pripojený k sebe, môžete k nemu pristupovať ako k vašemu lokálnemu súborovému systému. Čiže kľudne môžete používať všetky dostupné nastroje.
Jedným z takýchto nástrojov je verziovací systém. Môžete použiť mercurial
, git
alebo kľudne i svn
.
Test
Vytvorte na hostingu si adresár repo
a skúste do neho naklonovať nejaký repozitár z githubu.
vlado@pc:~$ cd ujovlado.sk/
vlado@pc:~/ujovlado.sk$ mkdir repo; cd repo
vlado@pc:~/ujovlado.sk/repo$ git clone git://github.com/ujovlado/vimrc.git .
Samozrejme, že to bude fungovať. A čo sa vlastne stalo? S použitím git
u, ktorý beží u vás lokálne, ste zapísali dáta priamo na hosting. Žiadna veda.
Ako to robím tu
Na verziovanie kódu tohto blogu používam mercurial
a ako hosting, ako inak, WebSupport.
Prvá verzia
Blog má bežať z adresára sub/blog
. Vedľa adresárov sub
, logs
a web
vytvorím adresár projects
a v ňom ďalší adresár blog.ujovlado.sk
, do ktorého naklonujem projekt z repozitára a updatnem na branch
, ktorú potrebujem.
Štruktúra je teda jasná.
/.
/..
/logs
/projects/blog.ujovlado.sk
/sub
/web
Je potrebné mať prepojenie medzi adresárom sub/blog
a projects/blog.ujovlado.sk
. Tajomstvom je symlink.
vlado@pc:~$ cd ~/ujovlado.sk/sub
vlado@pc:~/ujovlado.sk/sub$ ln -s ../projects/blog.ujovlado.sk/ ./blog
Po vytvorení symlinku je blog live, preto ak váš projekt pracuje s databázou, majte ju vopred pripravenú.
Ďalšie verzie
Update projektu na poslednú verziu z repozitára prebieha spustením hg pull -u
v adresári s projektom.
vlado@pc:~$ cd ~/ujovlado.sk/projects/blog.ujovlado.sk
vlado@pc:~/ujovlado.sk/projects/blog.ujovlado.sk$ hg pull -u
A ako je to s updatom databázy?
V prípade, že potrebujem urobiť zmeny v databáze, tak pred updatnutím zdrojových kódov, ešte spustím databázovú migráciu.
Update projektu teda (zjednodušene) prebieha pomocou dvoch jenoduchých príkazov.
./yiic migrate
hg pull -u
V prípadne problémov je možné jednoducho sa vrátiť na predošlú verziu spustením "migrácie nadol" a updatnutím na konkrétnu revíziu.
Pozor na .git, .hg a .svn
Nevýhodou je, že sa vám na web ľahko môžu dostať adresáre, ktoré ste public mať určite nechceli. Napríklad .hg
, .git
, či hviezdne .svn
v každom jednom priečinku. Riešením je pridať nastavenia práv na tieto priečinky do .htaccess
alebo mať document_root
o úroveň hlbšie v adresárovej štruktúre. V mojom prípade by to znamenalo mať document_root
v /projects/blog.ujovlado.sk/nejaky_adresar
a chránené priečinky (.hg, libs a pod.) vedľa neho. A takto to je.
Najlepšie by bolo tam adresáre verziovacieho systému nemať, no v tomto prípade sa bez nich nezaobídeme.
Záver
Deployment nemusíte robiť priamo na server. Kľudne si môžete projekt naklonovať k sebe na disk a odtiaľ ho kopírovať na server spomínaným rsyncom. No je to krok naviac.
Takisto je jasné, že veľkým projektom nebude stačiť tento systém a potrebujú oveľa lepšie nástroje, ktoré im zabezpečia Continuous Integration, no vo veľa prípadoch vám váš problém pokryje práve takýto jednoduchý workflow.
A ako robíte deployment vy? Pochváľte sa v diskusii.