ENG | Three Years of Self-Hosting
What started as a file server and photo gallery turned into something completely different. Three years of what worked, what failed, and what survived.
This is my recap of three years of self-hosting. What worked, what failed.
My motivation for self-hosting was simple:
- Curiosity
- Alternatives to Google Photos, Google Drive and OneDrive
Early start
In February 2023 I decided to get a ZimaBoard, install NextCloud for file sharing and photo gallery, and document the setup in markdown notes. What actually happened was something completely different.
I lost some early notes when a cheap SSD died after barely three months. That made me take writing more seriously — notes moved to OneDrive, and shortly after, a blog was born in June 2023, with ChatGPT helping to polish some of the rougher drafts.
By May 2023 I had already swapped OpenSUSE Leap for Fedora (this was kind of random), Nginx Proxy Manager for Cloudflare, and Docker for Podman.
Decisions I regret
ZimaBoard 216. It seemed like a good Raspberry Pi alternative based on what I watched, but it quickly proved inadequate. Power efficient, yes — but barely enough to run a lightweight window manager and four browser tabs. Generating image thumbnails in NextCloud took noticeably long. I replaced it with a used Fujitsu Esprimo Q965 USFF PC for around 120 EUR, added a 1TB SSD and 32GB RAM. Still, 512GB and 16GB would have been plenty.
Later, I noticed pattern with YouTube hardware recommendations — content creators sometimes promote products without them being the best fit for your specific needs. An old business USFF PC at the same price beats ZimaBoard for actual workloads. And buying some stuff for curiousity and because it seems nice to have is sometimes my weakness.
Expectations vs. reality
Self-hosting
I wanted an image gallery and a file server. Neither really worked out as planned.
NextCloud was never easy to set up — multiple domain access was a problem. I broke it early through a bad upgrade/downgrade that corrupted the upgrade process, and after two years it got too old for the phone app to keep uploading photos. The fundamental issue was that uploading via web interface is simply not the same as a synced folder accessible from Windows. For mobile photos, there’s a need to occasionally back up 50GB to an external drive, and that never felt convenient.
In the end I turned NextCloud off and paid for 100GB on Koofr. Photo backup folders are by year only rather than by month, which is not ideal for browsing, but good enough for backup. At least I’m not paying Microsoft or Google. Here my original expectations completely failed — but I made peace with it.
Goal of avoiding some payments to Google could be satisfied by using Koofr, pCloud or Proton, which are EU-based.
On the other hand, I discovered VS Code Remote-SSH, and the server became something I never anticipated: a development environment accessible from anywhere. C++ and Python projects, always in sync, reachable from PC, notebook or work. Libraries on Linux are easier to manage without fighting system environment variables. Local development started feeling like the inferior option. Now with Claude Code in a container the same applies — client with full context from everywhere, volume backed up.
Blog
Original expectations were modest: document the self-hosting setup and rewrite some old Arduino articles. The Arduino rewrites took over a year to start and were never fully finished — a 2016 temperature logger project got some attention, but articles about the SD card and final assembly were never completed. I don’t recall why.
The blog has had months-long breaks, probably when the weather was good and there were better things to do. Still, I never expected it to grow to around 80 articles with 500 visitors a month — starting from one per day.
What’s frustrating is that visitor count doesn’t correlate with effort. The articles I find most valuable get almost no traffic, while completely incidental ones attract the most readers:
- ZimaBoard assorted notes — junk quality, no clear goal
- Installing Gitea — which is easy
- Migrating Gitea to Forgejo — which was changing five lines in docker-compose.yml
- Initial experiments with Milk-V Duo
- Calculating Pi — written in two hours mostly with AI help, boosted by a few YouTube mentions of new algorithm which is not the best
The article I’m most proud of, covering the fundamentals behind logarithms and slide rules, isn’t even indexed by Google.
At this point the blog format feels like a poor fit for what it has become — articles with dependencies, interleaved with unrelated ones. More of a knowledge base or wiki. But I write it mostly for future me, and that’s probably enough. Maybe I’ll switch to Hugo eventually.
What actually survived
After three years, the stack that remained is minimal: Forgejo, Nginx, Cloudflare Tunnel and a DDNS updater via Cloudflare API, a handful of systemd timers — all running rootless in Podman in user space. No open ports except for SSH, no certificate management, no sudo for routine operations.
Maintenance is close to zero. Upgrading containers once in a while is about it. Everything fragile or overly complex either broke and was dropped, or was replaced by a cheap paid service. What survived is boring and stable, which turns out to be the ideal outcome.
Backups go to an external hard drive or Koofr. Nothing elaborate.
The self-hosting story that almost ended with “NextCloud failed, back to Google” got saved by an accident — stumbling onto VS Code Remote-SSH and realizing the server was more useful as a development environment than as a file server. That was never the plan.
Is self-hosting worth it?
As a learning experience — absolutely. You inevitably pick up Linux administration, networking, containerization, backup strategies. That knowledge transfers.
As a replacement for cloud services — probably not, at least not for everyone. It requires a server, ideally a UPS, a backup plan, and a willingness to occasionally spend an evening fixing something that used to work. Especially in early months.
But the unexpected use case — a personal development server accessible from anywhere — that one paid for everything. Not in money saved, but in how it changed the way I work. That was never in the original plan, and it turned out to be the most valuable for me.