This site is being hosted utilizing a variety of technologies:
TrueNAS Scale – Used as my primary NAS and Hypervisor for hosting everything, utilizing ZFS for redundancy
Ansible – To define the state of my server, providing a pseudo ci/cd
Hugo – Static site generation
Docker – Hosting Nginx and Cloudflare Tunnel containers
Cloudflare – Used for my DNS and provides HTTPS tunneling for ease
All of the configuration is version controlled through GitHub, currently within a private repository.
It all starts with the why - There are easier ways to accomplish what I am doing here, but my technology stack is essentially complicated for one reason: to prove that I can.
I wanted a basic site to host my resume and personal projects, but not with a traditional site builder like Wix, Squarespace, etc. Those are for people who don’t care – and I completely get it. They are very easy to use, but what do you learn from them?
What I actually have running now - I originally started a homelab with a series of laptops in a proxmox cluster. But I moved away from that because I needed some more storage… My Google Photos was running out of space and I did not want to fork up anymore money to top G so I decided to build my own NAS. This gave me the exposure to planning a build utilizing the ZFS filesystem (miles ahead of RAID) and also to migrate my services to a new Hypervisor.
TrueNAS scale allows for its own hosting of VMs, so I did not see a need for the proxmox cluster any longer. It cut down on the complexity as well. Without getting too far off topic of THIS site’s deployment, the one limitation of TrueNAS scale is there is (was) no easy way to deploy VMs via Terraform or IAC tools, so I did have to resort to manually building a VM for this site. A whole 8 clicks later and I had the base Ubuntu VM running.
With the VM running, I utilize Ansible playbooks to initialize the VM, creating the ansible user, updating the host, and defining the folders and permissions I need to host this sites files. I do not have a separate Ansible server for running playbooks, instead I was introduced to a way of containerizing Ansible so my deployments can be rapidly rebuilt when/if my house burns down.
This Ansible container I have running mainly off a Windows workstation within WSL is responsible for setting up the docker environment, hosting Nginx, Cloudflare tunnels, and my static site configuration files.
The site HTML/CSS is all generated utilizing Hugo. Hugo runs locally (can also be containerized, but this was unnecessary for me) and I am able to import themes from Github (by designers who have better artistic abilities than I do) and create my own content and pages which are then also saved in my main homelab repository. I am able to develop my site locally, have my site changes version controlled, and at the push of a button I can deploy it all for the world.
The final piece for the world to be able to see this site is really down to the magic of cloudflare. I utilized cloudflare for my DNS provider and utilized its tunnels feature (which is managed through ansible, tunnel is containerized via docker) to provide site certificates and peace of mind that I can toggle cloudflare security features from my phone.
I’d love to tell you more about it in our interview!