Skip to content
All projects

Home k3s platform

A one-node Kubernetes cluster that runs all my apps, deployed by pushing a git tag.

k3s
Argo CD
Cloudflare Tunnel
Sealed Secrets
GitHub Actions

The problem

I kept building small apps that only ran on my laptop. I wanted one place to host them, with the same release step for every app, and without opening a port on my home router.

How it works

  • One k3s cluster with one namespace per app. Every app has the same few manifests: namespace, config, secret, deployment, service.
  • Public traffic comes in through a Cloudflare Tunnel that dials out from the cluster, so no public DNS record points at my home IP.
  • Releasing is `git tag vX.Y.Z && git push`. A GitHub Actions job on a self-hosted runner builds the image and writes its commit SHA into the manifest in a separate config repo.
  • Argo CD watches that config repo and syncs the change into the cluster. CI never talks to the cluster.
  • Secrets are committed only as sealed secrets. Metrics, logs, uptime probes and analytics run in their own namespace.

A decision: Images are pinned to the commit SHA in a separate config repo

The config repo is the single record of what should be running. A rollback is a git revert, and nobody can bump a version by hand and forget to commit it.

What was hard

Cloudflare becomes a single point of failure for every public host, and the cluster is on a home connection. I accepted that for personal projects and cover it with caching for the pages that matter.