← HomePlatform

How the products were run.

Three live products, one person, under €100 a month. The platform was as much a product as the apps on it.

Ran
Rekindo, Fixmora, Kazengo and the tools around them
Cost
Under €100 a month, all in
Status
Retired. The products are offline and the cluster is gone.1 control plane · 4 workers · 5 Postgres VMs
Stack
Hetzner Cloudk3s · kube-hetznerOpenTofuArgo CDGitHub ActionsTraefik · cert-managerCloudflarePostgreSQLBitwarden SecretsPrometheus · LokiTelegram

The problem

Three products, each with a database, workers and email, and one person to keep them up. Managed platforms cost more than the products earned; hand-configured servers are impossible to reason about a year later.

What I built

A self-managed k3s cluster on Hetzner, declared end to end: OpenTofu for the servers and DNS, Argo CD for everything inside. A push to main builds an image, bumps a tag, and Argo CD rolls it out.

Outcome

Deploys took minutes and no hands. Five small servers carried three products, Postgres, queues and monitoring for the price of one managed database.

A platform that one person can rebuild from a repo is worth more than one that is a little cheaper or a little faster.what I took from it

Architecture
Self-managed Kubernetes on Hetzner with GitOps

From git push to a running pod: CI, registry, Argo CD, and the services around the cluster. Click to open full size

Decisions

  • Postgres on a €5 VM per product instead of a managed database. Daily backups to object storage instead of point-in-time recovery, because a day of lost data was acceptable for these products and a managed database was not in the budget.
  • One pod per app, no autoscaling. The traffic never justified it, and a single pod is simpler to debug at two in the morning.
  • Production right after acceptance. Small deploys, many times a day, with a one-line rollback through git.
  • Nothing configured by hand: no cluster dashboards, no SSH changes. If it was not in the repo, it did not exist.
  • Alerts to Telegram only for the things that needed a person: a failed deploy, a pod that would not start, a site that stopped answering.

Hosting over the years

  1. 2015A VPS for JudgeMySound and Tringa
  2. 2018Google App Engine for eLearnScanner
  3. 2020AWS serverless for Pointiful and Charm: Lambda, AppSync, Amplify
  4. 2023A Hetzner server with Docker Compose through Coolify for Fixmora
  5. 2025Self-managed Kubernetes on Hetzner for Fixmora, Kazengo and Rekindo, the platform on this page

Timeline

  1. 2025Cluster from code: kube-hetzner, network, firewall, ingress, certificates, DNS. Argo CD app-of-apps, reusable CI, Postgres VMs with nightly backups
  2. 2025 – 2026Monitoring and Telegram alerts; the products moved over one at a time
  3. 2026Products taken offline, cluster retired