This whole thing started because I could not get to my own notes.
For years my notes lived in OneNote 2010 on a desktop, thousands of them, and I could not reach them from my other devices. The app kept nagging me to move to the new cloud-connected OneNote, and I kept saying no. I am protective of my life's pile of information and I did not want to hand a copy to a data center somewhere. The worst part was that OneNote 2010 had no clean way to export. Every method I tried either crashed the laptop or spat out something unreadable. I was locked in, which is the exact feeling that finally pushed me to do something about it.
Hello Trilium
After a lot of searching I landed on Trilium, an open-source notes app that fit how my head works. It had the nested tree structure I had loved and missed since TreePad back in the 2000s, a good search, and it kept everything in a SQLite database, which as a developer I appreciated more than I should admit. My rule was simple: no cloud, unless it was my cloud, on hardware I controlled. So I needed somewhere to run it.
The Raspberry Pi detour
The internet told me a Raspberry Pi would be perfect. Small, quiet, cheap. I got a Pi 4, flashed the OS, plugged in a monitor, and immediately hit the thing every tutorial skips: with a display attached it felt like wading through molasses. I overclocked it to the edge of not booting, added a fan and a heat sink to keep the temperature sane, and it was still too slow once I was clicking through thousands of notes. The Pi 5 showed up later and was a little quicker, not enough to change the verdict.
The Pi was not wasted. I turned it into a travel machine that connects to my iPad over USB-C for development with no internet, which is handy on a plane or anywhere that blocks remote-desktop protocols. But it was not going to be the server.
So I gave in and wiped an old i7 laptop I had been reluctant to touch, put Linux on it, and moved everything over. The speed jumped and I was back in business.
Docker, and the decision that saved me later
I work with Docker every day, and coming from the Windows world of DLL hell it still feels like a small miracle. When something breaks in a container, you restart it and move on. So I made a rule early: nothing gets installed on the server directly unless there is no other option. Everything runs as a container, defined in a compose file, managed through Portainer. That one decision paid off more than any other, and I will get to why.
Once you are running one container, you want ten. I added Portainer to manage them, File Browser so I could poke at the filesystem without dropping to a shell, a self-hosted Git server so my personal code never had to live in someone else's cloud, and a personal cloud for calendar, contacts, and phone photo sync, so I could stop feeding those to the big boys. I am a photographer with a large library of high-res RAW files, so I shared the storage out to my devices and re-pointed Lightroom at it. Mounting drives on Linux and trusting them to actually come back after a reboot, instead of playing the Windows drive-letter lottery, was a side benefit I did not see coming.
Outgrowing the laptop
With all of that running, plus a media server doing the occasional transcode, the laptop started to groan. So I bought an i9 Dell with 64GB of RAM, and convinced my wife it was for the betterment of the household. She understood that my well-being depended on more RAM.
Here is where the container rule paid off. Migrating to the new machine was almost boring. I installed Ubuntu Server, recreated the same folder layout so the Docker volumes would drop straight in, brought the firewall rules over from my notes, and most of the stack just came back up. The one thing that bit me was physical: I unplugged the server by accident and it stayed dead, because I had never told the BIOS to power back on after a power loss. That felt like a slap in the face. I write software for a living, I am not a sysadmin, and after years on battery-powered laptops I had forgotten the wall plug was a single point of failure.
Getting to it from anywhere
A server you can only reach from your own couch is half a server. I already had a reverse proxy running, so I opened things up the traditional way: port forwarding, a certificate, and basic auth layered on top to calm my nerves. My ISP blocks the port the usual certificate challenge needs, so I had to go around that, which turned into its own post.
The traditional setup worked, and I hated it. On the iPad, an app like Trilium would make me authenticate twice, and then a scroll-to-the-top gesture would bounce the page and ask me to log in again. More than that, I kept staring at the open ports on my router and thinking that a bit of auth was the only thing between my data and the entire internet. That was too thin a wall for me.
Tailscale, and where it landed
I looked at self-hosted OpenVPN and WireGuard, and at Cloudflare until I understood how much of my traffic would pass through them. Then I found Tailscale. No port forwarding, a small app on each device, and WireGuard underneath so it is quick. The coordination server helps your devices find each other, but your actual traffic goes directly between them. I installed it on the server, the iPad, the phone, and my travel laptop, tore down every port forward on the router, and have not missed them once. Closing those ports did more for how I sleep than the basic auth ever did.
That is how the homelab started. It has grown a lot since, the notes eventually moved off Trilium and onto Obsidian, and there is far more running now than there was then, but the shape was set in those first months: my data, on my hardware, reachable from anywhere without leaving a door open to the world.
If you are sitting on an old laptop and a vague urge to stop renting your own files back from the cloud, that is all it takes to start. Thanks for reading, and tell me in the comments what finally pushed you to build your own.
TerminalNexus
Comments