← Projects07 / 11

Homelab

Side projectPersonal2026

Designed and operate a self-hosted platform end to end: a single-node k3s cluster plus hardened host services, all declared in Git. Its Forgejo CI builds and deploys this site.

Organisation
Side project
Year
2026
Field
Platform / SRE
Stack
k3s, Flux, Ansible, OpenBao, Authelia, Tailscale, restic, Forgejo Actions
1 min
From merge to running in the cluster
17
Platform services, all declared in Git
100%
Repos restored and verified in the last drill
01

Why I built it

  • I wanted my own platform to host my code, my services and this site.
  • And a place to run it the way I’d run production: declared in Git, secured and backed up.
  • Git
02

What it does

  • Main server: Forgejo, secrets, SSO and DNS, with everything else in k3s.
  • Storage node: NAS and backups.
  • Agent host: work boxes for coding agents.
  • Reached privately over Tailscale; only Cloudflare is public.
  • Forgejo
  • k3s
  • Tailscale
  • Cloudflare
Homelab architecture: a main server with host services and a k3s cluster, a storage node for backups and health checks, and an agent host for agent boxes, all on a Tailscale network; Forgejo deploys public sites to Cloudflare.Tailscale tailnetprivate · tag-based ACLs in GitMain serverLinux · host services + k3sHOST SERVICES · SYSTEMDForgejoGit + ActionsOpenBaosecretsAutheliaSSO · passkeysAdGuardDNSTraefik · host proxy on 80 / 443k3s clusterFluxKustomize · HelmExternal Secretsfrom OpenBaocert-managerwildcard TLS · DNS-01TraefikGateway APIStorage nodeNAS · backup targetresticnightly backupsGatus~15 checksSambaNASAdGuard2nd DNSHome AssistantAgent hostisolated containersIncus agent work boxescoding agentspullCloudflarepublic DNS · Pages hosts this sitedeployYou and agentsSSO login · PRs into Forgejo
Hosts and services. Red marks Forgejo, where every change starts.
03

How it’s built

  • Every host and service is declared in Git, with Ansible and Flux.
  • Every change starts as a pull request; after merge it rolls out in about a minute.
  • SSO with passkeys in front of every admin UI, and secrets in OpenBao.
  • Nightly backups with restic, and restores that are drilled.
  • Coding agents open pull requests from a restricted account; I review and merge.
  • Git
  • Ansible
  • Flux
  • OpenBao
  • restic
Change flow: git push, pull request in Forgejo, dry-run diff, merge to main; then the Ansible runner applies to every host, Flux pulls into k3s, and Forgejo Actions deploys sites to Cloudflare Pages.git pushbranchPull requestin ForgejoDry-run diffansible --check --diffMerge to mainI reviewAnsible runner → hostsown key · restricted userFlux → k3spulls main every minuteForgejo Actions → Pagesnpm build · wrangler deployone run at a time · reruns report zero changesKustomize + HelmReleaseshow this site ships
How a change reaches production.
04

Outcome

  • A platform I run like production, from one Git repo.
  • Its CI builds and deploys this site.
  • Git

All projects

Contact: Let’s
talk.

Looking for a great addition to your company, or for solutions in software, agentic AI, search, infrastructure or automation? Write me an email or reach out on LinkedIn.

[email protected]LinkedIn ↗