Behind PaulStovell.com

This is an old post and doesn't necessarily reflect my current thinking on a topic, and some links or images may not work. The text is preserved here for posterity.

I thought it would be interesting to list out some of the technologies that run PaulStovell.com. I wonder how similar my setup is to others and any recommendations people have on improving it.

Infrastructure

The infrastructure that runs PaulStovell.com is housed in a massive dedicated data center in Brisbane. And by massive data center, I actually mean my apartment. Next to the TV in my living room is a black desktop that used to be a media center, until I installed Windows Server 2008 on it and started using it as a server. It's a quad core AMD Phenom, 64-bit, with 6 GB RAM. The machine is still connected to the TV via HDMI - if I need to change anything, I use my remote control to flip to HDMI 2 and use a wireless keyboard to log into the machine. I also tend to notice when the machine is offline since the room becomes a little quieter :)

The other hardware that makes it all happen is a wireless ADSL model from iiNet, and a 1 TB external hard disk that I use for backup. The internet comes through an iiNet business plan (business 3), which gives me upload speeds as fast as download speeds and a static IP address. I tend to get fast response times in Australia but I'm not sure what the experience is like overseas.

Source Control

All of my source code is kept in Subversion, at svn.paulstovell.com. It's actually the Visual SVN server, running on a local IP address of 10.1.1.30. Since I only have one external IP address, I have IIS 7 acting as a reverse proxy to the Visual SVN server (which is really just Apache) based on host name.

Builds

When I check code into source control, it's built automatically using JetBrains TeamCity, at build.paulstovell.com. Unfortunately since some of my builds make use of TeamCity's parameter system for passing information like passwords to builds, I can't make the build server public (I'd love some tips on parameterizing the builds safely so I can open it up).

The TeamCity build dashboard

It might seem overkill to have a build server at home, but one of the niceties is that I can check in a change for Magellan or PaulPad (below), and the build server can build it, run the tests and deploy it for me - everything is automated, which means I'm more likely to make small changes.

Blog

The site that you are looking at is a custom built Wiki+Blog engine that I wrote in a couple of weeks (after 6 months procrastinating) called PaulPad. The source code to PaulPad is also under Subversion. PaulPad was written ASP.NET MVC using NHibernate and a splash of jQuery. The content is composed using Markdown, and I use the reverse engineered WMD editor for composing the posts. I use Prettify for code highlighting because it allows me to keep the markup perfectly clean and the highlighting is done automatically. Comments are sent to Akismet for spam checking.

One of my favourite PaulPad features, apart from the clean markup, is that I can selectively publish page edits to an RSS feed when editing a page. For example, if I publish something, and correct a mistake a few minutes later, it will appear in the current feed. But in 6 months time, if I overhaul the page, I can "re-publish" it back to the feed so it appears in RSS readers again. That makes the blog+wiki concept really work for me.

File Server

When my TeamCity build server produces builds, I wanted to make them available via a page that simply showed files off the file system. However, the default IIS file list pages look a little ugly for me. So I created FileServer, which is the engine behind get.paulstovell.com.

Statistics

I use the SmarterStats package for web statistics. It's installed at stats.paulstovell.com, but there doesn't seem to be a way to make it public without giving everyone a login. I love that it's written in ASP.NET and the graphs use Silverlight. It also just looks nice. It's a shame my only visitor is my Mum :)

My SmarterStats dashboard for the last 7 days

To make the statistics more accurate, I send a 1x1px tracking image with all of the RSS feed entries that I serve up. The images all point to "/(page-name)/via-feed", which allows me to see pretty accurately how many people read my content via feeds as opposed to viewing the pages directly. I'd like to know if anyone thinks this is dishonest.

Uptime

It's not that I don't trust myself, but, I have a habbit of monkeying around with my server, which impacts the general uptime. I try to keep it to a limit, and I use Pingdom.com to give me statistics about my uptime. Pingdom can also SMS me when the site is down, but given that the computer is in my lounge, I usually know when it's down, and if I'm not home I'm probably unlikely to fix it.

You can see the Pingdom graphs online: www.pingdom.com/reports/8vrndjlwezen/.

Mail

This is about the only thing I don't host myself. I use Google Apps to handle paulstovell.com mail.

Backups

Given how half-baked this whole setup is, I figure I should at least have a good backup system. I use MozyPro to upload all content, database backups, and Subversion stores as soon as changes are made and also during a nightly backup process. I also use MozyPro on my laptop.

I also use a 1 TB external hard drive, and a scheduled task in Windows to robocopy a set of folders to the drive. It's really a "just in case" should the internet go down while I'm out of town, and it's also just nice to have more backups.

For the database I've setup a maintenance task that backs up all databases every four hours and ships them to a folder to be backed up by Mozy. I recently had to restore a backup from Mozy for the PaulStovell.com database after, well, I screwed up :) The backup worked well, so it's nice to know I can rely on it. I should probably make a point to test my backups more often.

Summary

In the past I have used shared web hosting, virtual machine hosting and dedicated hosting with a few different providers, but I always missed the kind of control I wanted. Even with dedicated hosting, the thought of having to remote desktop into the servers usually put me off, not to mention the costs. Hosting it all in house was very worthwhile, and given my Pingdom uptime of 97% I'm pretty happy with the reliability.

Something I'm very proud of is that there isn't a single line of PHP or Perl on my setup - it's all .NET (with a little Apache and Java). In fact PaulPad's best feature is that it isn't Wordpress :)

The Subversion and Team City combination works really well together, and because everything is on the LAN it is very fast. I notice my workflow at home is very different to my workflow at work. Here's my build log from TeamCity when I was working on Magellan:

TeamCity build log

What other services should I try? What are some alternatives that you prefer?