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):
And write your desired script. My script is really simple, firstly it does checkout to /home/domains/vyvazil.eu/git. 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:
# POST RECEIVE SCRIPT
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
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
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?