Update: For a more recent account of the site setup, see How to downsize a tiny web server and the services on it.
OK, here we are, on my website. How is it generated? How is it hosted?
First, let’s talk about the context. The technical constraints always come from the context.
This is a very low traffic site, with only static content. It contains a basic website, plus some downloadable PDFs of things I wrote.
That’s already a very different problem from the things I work on at work!
Priorities
First of all, since this is my project, I get to choose the priorities.
- I care a lot about the content. There isn’t a lot of new content here, but what’s here should be solid.
- I care about site performance. Fortunately, static HTML on modern hosting is already fast, so I don’t have to do much to improve it.
- I care about continuity. If I publish a piece of writing here, I want the link to keep working indefinitely.
- I care about basic security. Note 1: Don’t run web applications unless you can commit to security patches… Note 2: I do have a valid TLS cert now. Though I certainly didn’t have a TLS cert in the early days - nobody did, not for a site like this. I remember when I first wanted one, it was still a huge pain to get a certificate — you had to buy it through some awful DNS registrar package deal, and manually download new cert files every time it expired. Now I just use letsencrypt.
- I care about minimizing useless maintenance overhead. I care about avoiding unnecessary runtime dependencies (which can in turn create security issues).
- I use this site to stay in touch with basic Linux administration and old school web technology. I like tinkering with my own HTML. I like poking around at nginx configuration. I like remembering how much you can get done with something super, super basic. No containerization here, not so far.
- I care about minimizing hosting costs (up to a point).
In sum, I’m here to learn a few new things, play with servers a little, and keep a stable web presence.
Non-priorities
There are also some things I don’t really care about.
- I don’t really care about analytics or server monitoring (as long as the server is not on fire).
- I don’t care about tracking inbound links.
- I don’t care about supporting discussion or dialogue on the site itself. I love talking to people, I just don’t have to run a forum right here.
- I’m not optimizing SEO. At all. But my name is already unusual so that’s doing some SEO all by itself.
Hosting
I’ve had a lot of web hosting arrangements over the years. I think the history was something like this:
- 1999: My very first, very silly website was static HTML hosted by my ISP. They had a unix system you could log into, back when small-town local ISPs were more common, the kind that could serve a website for every user at
server.com/~user
. I think you had to upload the files with FTP. It wasn’t encrypted, but using a dialup connection to their systems, maybe it wasn’t all that insecure? - 2000-2002: Every dorm room at my college had wired Ethernet, a public IP address, and a stable hostname. So I self-hosted my website from an ancient version of OSX (which had a built-in web server back in the day).
- 2003-4: I had a personal website in some sandbox folder of a shared campus web server.
- 2005–6: I was starting grad school and didn’t have a web presence for a year or two.
- 2007–2014: I registered this website and set it up on “shared hosting.” It was cheap but irritating; I disliked cPanel.
- 2014–present: Switched over to hosting on a cheap virtualized linux box. Originally it ran Apache, later switched to nginx. It’s boring. It works great. CPU load is usually near 0%.
Site generation
Historically, this site has always been basically static HTML, with hand-rolled CSS. I used to write a new stylesheet every so often, just because I could.
I’ve always supplemented the static files with some extra programmatic tools, when I needed them. For example:
- In 2002, the site was static, but it hosted some images on a Python-based web server, which provided analytics.
- From 2007 to 2022, I had a WordPress blog hosted in a subdirectory of the main site. I liked the (old-school) WordPress post editor, and I liked blog comments back in the days when people actually used to use them.
- In about 2013, I wrote some dynamic code to programmatically display my progress in writing my dissertation. It used data from a git repository history and from Asana (a task tracking application) to display the progress. The data on the server had to be updated periodically, with a script I invoked manually - I never needed to automate it.
- In 2016 or so, I wrote a Ruby script to generate the navigation menu for the static files.
- In 2022, I ported the static site over to Middleman to make it easier to maintain. I also like Markdown.
Right now, a static site generator is the sweet spot for me between “100% hand edited HTML files in a directory” and “100% dynamically generated content.”
I do wish I had a lightweight solution for contact forms. I used to use PHP for that once in a while, but only because I used to need it for WordPress. Now… 🤷♀️.
Conclusions
This site looks pretty basic, but it actually takes a lot of work over the years to keep it going. The requirements of the web are always changing. I don’t want it to look too dated. I want it to work on mobile. I want it to keep running for decades at a time.
Minimalism is not actually all that cheap, when you think about it.