It happened that I had to put together a few html pages containing important info about a certain project at the company. Originally I stored them on a Samba share on the official Windows file-server. I turned out to be terrible. For instance Firefox needs FIVE slashes after the protocol-id in the URL:
IE needs two, Chrome needs four. First step in the downward spiral: I need the http protocol, in other words a webserver. So I installed Cygwin’s lighttpd on our constantly running desktop box. Then moved the html files to “/srv/www/htdocs/site/”. First step done.
Next step: it’s very cumbersome to change the navigation links, whenever a new page is added. Time to automatize. Tools: SSI (server side includes) and CGI scripts in Perl.
Then, what about setting up a few mailing lists. No archiving, just free subscribing and sending mail via “mailto:” links. One day job in Perl.
Later SSI turned out to be a bad choice as you need an absolute path to your CGI script. Difficult if you want a test-site. So I rewrote the entire site that all links actually refer to the same CGI script which loads the required page, adding dynamic navigation.
The trickiest and nicest part is managing the website with git. On the server I set up a git repo in my home folder, with a detached worktree in “/srv/www/htdocs/site”:
server ~$ mkdir site.git && cd site.git server ~/site.git$ git --bare init server ~/site.git$ git config core.worktree '/srv/www/htdocs/site' server ~/site.git$ git config receive.denycurrentbranch false
Additionally, we need a hook routine which checks out anything to the website whenever you push it into this repo:
server ~/site.git$ mv hooks/post-receive.sample hooks/post-receive server ~/site.git$ mcedit hooks/post-receive # checkout the received branch to the website read OLD NEW REF git checkout -f $RE
On my own machine, I also have a git repo to manage the site. To allow easy server-updates, I did this:
mybox ~/site$ git remote add web ssh://server/~/site.git mybox ~/site$ git push web master
Finally, one wants a test-site. Lighty endeavours to give satisfaction, so simply enable module mod_userdir in /etc/lighttpd/lighttpd.conf, and each user’s public_html folder becomes his own website. The two lines below now refer to the same folder:
Let’s create a non-bare repo here and configure it to receive and automatically check out pushed commits:
server ~/public_html$ mkdir site && cd site server ~/public_html/site$ git init server ~/public_html/site$ git config receive.denycurrentbranch false
I applied the same post-receive hook as with the official website’s repo. But it refused to check out the pushed commits. After a considerable amount of cursing it turns out the bloody git runs the hooks in the “.git” folder. I discovered this when I found all my html files there. So the post-receive hook should look like this in a non bare repo:
#!/bin/sh unset GIT_DIR unset GIT_WORK_TREE cd .. read OLD NEW REF REF=`echo $REF | sed 's:refs/..*/::'` # branch instead of detached head git checkout -f $REF
On my box I added an other remote to allow pushing to the test site:
mybox ~/site$ git remote add test ssh://server/~/public_html/site mybox ~/site$ git push test master
I even applied a post-commit hook on the local machine which pushes master-commits to the official site and branch-commits to the test site.