self-hosted.tech
Homelab // status: operational

My cloud has a power button.

self-hosted.tech is a homelab — three standalone Proxmox hosts, their VMs and containers managed with Terraform, a stack of services, and no monthly bill from anyone else's data center. Everything below is something I run. Tap any tile to visit the project behind it.

15Services
3Proxmox hosts
19VMs
14LXC
168dUptime
Infrastructure

The metal underneath

Three separate Proxmox hosts, each carved into VMs and LXC containers. The lab is built as code — a Terraform framework with per-host environments, reusable modules, and plan/apply driven by Gitea Actions.

Provisioning
TerraformGitea ActionsPer-host Terraform with Linux, Windows, and LXC modules. Plan on PR, apply on merge via Gitea Actions, with one remote state per node in Gitea.
Hosts
3 standalone Proxmox VEpve-lab-01 · pve-lab-02 · pve-lab-03 — independent, not clustered
Compute
44 threads · 160 GB RAM12 / 20 / 12 threads and 64 / 64 / 32 GB across pve-lab-01 – 03
Workloads
19 VMs · 14 LXC33 guests spread across the three hosts.
Orchestration
Docker ComposeContainers managed and updated through Dockhand
Networking
Traefik v3Cloudflare DNS-01A Traefik instance per host on a shared proxy bridge; certs from Let's Encrypt over DNS-01.
Access
NetBirdRaspberry Pi 4Hosted WireGuard mesh — how I reach the lab from anywhere, with no inbound ports opened. A Raspberry Pi 4 runs as a NetBird node at home, keeping the home network on the mesh.
Out-of-band
PiKVMRaspberry Pi 4Hardware KVM-over-IP — keyboard, video, and power control at the BIOS level, even when a host is off or won't boot.
How it's run

Three rules the lab lives by

01

Own the disk

Data sits on drives I can physically hold. No third party gets a copy by default, and nothing leaves the rack unless I send it.

02

One door in

Public services route through a single reverse proxy with Let's Encrypt certs over DNS-01. Everything else I reach over the NetBird mesh — no ports left open to the internet.

03

Rebuildable or it doesn't count

VMs and containers are defined in Terraform and rolled out through Gitea Actions. If I can't recreate it from code on a blank Proxmox host, it isn't really mine yet.