Self-hosting on Hetzner
๐ณ Evergreenยท last tended 24 Oct 2026infraself-hostinglinux
This website and its JobHunt backend live on my personal Hetzner machine. No Kubernetes, no managed platform, no monthly bill that quietly triples. Just Ubuntu, systemd, nginx, Docker where it earns its keep, and cron.
The setup, roughly:
- Process management via
systemdunits โ each service restarts on failure and starts on boot. Logs go tojournald. - Reverse proxy with nginx hardening in front of everything; TLS via Let's Encrypt on a renewal timer.
- State kept outside application releases: JSONL for website submissions and PostgreSQL for JobHunt. Backup and connection-pooling settings need per-service verification rather than an assumption that all projects share them.
- Website deploys use a hosted GitHub Actions workflow and a forced SSH receiver that fetches the exact expected revision, builds on the box, and restarts the service. This is not an immutable-release or zero-downtime deployment.
- JobHunt deploys use a separate immutable-release mechanism. Its release switching and recovery behavior must not be attributed to the website.
Why bother when managed hosting exists? It gives me practical experience operating the stack and a predictable small-server cost. It's the same instinct as validate before automating โ I'd rather know exactly what my system does than trust a black box to do it for me.