In the age of social networks, blogging and microblogging platforms, self-hosting a personal website can look odd. Add to that the availability of affordable all-inclusive hosting providers offering managed content management systems, search engine optimisation, analytics, content delivery network and what not, and self-hosting a personal website from scratch from your own virtual private server (VPS) becomes borderline masochism. The only compelling reasons to undertake such an endeavour are being in total control of and satisfying your personal curiosity.
The first time I recall doing something similar was around 2011, fresh of
starting the master in theoretical physics and of joining the local Linux user
group in Pisa. By that time, together with my flatmate, we were using an old
laptop as a home server “takatuke”1, hosting a controller for web
radios and an RSS feed aggregator, using lighttpd
as a reverse proxy and
LXC
containers before docker
was a thing (or it even existed, for what
matters). However those early days spent messing around paid off when, during a
previous job, I was assigned the task to devise, deploy and manage a
multiservice system on a Kubernetes cluster, while also developing one of the
services, too. Here credit is due to my experienced devops colleagues for
helping me get up to speed quickly (it was a small company but we were very
resourceful and crazy efficient, and if you want to know more
about Kubernetes you should definitely check out
KubeTtips).
What follows is a step-by-step guide to publishing your very own website. Even
though I will descend into details here and there, I will assume a basic
knowledge of how to execute commands on a remote machine thorough ssh
and
how to install software on it.
Domain
While a personalised domain is not strictly necessary to host a website (for
personal use you could use some cheap dynamic DNS or just an alias in your
/etc/hosts
hardcoding the IP address of your host), buying one is not going
to break the bank and usually provides quite a boost of your morale, usually a
couple of mailboxes out of bigG or bigM’s eyes and, crucially, the ability to
set up an SSL certificate with Let’s Encrypt.
There are a ton of registrars out there, and I am not in the position to advice
for any single one of them, except for many advising against two Italian
registrars which in my experience provided and extremely low quality service:
Aruba and TopHost. Make sure that the registrar allows you to easily set your
very own DNS record. Even though most registrars will provide a form to edit
individual records, make sure that you keep the possibility to edit the record
as a txt
.
Hosting
The hosting, on the other hand, is truly necessary. I rent a small VPS for the price of two and a half inner tubes2. You really do not need much computational power nor RAM, and most likely your VPS will be idle most of the time for the majority of use cases I can think of. For this reason, if cost is a concern, a pro tip is to find one or two like-minded friends, share the server and split the costs; you are extremely unlikely to step on each other’s foot, performance wise.
Both for the domain and for the hosting, you should definitely consider selecting service providers from different countries from your own. In a time in which dissent is more and more persecuted, it will make censors’ life just a little bit harder.
Server setup
Once you chose your hosting provider, it is time to set up your VPS. Usually it is possible to choose among a handful of different distributions. Unfortunately not all distributions are equally well supported even within the same hosting. In my case it looked like the host applied some patches to the kernel that only worked on Ubuntu and I wasn’t willing to waste much time to get a better distro work.
Typically the server starts with a minimal set of tools installed. Since we are
going to containerise pretty much everything, there is not much else than
docker
and git
that need be installed3. Besides these tools, it is
advisable to also install a firewall. Since I’m not particularly at ease with
routing tables, my firewall of choice is ufw
.
DNS setup
The hosting service will give you the IP address of your server. You will need to use this address to edit the DNS record in your domain settings. For what concerns hosting a website, you will need at least a so-called DNS record A, which maps a domain name to one IP address.
* 10800 in A xxx.xxx.xxx.xxx
In the example above, the second level domain and any third level domain that is not separately handled with another record will map to the IP address. Browsers and other DNS servers do not query the DNS for every single call, caching instead the result of the first query. The cache is not considered stale for a predefined amount of time, which is the number in seconds that appears as the second column of the record.
When there are multiple services hosted on the same server, it is often convenient to map the IP address to an administrative record A, and then point the individual services to this address by means of a CNAME record, like so.
admin 10800 IN A yyy.yyy.yyy.yyy
www 10800 IN CNAME admin.$DOMAIN.
blog 10800 IN CNAME admin.$DOMAIN.
In this case the CNAME instruct to route requests to www.$DOMAIN
and
blog.$DOMAIN
to admin.$DOMAIN
. Notice the dot (.
) at the end of the CNAME
lines. This is important because it forbids the DNS server from appending your
domain root ($DOMAIN
) to the record, which is otherwise always intended.
Without it the DNS server would route blog.$DOMAIN
to
admin.$DOMAIN.$DOMAIN
!
Conclusions
So far we have seen what to look for in a registrar and in a host, how to set up a blank VPS and map its IP address to our domain. In the next part we are going to set up the firewall, a reverse proxy and SSL certificates.