← austins.cv SIDE BOOK · $HMLB
House Tour · AAIServ Homelab

A personal datacenter,
run like production

Three Proxmox nodes, sixty-plus services, one operator. Everything behind single sign-on, everything in git, everything monitored — because the discipline is the hobby.

3
Proxmox nodes
60+
Services
240TB
Raw · 120 mirrored
384GB
RAM, lab-wide
10GbE
Core network
100%
Behind SSO
The cluster

Topology

internet the outside world pfSense router · VLANs · DNS 10 GbE core switch pmx1 primary compute node · GPU VHF/UHF 2.4GHz RTL-SDR pmx2 secondary compute node · GPU pmxnas ZFS mirrors · 120 TB usable WiFi 6 2.4 / 5 GHz WiFi 7 6 GHz add'l node Zigbee Z-Wave add'l node devenv where the work happens

internetbusiness-class fiber ONT · static IPs

routerpfSense CE, virtualized on ESXi

coreL3 managed SFP+ 10 GbE switch

pmx1128 GB RAM · 16 Intel Xeon cores · 2× 2 TB gen-4 NVMe

pmx2128 GB RAM · 16 Intel Xeon cores · 2× 1 TB gen-4 NVMe

pmxnas16 GB RAM · 8 AMD cores · 2× 256 GB gen-4 NVMe

the clusterother non-Proxmox nodes host further services like Nextcloud and Home Assistant — soon to be converted into additional pmx nodes

The stack

Sixty services, six layers

EDGE & IDENTITY
Nginx Proxy ManagerTLS · every public name
PowerDNSauthoritative DNS, 25+ zones
AuthentikSSO/OIDC on everything
pfSenserouting · VLANs · firewall
AI & COMPUTE
Ollamalocal models on the lab GPUs
Open WebUIthe chat front end
Whisper / Piperspeech to text, text to speech
Jupyternotebooks against local compute

the perimeterrouting, DNS, TLS and single sign-on in front of everything; no service has its own password door

the intelligencefifteen local models, 2–14B parameters, chat, vision and coding — plus Whisper and Piper for speech in and out — serving lab services and Open WebUI chat

PLATFORM
Giteaevery repo, incl. this site
TeamCityCI, config as Kotlin DSL
ProGetprivate package feeds
SQL Serverapp databases
RabbitMQmessage bus
LIFE
Immichphotos, GPU-accelerated ML
Home Assistantthe apartment, automated
Triliumnotes + a custom task cockpit
Trektravel planning, self-hosted
Dawarichlocation history, kept at home

the factoryGitea for source control, TeamCity running CI with versioned Kotlin DSL build configs; ProGet hosts private NuGet and Docker feeds, SQL Server, RabbitMQ providing message bus and MQTT services

the householdphotos with GPU-based ML image recognition, backing up device photos to a web gallery; Home Assistant for home automation; advanced programmable notes via Trilium; Trek vacation planning; and self-hosted location timelines

MEDIA & COMMS
Plexthe cinema
MusicManagerthe collection, custom-built
AAITVlive TV, custom-built
Calibre-Web Automatedthe library, auto-ingested
RomMthe arcade
MiroTalkvideo calls off the cloud
OBSERVABILITY & OPS
Umamianalytics (watching you now)
Scrutinydisk health, before it hurts
Guacamoleremote consoles in a tab
Nextermserver management in a tab
Scanopynetwork discovery & recon
Kopiabackups, verified and versioned

the cinemaPlex serves movies and live TV with GPU transcoding; a custom-managed lossless music collection reaches Sonos, web and device via Subsonic, controllable by Alexa; digital bookshelves with send-to-device, an expansive arcade, and local video conferencing

on guardself-hosted analytics on the public sites, SMART telemetry from every disk, verified and deduped backups, the whole network discovered and recon’d, any server’s console or SSH session one browser tab away, and intrusion detection

The front door

Every service, one sign-on

The Authentik application catalog: a grid of every homelab service as app tiles
AUTH.AAISERV.COM

the Authentik application catalog — one identity in front of everything; nothing in the lab has its own password door

Built, not installed

Running services is a hobby, building them is my job

SpamFiltera self-trained spam model over the family mail: 3,675 messages, 85.7% spam, 1.86 ms average inference

storagemon120 TB tracked across four hosts: live I/O, volume history, disk-level health

MusicManagerthe lossless collection under custom management: 1,538 artists, 13,840 songs, 336 GB on disk

AAITVlive broadcast TV off the tuners: two-up viewing, a 108-channel guide, picture-in-picture

flightpathpipeline orchestration with per-step logs and resource telemetry · in development

SpamFilter dashboard: volume and spam-rate chart with inference statistics
SpamFiltera self-trained spam model over the family mail: 3,675 messages, 85.7% spam, 1.86 ms average inference
storagemon dashboard: tracked capacity, live I/O and volume health across hosts
storagemon120 TB tracked across four hosts: live I/O, volume history, disk-level health
MusicManager: dark library dashboard with artist tiles, play queue and lossless badges
MusicManagerthe lossless collection under custom management: 1,538 artists, 13,840 songs, 336 GB on disk
AAIServ.TV: two live broadcast streams side by side above a 108-channel guide
AAITVlive broadcast TV off the tuners: two-up viewing, a 108-channel guide, picture-in-picture
flightpath: a pipeline run DAG with step detail and resource telemetry
flightpathpipeline orchestration with per-step logs and resource telemetry · in development
The workshop

devenv — where the work happens

TOOLING
herdrterminal sessions from any device
code-serverVS Code in a browser tab
klausgit patch viewer
JetBrains remoteRider, headless
rtl_tcpSDR stream server — radio experiments
TOOLCHAINS
.NET 9 · C/C++ · Python · nodethe core chains, uv-managed Python
Dockercontainers without sudo
PlatformIOembedded builds for the IoT repos
Datasetteany SQLite file, browsable in a tab
other dev toolsask-cli, ffmpeg-fdk (libfdk_aac), adb

the full toolchain lives on the box — .NET 9, C/C++, Python and node; Rider and VS Code run headless, diffs read in klaus, sessions picked up in herdr from any device. provisioned by one re-runnable script, like everything else in the lab.

The devenv login banner: AAIServ ASCII art, host and resource summary, shell prompt
The discipline

"Run like production" is not a metaphor

→ One identity provider; no service has its own password door.
→ Every config change lands in git with a reasoned commit message.
→ Public TLS on real domains — no self-signed warnings, ever.
→ Disk health, backups and uptime watched by machines, not vibes.
→ Every IP has reverse DNS — PTR records on the lab’s own domain.
→ New services get provisioned, documented and monitored — or they don't ship.
# a quiet Saturday, somewhere in the cluster
austin@devenv:~$ ssh pmx1 pvecm status | grep -E "Nodes|Quorate"
Nodes:   3
Quorate: Yes
austin@devenv:~$ ▍

← back to austins.cv  ·  view as one page  ·  ↑ top of the tour