meklab.net

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.

The server rack in the basement, door open: the switch at the top, the servers on shelves below, and the console screen and keyboard on an arm at its side.
The rack today. The console on its arm is one of the six hosts.

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.

JanFebMarAprMayJunJulAugSepOct0 commits on Jan 12, 20260 commits on Jan 13, 20260 commits on Jan 14, 20260 commits on Jan 15, 20260 commits on Jan 16, 202612 commits on Jan 17, 202610 commits on Jan 18, 20260 commits on Jan 19, 20260 commits on Jan 20, 20260 commits on Jan 21, 20260 commits on Jan 22, 20269 commits on Jan 23, 20262 commits on Jan 24, 20260 commits on Jan 25, 20260 commits on Jan 26, 20260 commits on Jan 27, 20260 commits on Jan 28, 20260 commits on Jan 29, 20260 commits on Jan 30, 20262 commits on Jan 31, 20261 commit on Feb 1, 20264 commits on Feb 2, 20260 commits on Feb 3, 20260 commits on Feb 4, 202615 commits on Feb 5, 202610 commits on Feb 6, 20260 commits on Feb 7, 20262 commits on Feb 8, 20260 commits on Feb 9, 20260 commits on Feb 10, 20260 commits on Feb 11, 202613 commits on Feb 12, 20261 commit on Feb 13, 20260 commits on Feb 14, 20260 commits on Feb 15, 20260 commits on Feb 16, 20260 commits on Feb 17, 20260 commits on Feb 18, 20266 commits on Feb 19, 20260 commits on Feb 20, 20261 commit on Feb 21, 20260 commits on Feb 22, 20260 commits on Feb 23, 20260 commits on Feb 24, 20261 commit on Feb 25, 20262 commits on Feb 26, 20261 commit on Feb 27, 20260 commits on Feb 28, 20267 commits on Mar 1, 20267 commits on Mar 2, 20265 commits on Mar 3, 20269 commits on Mar 4, 202614 commits on Mar 5, 20262 commits on Mar 6, 20269 commits on Mar 7, 20260 commits on Mar 8, 20268 commits on Mar 9, 20260 commits on Mar 10, 20260 commits on Mar 11, 20260 commits on Mar 12, 20264 commits on Mar 13, 20260 commits on Mar 14, 20260 commits on Mar 15, 20260 commits on Mar 16, 20260 commits on Mar 17, 20260 commits on Mar 18, 20260 commits on Mar 19, 20261 commit on Mar 20, 20260 commits on Mar 21, 20260 commits on Mar 22, 20260 commits on Mar 23, 20260 commits on Mar 24, 20260 commits on Mar 25, 20261 commit on Mar 26, 20265 commits on Mar 27, 20262 commits on Mar 28, 20260 commits on Mar 29, 20260 commits on Mar 30, 20260 commits on Mar 31, 20260 commits on Apr 1, 20261 commit on Apr 2, 20260 commits on Apr 3, 202628 commits on Apr 4, 202617 commits on Apr 5, 202635 commits on Apr 6, 202611 commits on Apr 7, 20265 commits on Apr 8, 20260 commits on Apr 9, 20260 commits on Apr 10, 202658 commits on Apr 11, 20262 commits on Apr 12, 20268 commits on Apr 13, 202612 commits on Apr 14, 20260 commits on Apr 15, 20260 commits on Apr 16, 20260 commits on Apr 17, 20262 commits on Apr 18, 202662 commits on Apr 19, 20268 commits on Apr 20, 20262 commits on Apr 21, 20260 commits on Apr 22, 20260 commits on Apr 23, 202674 commits on Apr 24, 20266 commits on Apr 25, 20260 commits on Apr 26, 20262 commits on Apr 27, 20260 commits on Apr 28, 20260 commits on Apr 29, 20260 commits on Apr 30, 20265 commits on May 1, 202616 commits on May 2, 20260 commits on May 3, 20260 commits on May 4, 20260 commits on May 5, 20261 commit on May 6, 202610 commits on May 7, 202633 commits on May 8, 20264 commits on May 9, 20265 commits on May 10, 20260 commits on May 11, 20269 commits on May 12, 20264 commits on May 13, 20260 commits on May 14, 20260 commits on May 15, 20260 commits on May 16, 20266 commits on May 17, 20260 commits on May 18, 20260 commits on May 19, 20260 commits on May 20, 20260 commits on May 21, 20260 commits on May 22, 20264 commits on May 23, 20264 commits on May 24, 20260 commits on May 25, 20260 commits on May 26, 202615 commits on May 27, 202619 commits on May 28, 20265 commits on May 29, 20267 commits on May 30, 202612 commits on May 31, 20267 commits on Jun 1, 202619 commits on Jun 2, 20264 commits on Jun 3, 20260 commits on Jun 4, 20263 commits on Jun 5, 20264 commits on Jun 6, 202618 commits on Jun 7, 202620 commits on Jun 8, 20266 commits on Jun 9, 20265 commits on Jun 10, 20260 commits on Jun 11, 20260 commits on Jun 12, 20265 commits on Jun 13, 20260 commits on Jun 14, 20260 commits on Jun 15, 20261 commit on Jun 16, 202615 commits on Jun 17, 20260 commits on Jun 18, 202615 commits on Jun 19, 20262 commits on Jun 20, 20260 commits on Jun 21, 20260 commits on Jun 22, 20260 commits on Jun 23, 20260 commits on Jun 24, 20260 commits on Jun 25, 20260 commits on Jun 26, 202610 commits on Jun 27, 20260 commits on Jun 28, 20260 commits on Jun 29, 20260 commits on Jun 30, 20260 commits on Jul 1, 20260 commits on Jul 2, 20260 commits on Jul 3, 20260 commits on Jul 4, 20260 commits on Jul 5, 20260 commits on Jul 6, 20260 commits on Jul 7, 20261 commit on Jul 8, 20260 commits on Jul 9, 20260 commits on Jul 10, 20260 commits on Jul 11, 20260 commits on Jul 12, 20260 commits on Jul 13, 20260 commits on Jul 14, 20260 commits on Jul 15, 20260 commits on Jul 16, 20260 commits on Jul 17, 20261 commit on Jul 18, 20261 commit on Jul 19, 20260 commits on Jul 20, 20260 commits on Jul 21, 20260 commits on Jul 22, 20260 commits on Jul 23, 20260 commits on Jul 24, 20260 commits on Jul 25, 20260 commits on Jul 26, 20260 commits on Jul 27, 20260 commits on Jul 28, 20260 commits on Jul 29, 20260 commits on Jul 30, 20260 commits on Jul 31, 20260 commits on Aug 1, 20260 commits on Aug 2, 20260 commits on Aug 3, 20260 commits on Aug 4, 20260 commits on Aug 5, 20260 commits on Aug 6, 20260 commits on Aug 7, 20261 commit on Aug 8, 20260 commits on Aug 9, 20260 commits on Aug 10, 20260 commits on Aug 11, 202649 commits on Aug 12, 20266 commits on Aug 13, 202633 commits on Aug 14, 202635 commits on Aug 15, 202635 commits on Aug 16, 202627 commits on Aug 17, 202651 commits on Aug 18, 202631 commits on Aug 19, 20260 commits on Aug 20, 20266 commits on Aug 21, 20263 commits on Aug 22, 20264 commits on Aug 23, 20260 commits on Aug 24, 20263 commits on Aug 25, 202618 commits on Aug 26, 202698 commits on Aug 27, 202635 commits on Aug 28, 2026108 commits on Aug 29, 202638 commits on Aug 30, 20264 commits on Aug 31, 202624 commits on Sep 1, 2026155 commits on Sep 2, 202633 commits on Sep 3, 202675 commits on Sep 4, 202624 commits on Sep 5, 202610 commits on Sep 6, 20264 commits on Sep 7, 202647 commits on Sep 8, 20269 commits on Sep 9, 202616 commits on Sep 10, 202654 commits on Sep 11, 202621 commits on Sep 12, 20266 commits on Sep 13, 20260 commits on Sep 14, 20264 commits on Sep 15, 202647 commits on Sep 16, 202631 commits on Sep 17, 202619 commits on Sep 18, 20265 commits on Sep 19, 20268 commits on Sep 20, 202619 commits on Sep 21, 202610 commits on Sep 22, 202632 commits on Sep 23, 202614 commits on Sep 24, 20263 commits on Sep 25, 202635 commits on Sep 26, 20269 commits on Sep 27, 20266 commits on Sep 28, 20261 commit on Sep 29, 20260 commits on Sep 30, 20260 commits on Oct 1, 20260 commits on Oct 2, 20264 commits on Oct 3, 20261 commit on Oct 4, 20262 commits on Oct 5, 202620 commits on Oct 6, 202613 commits on Oct 7, 20267 commits on Oct 8, 20267 commits on Oct 9, 20262 commits on Oct 10, 20261 commit on Oct 11, 20260 commits on Oct 12, 20260 commits on Oct 13, 20260 commits on Oct 14, 20260 commits on Oct 15, 20261 commit on Oct 16, 20260 commits on Oct 17, 20260 commits on Oct 18, 202613 commits on Oct 19, 20263 commits on Oct 20, 202615 commits on Oct 21, 20260 commits on Oct 22, 20265 commits on Oct 23, 20264 commits on Oct 24, 202616 commits on Oct 25, 202622 commits on Oct 26, 2026

FewerMore

How it got here

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. 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.

  10. 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.

  11. 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.

  12. 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.

  13. 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.

  14. 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.

  15. 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.

  16. 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.

  17. 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.

  18. 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.

  19. 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