Homelab
meklab
A small datacenter in a basement server rack, run the way a platform team runs production. It's where I learn by doing, and now and then by fixing what I broke.
By the numbers
- Hardware
- 6Proxmox hosts
- 60CPU cores
- 181 GBmemory
- 56 TBraw storage, copied offsite
- Cluster
- 142running pods
- 104workloads in 26 namespaces
- 35HTTPS services
- 21Helm releases via Flux
- Work
- 315tickets completed
- 35tickets in progress
- 852merged merge requests
- 443cluster config releases
Counted in October 2026 from GitLab, the cluster and Proxmox.
Principles
- Education first
- A lab and a playground before it is a production platform. Reliability matters, but not at the cost of slowing experimentation or adding mental overhead.
- Future-me optimization
- Spend more effort up front when it cuts long-term maintenance, ambiguity, or decision fatigue. Infrastructure as code throughout, with as little configuration inside services and UIs as possible.
- Enterprise emulation
- Follow industry standards and best practices, and emulate real enterprise patterns within reason.
- Good neighbor
- The home network stays fast and up. The lab may be having a catastrophe, but everyone else in the house should still be streaming without noticing.
- Default in-house
- Where practical, infrastructure and tooling are hosted and run internally. This site is a deliberate exception: it runs on Cloudflare Pages so it can be public without exposing the cluster.
- Documentation determination
- Documentation is comprehensive, consistent, and kept up to date.
Every commit since January 2026
2,237 commits on 146 days, across every repository in the lab.
FewerMore
How it got here
-
August 2025
Started the homelab on Proxmox
First self-hosted services ran in Docker Compose on Proxmox VMs, the start of what grew into a Kubernetes platform.
-
December 22, 2025
Registered meklab.net
Bought the lab's own domain, giving every service a stable public name while the services themselves stay private.
-
January 17, 2026
Infrastructure moved into Git with self-hosted CI
Started the infrastructure repo on a self-hosted GitLab with runners and Terraform-managed DNS, for a three-node Proxmox cluster reachable only over Tailscale.
-
February 12, 2026
Separate staging and production environments
Planned from the start as dev, staging and production, each service ran in isolated environments with its own DNS names, ingress and secrets.
-
March 3, 2026
Single sign-on across all services
Put Authentik in front of every production and infrastructure service, replacing per-app logins with one identity provider.
-
April 4, 2026
Moved to a three-node Kubernetes cluster
Built a highly available k3s cluster reconciled from Git by Flux, with Longhorn storage, Vault secrets and Prometheus monitoring.
-
April 7, 2026
Docker services migrated into Kubernetes
Every Compose-based service except GitLab moved into the cluster, and DNS cut over from test names to production names.
-
April 11, 2026
First app shipped through the image pipeline
The landing page became the first app built by GitLab CI into the private registry and deployed by tag through Flux.
-
April 24, 2026
Automated cluster backups to self-hosted S3
Added scheduled Velero and Longhorn volume backups to self-hosted object storage, the layer that later made a full Vault restore possible.
-
May 17, 2026
Media library moved to object storage
Jellyfin and Audiobookshelf switched from a network share to a self-hosted S3 bucket, mounted through FUSE sidecars.
-
May 22, 2026
Vault data lost and restored from backup
Vault's storage volume came back empty. It was restored from a nightly backup the next day while running apps kept their cached secrets.
-
May 30, 2026
GitLab moved into the cluster
Self-hosted GitLab and its registry cut over to Kubernetes. The last Docker Compose VM was destroyed in August, ending the Compose era.
-
June 26, 2026
Fixed nightly etcd brownouts from backups
Snapshotting all three etcd servers at once stalled the control plane every night. Staggering the backup jobs kept quorum intact.
-
August 21, 2026
Downsized the cluster to free hardware
Cut storage replicas from three to two, retired unused services, and removed surplus nodes so their sale could fund a storage server.
-
September 8, 2026
Public repos mirrored to GitHub
Seven project repos were scrubbed of secrets and private details, then push-mirrored from GitLab to GitHub as a read-only portfolio.
-
September 12, 2026
UPS-triggered graceful shutdown armed
A watcher on the rack UPS now shuts the whole cluster down in order on sustained power loss, protecting data and etcd quorum.
-
September 28, 2026
Storage moved to a Dell PowerEdge T330
A thrift-store T330 with a four-drive ZFS RAIDZ1 pool took over object storage, then the media library.
-
October 11, 2026
Offsite backup site went live
A pull-only offsite machine now receives encrypted ZFS replication, so the homelab cannot delete or overwrite its own backups.
-
October 26, 2026
meklab.net became the public portfolio
The domain moved to this static site on Cloudflare Pages, and the internal dashboard moved to a subdomain.
Topology
Proxmox cluster · 6 hosts · quorum 3
Kubernetes · Flux reconciles from self-hosted GitLab
Observability
Prometheus · Grafana · Alertmanager
Loki · Blackbox probes per service tier
Storage and backup
Longhorn (2 replicas) · Garage S3 · ZFS
PBS for VMs · Velero for volumes · offsite copy
Edge
MikroTik routing and VLANs · split-horizon DNS on three resolvers · Tailscale as the only remote path