blog/content/posts/get_of_that_cloud.md
Shautvast 5eb7f57517 typo
2026-03-29 09:53:20 +02:00

48 lines
4.3 KiB
Markdown

---
title: "Get off that cloud"
date: 2026-03-28
draft: false
tags: ["selfhosted", "saas", "rust", "raspberry pi"]
description: "And that also means get off github"
---
We are living in the end-of-saas era. Instead you ask the LLM to build stuff for you, the way you want it, instead of paying for a subscription, or becoming the product as they say. But how are you going to host all those shiny apps? Yet another cloud provider? Then you are still a 'cloud serf' (as Yannis Varoufakis says). Real resistance comes from the self hoster... or maybe.
Last week's hackernews featured [moving to codeberg, for lazy people](https://unterwaditzer.net/2025/codeberg.html). Lazy person here!
So, in this vain, Claude and I coded a platform where I can host everything that my heart desires. In about a week, next to my day job.
At first it ran on my 10 years old pi3, which, was fine, were it not that compiling the rust backend took forever. I decided to upgrade to a beefy pi 5 with a 2Tb nvme and it works like it's indiscernable from actual magic!
_What does it have?_
- a Podman compose cluster
- a control plane in Rust, with a UI for managing apps and users. Sqlite for its storage.
- builds itself on startup in a podman container. No cargo needed.
- automated let's encrypt server certificates.
- a Caddy reverse proxy, handling TLS and routing dynamcally.
- forgejo for hosting my projects (selfhosted codeberg).
- a forgego agent to build stuff. Currently idle, but useful for testing apps before deploying them.
- build pipeline: git clone → detect stack → build container image → run via Podman
- webhooks for app updates or `git push hyi main`
- a postgres database. At the moment it's only purpose is datastore for forgejo
- basic security, users can be assigned to apps
- backed up to my Proton drive using rclone. Protondrive came free (15Gb) with my email account.
- running as systemd service on headless raspbian. Cold start in under a minute (haven't timed it).
https://git.sanderhautvast.nl/sander/Hostityourself
And it deploys any github repo you throw at it with a Dockerfile. It's name is the subdomain of your site.
The only thing that is missing from an SRE perspective is external monitoring. It does not have grafana. Just basic resource usage.
My youngest son is currently in the Philippines doing research on the impact of tropical storms on the local community and he texted me enthustically that he and Claude had hacked together a blog aggregator. I once tried to teach him the basics of HTML but at the time, I guess, he was taken aback by the amount of work he had to put in to achieve something marginally nice.
So now, without any prior knowledge he had managed to deploy a stylish UI and a Python backend on a free [render](https://render.com) account. They put your app in hibernation after inactivity, so thawing it takes a couple of minutes. I'm pretty certain it takes longer than it actually needs, just to lure you into paid service! Not something you'd want for yourself or your kids right? It's near immediate on my hiy (HostItYourself) cluster.
I just used regular Claude Sonnet 4.6, no agents. The one moment I had to switch to Opus was when it turned out that the rclone-proton integration does not work (at all) at the time of this writing. I had it analyse the problem, which took, maybe two hours and it built a fix, that actually worked. It has been said before, but the amount of code it analysed is impressive.
I really hesitated about creating a PR, actually two for different repo's, because one of them was in go-proton-api, maintained by proton themselves...\* The only thing I know about golang is that it was created by Rob Pike. Luckily it turned out there were existing PR's already that looked good enough to try and they worked! They aren't merged yet, but I learnt enough about go to create a local patched version and I'll just use that until it's officially released.
\*In fact the rclone project maintains a fork of go-proton-api. The upstream is not on par with their own typescript bindings, and, I'm speculating, maybe they don't take well to PR's ?
Next app was this blog. I used to struggle setting up jekyll and hugo for the company blog that I used to maintain. This setup was _discombobulated_ in minutes. I think it could look better, but it will do for now. This writing is my own.