My experience of self-hosting - Why no one needs it and “everyone” should try it
TLDR; It’s fun and you’ll learn something. If you don’t think it’s fun (and can deduct your time spent), you probably won’t save money on it.
If you just want to get inspired or pick gold nuggets from my set-up, check the end of this post.
The why
The most exciting thing of going on a journey is that you don’t know where you’re going to end up. I did not, however, have this in mind when I started to build the small set-up for my self-hosting. I had one clear goal, saving money.
“If I can host my own password manager on a free VPS on GCP vs. 2 people paying some commercial option at $3/month per person(!), I could actually save us money.”
Said and done, 2 weeks of evening-work later…, I had it up and running.
It did not bother me much that my then girlfriend, now wife, did not jump on board directly with this. (Which made the savings go down 50%). In the back of my mind I had already the next steps laid out.
“The value that can be saved is compounding on the costs for running it.”
Mind you, this was in a pre-AI era when templates and configs were not that cheap to produce for programs you’ve had no prior experience with. And, speaking of the time to actually set this up - it is not savings, but in fact a cost. But that was not taken into account when I started, and now when I had already started, well…
The journey
v0
The next milestone (still disillusionedly locked on cost-savings) was storage. Both for my phone photos and videos, but also for storing, syncing and backing up documents and coding-projects. When starting to map out what I want and need, I painfully realized that renting compute is relatively cheap; renting storage, however, is not. One could at this point in time pause and re-evaluate whether the framing of the problem — paying for storage-services — is right, or whether it even is a problem. I did not.
Anyway, the solution to thinking both storage-services and renting raw storage for VPS is too expensive, is to set up your own hardware for this. I stumbled upon this blog post, on running a Raspberry Pi with SSD. I did not spend that much time at actually evaluating the slightly more expensive NAS-alternatives, I just went for it.
I am being a little bit silly over the fact that cost-savings was the motivator for me doing this. But of course that is not the sole motivator. Finding automation and software-infrastructure interesting contributes. Furthermore, the feeling of self-sovereignty has also helped. And this has in fact been a growing part of what motivates me into doing this. Although it’s arguably not actually sovereignty, but just the feeling of it, but nevertheless.
Back to the hardware. Now, two years into it my choice has not been proven wrong. And in any case, “action produces information”, which has turned out to be true also in this case. One of the things I had to deal with now was that I had different architectures on my VPS, x86, and my raspberry pi, arm. That’s probably something I’d take into account next time I’m buying hardware.
We’re still in pre-AI era and the reasoning of “setting up maintainable infrastructure just to learn” might have started to take over just a little bit too much. In other words, I had over-engineered parts of it. Surviving a nuclear war or governmental collapse should perhaps not be goals put upon these hobby projects.
But I can be pragmatic. In fact, at this point I took one of the more pragmatic decisions in this journey: Instead of trying to make an install flow that handles all edge-cases for my now two different hosts, let’s just copy what I want to have on both and modify/add what’s unique on them separately. It turned out to be the right decision, not because the system was pretty, but because it was just the right amount of work for what I wanted to achieve.
v1
Once this was set up, many factors made me leave it untouched for a while. I had already replaced the paid services, I was also taking care of my newborn son, the threshold for doing more improvements and additions actually required me to unify the two hosts I previously did a quick-fix for, and also, this was around the same time I was setting up our sequencer nodes for aztecscan.xyz, which basically uses the same set-up and architecture. That’s also something, by the way, that turned out to benefit my work directly which I could not have foreseen when starting with this.
I think the best part of this period was that I realized my set-up just worked. There were some upgrades here and there, but not much more. I did also during this time explore a little bit on how DNS-level ad-blocking with Pi-hole could work. But my current router did not allow it.
Also, while replacing a password manager and photo-hosting is something that can be taken lightly, fiddling with the home wifi is not. Whereas the first is not only opt-in, it is also not a life necessity. Forcing my wife to use my network set-up would probably raise the SLA of my stack from semi-necessary day-to-day tools to something more similar to medical- or military-infra.
There was not much time to build and add more services, but the wishlist of what I wanted to add still grew. Not that it bothered me, quite the opposite. Having a list full of fun challenges waiting for the time to come alive was something that I found exciting.
Then, “the agent” entered. This was sometime at the start of 2025 and my friend who’s building gptme asked me to help build PoC for gptme.ai. Up until this point I’d used Copilot for auto-complete, but not much more than that. While I’m sure there is truth to the “AI-is-not-replacing-all-software-jobs”. I think even a lot of those proponents can’t deny that the first interactions with an agent doing part of your troublesome work feels like magic. That’s what I felt anyway. Not fear of being replaced, but excitement for the possibilities.
After shipping the alpha of gptme.ai I dove straight into my wishlist. Now, with the agent I could take a leap at less mature projects. If it had a bug or a missing feature I could just create a PR to fix it. And I could also unblock the biggest hurdle: unifying my install workflow for the two diverging hosts. Which actually in the end was solved both by unifying the set-up, but also just changing VPS to also have arm.
v2 - the present
All of the things that I’ve now set up have all been concepts I had already heard of, and most of them I knew how they technically worked. But now, having gone through the process of actually setting them up, it feels like a superpower. It’s a familiar feeling, I’ve experienced it a handful of times during my career as software developer as well. But doing it on your own, with nothing else but your curiosity, and maybe some stinginess, really is empowering.
In my first draft of this post I tried to write conclusions and reflections about what I’ve just set up. But I discovered that I’ve not yet processed them into something meaningful enough. I’ll just jump straight into what I currently have.
The system
Machines
VPS
Running on Hetzner with 4GB RAM, 2 vCPU and 40GB storage
This is where I have my most critical services in terms of uptime - like the password manager.
Raspberry Pi 5
8GB RAM, 2TB SSD-storage
This is where I have backups and main entrance for my photo-storage.
Laptop
This is the machine I’ve done all of my dev-work for the past years. The set-up with Omarchy, nvim and opencode is probably subject to a completely separate post. But I do want to mention that the specs barely matter for this one anymore since I’ve now moved to using my PC as main with this set-up.
And although cheaper hardware and not accidentally freezing the laptop in an oversized test-suite are arguments for it. I would say not draining your battery is the biggest gain.
PC
Actually, specs don’t really matter for this one either, just know it’s significantly more powerful than the laptop. If it weren’t for the fact that I also use this for gaming, I would just go for the bare-metal on Hetzner instead.
Old PC
Instead of retiring my old PC I’ve just kept it and have it as a playground running server virtualization.
Infrastructure
Infrastructure as Code - Ansible
Coming from pure software development seeing infrastructure as code (IaC) has really helped me. Then you’ll use the same set-up and workflow, i.e. editor and git, as you are used to, but instead of code it’s yaml-files. IaC comes in many flavors — SaltStack, Puppet, and Chef are some other alternatives. And maybe you’ve heard of Terraform which is basically the same thing but tailored to Kubernetes.
I went with Ansible because I had already used it at my previous job. It’s a mature project with a lot of community modules and “playbooks” to use and get inspiration from. For example I’ve used geerlingguy’s docker and security repo, (github).
If you force yourself to strictly add everything required on a machine to be set up through ansible (or some other IaC), then re-installing machines or moving services between machines becomes very easy. Furthermore, if you strive to making all tasks idempotent and with a proper check if it changed anything. You can then comfortably just run all tasks for all machines in your fleet and get a report of what has changed/updated and also know that things that did not show change are in their intended state.
VPN - Tailscale
I’ve heard examples where people set up their self-hosted fleet entirely relying on a VPN as the security-guard. It is probably one of the lowest effort highest reward measures you can do for basic security. But do know you will become dependant on those services. Anyway, for some of my services that run on hosts where there is nothing private nor critical it is very easy to set up for remote work. I use it mostly for dev-work to connect to my PC from my laptop.
When it comes to why I went for Tailscale instead of setting up one of the open source alternatives from scratch this is another of those pragmatic decisions. a) Tailscale is just so easy to set up, b) their free model is more than enough for my fleet and c) I do not yet have any critical services that are dependant on the VPN. At some point the latter will probably change and I’ll have to reconsider.
Monitoring - Grafana
Grafana is a really powerful tool to create charts and monitor/send alerts. I’ve used it for multiple projects even before my self-hosting journey. There are probably a lot of tools out there that does the same thing, but I’ve gotten used to it. Grafana is one of the more mature projects and has a plethora of plugins and examples.
Now with the help of AI it is really crazy how easy it is to set up. Previously I used their UI which is great, it gives suggestions and explanations of the data you’re trying to chart. But with AI you can just ask it to create templates in your ansible-repository and deploy to the server. You’ll get the traceability of changes from git, and you’ll have local files to edit and easily discuss with the agent on how to improve.
One more thing that AI can help with, is that collecting data becomes a whole lot simpler to set up. Previously I tried to set up manual Prometheus scrapers to have the data(-collection) unified and easily explored in the graphs. But now when I set up a service I tell the agent to do whatever data-collection method is easiest. It is a mix of Prometheus-scrapers, OTEL-exporters* and synced read-only sqlite DBs which Grafana queries directly.
*OTEL-exporters are used both because services emit those metrics, but also for cases where I don’t want to expose the machine more than necessary and use remote-write, like this one.
One more thing that you get with Grafana is alerting. You can of course do this with scripts as well, but here you get connectors to messaging-services, logic for recurring alerts and silencing functionality. And the best part is that it’s all through the same service where you have already collected all data! Although I use alerts mostly for the infra I build at work, I do find some useful ones also for my self-hosting. Like getting a message if my PC does not have the SSH-port available on the VPN.
Alerts and AI-messaging - Telegram (not self-hosted)
Telegram’s UX for setting up bots (web services/hooks) is really good. And their (phone) app is really good and tailored to simple DM set-ups. I’m using Discord daily for talking to friends and gaming and at work I use Slack. They are both really powerful, but also tailored to larger organizations. Both UI for setting up bots/services but also their apps I find more clunky. I’d still go for them if I were to set up a company messaging platform.
I have three bots so far: one for Grafana-alerts and two Openclaw agents.
Server Virtualisation - Proxmox
I’m still at the very beginning of using Proxmox and server virtualization self-hosted in general. So far I’m using it for hosting game-servers I play on with my friends. But I also want to explore having my agents use it for ephemeral sandboxed environments, and also have this as a base for backups and bigger storage.
Services
Reverse Proxy - Caddy
Not much to say - it does it’s job. I’m sure nginx would work just as well.
Password Manager - Vaultwarden
The initial spark for my self-hosting journey was when I read this post about hosting a password manager for free on GCP. It’s just a backend and web-ui, but the set-up is compliant with Bitwarden’s own apps and browser-plugins. I haven’t had any issues with it so far, and therefore I haven’t even considered if I should instead go with the official backend now that I’m no longer constrained to resources of the GCP free offering.
Bitwarden btw also has a CLI now, which I use to pass some vars and unlock the vault as part of ansible playbook runs. And also to give my agent limited access to some services.
“Personal AI” - Openclaw, Gbrain (and Clawvisor)
Speaking of agent access, my recent addition to the stack is a Personal AI set-up. It’s still new and I’m not sure if it’s what I want and why yet. But it’s at least worth a mention and my initial thoughts might pique someone’s curiosity.
Reading this series from Garry Tan on agent harnesses and a second brain combined with having a simple set-up guide, made me take a shot at it. Going at it without a specific idea on what it’s going to solve/help me with was a bit overwhelming I must say. I found myself going deeper into the code trying to understand how it works, but really I should have asked more about what I should use it for. But I think it’s worth exploring nevertheless, finding out all use-cases where just pushing AI into it is not helping is in itself also useful - right?
I have not gone full digital sync with my agent yet. I’ve used it to map out some of my private finances using Clawvisor to connect to Gmail and Google Drive. There were some quirks with getting it to use Deepseek with Zen. And the process of setting up the Google-test app requires some clicks in their UI, which I’m starting to accept less and less for taking up my time :). However, it was worth it, although I am letting my agents get access to quite a lot in production and locally I’m not yet in full YOLO-mode by giving it access to all my data. And even with the small bumps, Clawvisor was a whole lot better than nothing.
Gbrain I’m actually only using at the moment to sync my journaling of day-to-day work I’m doing on both my laptop and PC. And actually, it’s almost entirely done with opencode, since that’s what I use almost exclusively. I have it running on my PC and my opencode on the laptop connects to its MCP. Once I get the time to add more sources for it to digest perhaps it’ll blow my mind in synergies, or perhaps not - to be seen.
Openclaw I heard about before reading the second-brain article. I think what I’m hoping to get out of it is having a way to play around with multiple agents, add recurring tasks and check-ups and also share with my wife, friends and co-workers through the channels provided out of the box. Most of this I could do with opencode already, but for now I’m trying to build that as pure software dev tool. One thing I’ve built already is my exercise logger “Jack”, it’s an agent with just a handful of scripts and an sqlite DB that helps me log my exercises and their progress. I became tired of clicking around in the existing logging apps and gave this a try. Of course the DB is synced to my Grafana and I get to see my stats there.
Photo Storage - Immich
Probably a lot of alternatives, this is one. It’s being actively developed, with the pros and cons that comes with that. And it has apps for both iOS and Android. On my android I’ve set it as default photos storage.
File syncing - Syncthing
Syncthing is just absolutely fantastic. It has a simple UI for setting up connections to, and sharing between, devices. It has features for auto-detection between trusted hosts and it works on android as well. The best use-case I’ve found so far, and also why I initially added it, is to sync my personal notes between all my devices. I’m using Obsidian which also has an app for android. Sometimes I also use Syncthing for “mini-backups” when I’m still not sure how I want the set-up to be or it’s not yet added to ansible.
I do see file syncing as a backup to mitigate the risk of accidents out of my control. Like if my apartment would have a fire, or I would spill coffee on my laptop. But it’s not a real backup protecting me from other stuff, like being stupid and deleting a file, or getting my laptop stolen/compromised.
DNS ad-blocking - Pi-hole
I didn’t mention it during “The Journey”. But I am actually using Pi-hole in part. I have it configured to be DNS and exit-node for my tailscale network. This way the wifi-users use the normal router DNS, and my laptop, for example, uses Pi-hole-filtered internet. You can really notice the difference going back to the unfiltered internet. But really, I’m not the one to notice ads that much anyway I think.
Private financials - Wealthfolio
I’m not the one to make monthly budgets of my financials. But I am the one that makes investments outside of the average DCA in index funds. Having done so for over a decade spread out over brokers, unlisted companies and crypto brought me a certain amount of fragmentation to say the least. I initially tried with a Google Sheets, but it was too much work. I remember that I went for Wealthfolio for its nicely looking tree map of the portfolio that I had tried to build myself (then without AI). I have not re-evaluated this choice now when I mostly just use grafana for the graphs anyway. One other option I looked at then was Ghostfolio, now with the courage of AI assisting me I might try it, someday…
TODO
Some things I haven’t looked into yet, but either should or want to look into more are…
- 3-2-1 backup
The inspiration
“The inspiration” is perhaps too much. But they are at least worthy mentions if you want to explore further on self-hosting.
- r/selfhosted
- Jeff Geerling - Mostly his Youtube.
- Tom Dörr
- dhh - Although I mostly read his posts about Omarchy-updates there are some nuggets on his blog like, cloud exit, dare to connect a server to the internet and merchants of complexity.
- Garry Tan - What I find most compelling with reading his takes is that he actually is using and experimenting with the set-ups he is proposing.
The price
- VPS - $7/month on hetzner.com
- domain name - $1/month on njal.la
- storage/backup - $300 “one time” (until it breaks)