I did not really put a lot of effort into making this project and composed it out of scraps I literally had at home and with the help of tools I already knew and some new things I wanted to try out more in the past.

Hardware

I have a server rack under my TV with a terabyte of storage, 8-core ARM CPU, a neural processing unit, and the network switch.

Behold, the server rack

While the description may sound impressive it’s a pretty simple OrangePI 5 micro-computer with 8 gigs of RAM running the Armbian Linux, SSH server, docker and some other pretty basic stuff. It was originally used for some, ehh, totally legal content streaming within the home LAN, but I eventually got bored with all of the complexities of Plex, *darr solutions, and perplexity of finding good and stable sources of, ehhh, legal content. So the set-up has been purged and forgotten to give birth to something new.

It uses the portable Samsung T7 SSD and some quite-not-that-bad SD card because why not? I used to have several NVM-e drives attached to it, but I found a better use for them.

The whole set-up lives in an IKEA TV stand, also having some adjustments done to it in the form of the cable outlet. Nearby resides a cheap D-Link network switch with a 1GBit channel and a power outlet also powering up the TV, soundbar, TV-box, and PS5.

Software

There’s not so much going on here: it runs the Armbian OS, basic docker and docker registry set-up.

The blog itself is a static website built on top of Hugo. I really love the idea of having simple plain markdown files with some basic markup being turned into the website instead of some CMS or custom-written website with the database and all the complexities of managing or paying for it. That’s also the reason why I love Obsidian so much, even though I did not manage to build a productivity system around it (but that’s the topic for some other post).

On top of Hugo there is a beautiful and simple Ficurina theme because throughout all of the years, I did not manage to develop styling and CSS skills to build something worth looking at.

As I wanted to play with some stuff the static itself is served by the Nginx container serving static from the mounted volume, which, in turn, is covered by the Traefik server. The choice of Traefik is dictated by nothing less than hype and search for some fancy services and I used it before to host whatever I found useful in the https://github.com/awesome-selfhosted/awesome-selfhosted list.

My provider does not give me a static IP so I solved the problem of self-hosting something by purchasing a domain name from Cloudflare and using their tunnels feature to expose my precious HTTP content without the need to care a lot about DNS, VPNs, SSL certificate management (event though I will likely revise this part later on).

I know that the whole set-up can be simplified a lot by just using some hosting at cloudflare or at any solution like this but I just get some fun playing with some Linux boxes.

IaaC and deployment

Hey, we’re living (maybe even outliving already) the Cloud Native era and we have so many tools to provision our machines and deploy our codebases. For the sole purpose of deploying stuff like this blog a basic shell script using rsync (or something more extravagant like Fabric) could be more than enough but I decided to remember some of my earlier years and revise the Ansible.

I have not used it since the moment RedHat purchased it and it was quite straightforward, even though I don’t really like the idea of DSLs having more and more features of actual programming languages and am a little skeptical about the whole YAML obsession.

Simple roles layout .

I have a bunch of plays setting up the most necessary things and doing the actual deployment of the static content and it just works.

I also have a bunch of side projects being deployed there, so I’m going to use it to deploy all of my stuff.

Improvements?

Heck, there’s a lot. The whole setup is unreliable (having not the most stable uplink or being a subject to power outages in my apartment), nor it is quite secure (even though I don’t have a lot to steal from this service).

I think a proper solution would be to use pages deployment for the static and just close any possible external access to my home machine at all. Also, I will likely find a way to join my obsidian and hugo setups (maybe just by sim-linking the content dir).

There’s no analytics right now or no extra content caching being set up, so that’s something that needs to be adjusted in the future (hello there, EU cookie policy banners), but in general it is still fun to work with!

UPD: Here’re the latest updates I had to do to the initial set-up