GIT deployment for PHP apps

I would like to describe how I set up my VPS for GIT deployment. Needless to say, you will need a VPS, I recommend Digital Oceans. Cheap, fast (SSD) & simple to manage. I use Debian on my servers, if you have experience with another distro, simply use that.

I am developing with PHP (allright, I am developing with Nette framework) and a while ago I was pissed off ’bout all the FTP deployment (it’s pain in the ass) so I’ve decided to use something more efficient. And discovered GIT deployment.

As I mentioned in another post I use Lighty + PHP + MySQL, but if you are running on LAMP it makes no difference. Because I’ve got multiple domains I created these directories:


I store GIT repositories in


I access GIT repos via SSH. There was a little problem (I working on Windows) because TortoiseGIT (GIT client) didn’t accept my private key so I had to convert it to the correct format using puttygen.

You will have to set up hooks for deployment. For simple deployment post-receive  will do. In the hooks directory is more examples if you are interested and I will post more ’bout hooks too, for now we just create post-receive (will be executed after push is received):

 nano /var/git/

And write your desired script. My script is really simple, firstly it does checkout to /home/domains/ Then it rsync data to www root, I use –delete, but be carefull, if you have something on subdomain, it will be deleted (like the wordpress installation I run on subdomain blog). Use it wisely.

And of course it deletes the temp folder used by Nette (for caching, etc). And create temp and log folder if not exists. The real script is much more complex, I actually update database tables using hooks and much more, but I just wanted to show you the simple way how to use it. So the actual post-receive:


# variables

# checkout
GIT_WORK_TREE=/home/domains/$domain/git git checkout -f

# rsync deploy
rsync -arvx --delete /home/domains/$domain/git/ /home/domains/$domain/web

# check if temp exists and create it if not
if [ ! -d "/home/domains/$domain/web/temp" ]; then
        mkdir /home/domains/$domain/web/temp
        chmod -R 777 /home/domains/$domain/web/temp

# delete temp
rm -rf /home/domains/$domain/web/temp/*

# check if log exists and create it if not
if [ ! -d "/home/domains/$domain/web/log" ]; then
        mkdir /home/domains/$domain/web/log
        chmod -R 777 /home/domains/$domain/web/log

Make sure that the script is executable, you have got the rights for the script set up right and let’s deploy.

What solutions do you use?


New Year with new technologies – mostly lighttpd

My old VPS was kinda meeting it’s limits so I’ve decided to order new one.  Actually I’ve ordered new VPS a few months ago at Digital Ocean for a project I am not able to complete and won’t be ready for a few months, so I decided to use this server for this blog and several more domains.

Digital Ocean offers really great deals (20GB SSD & 512MB RAM for $5, really easy scalable) and after few months of testing I have no other choice than recommend. About creating droplets (means VPS) and managing web server maybe some other time, it’s like two clicks of mouse.

My old VPS is running LAMP (Linux, Apache 2, MySQL & PHP) and I’ve ordered only 512MB of RAM, I’ve decided to try Lighttpd instead of Apache just to save some memory. And it looks amazing.

At this very moment I’ve got three websites (powered by PHP framework – Nette), one WordPress site (this blog) and  flyspray site (bugtracking) on the VPS and it’s using 190MB of RAM.

The only thing I had to really resolve was the mod rewrite for WordPress. As a matter of fact it was really easy, check how to run wordpress on lighttpd.

Few hours ago I’ve  changed MX records and the blog is now running on the Lighty provided by Digital Ocean. Hooray.