Jednoduchý deployment s pomocou SSHFS a dobrého hostingu

Webhosting

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 gitu, 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.

  1. ./yiic migrate
  2. 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.

Mohlo by vás zaujímať