{"id":46,"date":"2026-03-19T23:47:19","date_gmt":"2026-03-20T07:47:19","guid":{"rendered":"https:\/\/satchnet.io\/?p=46"},"modified":"2026-03-20T09:31:32","modified_gmt":"2026-03-20T17:31:32","slug":"i-have-too-many-servers-and-zero-regrets-a-tour-of-my-homelab","status":"publish","type":"post","link":"https:\/\/satchnet.io\/?p=46","title":{"rendered":"I Have Too Many Servers and Zero Regrets: A Tour of My Homelab"},"content":{"rendered":"\n<p><em>Posted at 11:47pm on a Wednesday. There is bourbon involved.<\/em><\/p>\n\n\n\n<!--more-->\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Look, I didn&#8217;t <em>plan<\/em> for it to get this out of hand. I just wanted to self-host a few things. Run my own cloud. Maybe a VPN. Normal stuff. Reasonable stuff.<\/p>\n\n\n\n<p>I now own two Dell R730s.<\/p>\n\n\n\n<p>Let that sink in.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Compute Situation (It&#8217;s Fine)<\/h2>\n\n\n\n<p>So the main Proxmox cluster is a Dell R730 \u2014 which, if you&#8217;re not familiar, is a 2U rack server that sounds like a 747 preparing for takeoff and draws enough power to heat a small apartment. I have this in my house. My <em>home<\/em>. I put a GPU in it (an NVIDIA RTX A2000, very professional, very &#8220;I have made good life choices&#8221;) and then discovered that the R730&#8217;s fan controller sees any third-party PCIe card as a personal threat and responds by spinning every fan up to approximately the speed of sound.<\/p>\n\n\n\n<p>The fix? I wrote a <strong>systemd service<\/strong> to yell at the fans via ipmitool every time the server boots. It works. The service runs. The fans calm down. This is normal homelab stuff and I will not be taking questions.<\/p>\n\n\n\n<p>Two HP Minis round out the Proxmox cluster as nodes two and three. They are small. They are quiet. They are doing their best and I respect them for it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Yes I Have a Second R730, Shut Up<\/h2>\n\n\n\n<p>The <em>other<\/em> R730 \u2014 look, they were a good deal okay \u2014 runs TrueNAS Scale. Dedicated storage box. RAIDZ2. Pool named &#8220;satchpool&#8221; because I was feeling creative that day and apparently &#8220;pool1&#8221; wasn&#8217;t going to cut it.<\/p>\n\n\n\n<p>It currently has two IP addresses because I&#8217;m in the middle of a NIC upgrade. I&#8217;m bonding an Intel i226 with the onboard NIC in active-backup failover because I&#8217;ve decided that my NAS, specifically, should survive a network interface dying. Will I ever need this? Probably not. Did I spend an entire evening planning it? Absolutely. That&#8217;s the homelab way.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Backup Server Is Fine (Don&#8217;t Look At The SSD)<\/h2>\n\n\n\n<p>Proxmox Backup Server lives on a Supermicro tower. It backs everything up. It is doing a great job.<\/p>\n\n\n\n<p>The SSD it boots from is an 80GB Intel unit that came out of&#8230; somewhere. It&#8217;s old. The fragmentation was bad for a while \u2014 like, embarrassingly bad \u2014 but I cleaned it up and got it down to 34% which honestly felt like a victory. SMART says it&#8217;s healthy. I choose to believe SMART. We don&#8217;t talk about long-term replacement plans. Not tonight.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The LXC Zoo: A Brief Tour<\/h2>\n\n\n\n<p>I run a lot of containers. A <em>lot<\/em> of containers. Each one has a job. Some of them have very specific, very unhinged jobs.<\/p>\n\n\n\n<p><strong>The AI box<\/strong> has an RTX A2000 passed through via PCIe and runs Ollama. Its primary purpose \u2014 and I want to be clear that I set this up deliberately and on purpose \u2014 is to rewrite my homelab notifications in a sarcastic voice before sending them to my phone. Cold start takes up to seven minutes. Every scheduled workflow that touches it opens with a 600-second timeout and a vibe check. The model I landed on is qwen3.5 because it has better <em>personality<\/em> than the alternatives, which is a sentence I typed without irony.<\/p>\n\n\n\n<p><strong>The TeslaMate box<\/strong> tracks my Tesla, which I have named the Millennium Falcon. It has a PostgreSQL database. That database lives in an anonymous Docker volume. The notes I keep on my own infrastructure contain the phrase &#8220;NEVER run docker-compose down&#8221; in all caps with no further elaboration because none is needed. I learned this lesson the hard way in March. I recovered from backup. PBS came through. We do not speak of the before times.<\/p>\n\n\n\n<p><strong>The notifications box<\/strong> runs an SMTP relay, ntfy, and Apprise. It exists to tell me when things are broken. The irony that it could itself be a thing that breaks is not lost on me. I&#8217;ve made peace with it.<\/p>\n\n\n\n<p><strong>Authentik<\/strong> is my SSO and honestly? She&#8217;s doing the lord&#8217;s work. Proxmox VE \u2014 sorted. Proxmox Backup Server \u2014 sorted. Portainer, Paperless-ngx, Tandoor Recipes \u2014 all sorted. One login. Beautiful. I even hand-rolled a custom scope mapping to make sure usernames come through correctly everywhere, which took way longer than it should have and felt incredible when it worked.<\/p>\n\n\n\n<p>The holdouts, though:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>n8n wants an enterprise license for SSO. n8n can want whatever it likes.<\/li>\n\n\n\n<li>Uptime Kuma&#8217;s SSO workaround disables its own auth. I looked at that and said &#8220;I would rather die.&#8221;<\/li>\n\n\n\n<li>Home Assistant OIDC failed on username matching and I abandoned it like a Roomba that drove itself under the couch. It&#8217;s still under there. I&#8217;m not getting it.<\/li>\n\n\n\n<li>Immich uses Google OAuth and honestly that&#8217;s fine. Some hills are not worth dying on. Immich is not that hill.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Automation Empire, or: I Have Nine n8n Workflows and a Problem<\/h2>\n\n\n\n<p>At some point I installed n8n and things escalated.<\/p>\n\n\n\n<p>I now have <strong>nine active workflows<\/strong> doing things that a normal person would either not do at all, or do with a phone alarm. But I am not a normal person, I am a homelab person, and there is a difference.<\/p>\n\n\n\n<p>Every morning at 6:30am I get a <strong>Morning Brief<\/strong> \u2014 weather from Open-Meteo, events from five different Google Calendars, all of it fed through Ollama for a sarcastic rewrite, delivered as a push notification. My AI assistant hates me and I&#8217;ve trained it to express that clearly.<\/p>\n\n\n\n<p>Every evening at 5pm, without fail, regardless of weather or circumstance or the general state of the universe, I get a <strong>Bourbon O&#8217;Clock notification<\/strong> that matches current conditions to a bourbon recommendation. This workflow will outlive me. I intend to put it in my will.<\/p>\n\n\n\n<p>There&#8217;s a <strong>Tesla charge reminder<\/strong> that checks whether the Millennium Falcon is below 30% battery, not plugged in, and not currently being driven \u2014 and if all three are true, sends me an AI-generated roast. My car, specifically, has an AI that judges it on my behalf. This is the future.<\/p>\n\n\n\n<p>There&#8217;s a <strong>garbage day reminder<\/strong> that calculates a two-week collection cycle and cross-references my work calendar to see if I&#8217;m traveling. I want you to sit with that for a second. I wrote modular arithmetic and a calendar API integration. To remember. To take out. The garbage.<\/p>\n\n\n\n<p>And tying it all together is the <strong>Universal Sass Gateway<\/strong> \u2014 a single webhook endpoint that every notification in the homelab routes through. Proxmox alerts? Through the gateway. NWS weather alerts for my county, checked every fifteen minutes like a man who has <em>opinions<\/em> about barometric pressure? Through the gateway. And then there&#8217;s Home Assistant, wired up to a Tempest weather station on the property \u2014 and when that thing detects freezing temps, a heat wave, heavy rain, or high winds, it doesn&#8217;t just quietly log it like a normal sensor. It fires a notification through the Sass Gateway so Ollama can editorialize about it first. Even Home Assistant&#8217;s own update notifications get rerouted through the gateway, because apparently my smart home isn&#8217;t allowed to tell me it needs a software update without Ollama first rewriting it in the voice of someone who is extremely done with my shit.<\/p>\n\n\n\n<p>Every single alert emerges from that gateway dripping with sarcasm and lands on my phone via ntfy with the energy of a personal assistant who is deeply tired of my infrastructure decisions.<\/p>\n\n\n\n<p>The infrastructure required to deliver a snarky push notification about freezing rain is, by any objective measure, more sophisticated than what most small businesses run. I regret nothing.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">In Closing<\/h2>\n\n\n\n<p>Is this too much? Probably. Did I have fun building it? Absolutely. Does it work? Mostly. Is the PBS root drive fine? It&#8217;s fine. Everything is fine.<\/p>\n\n\n\n<p>If you want to follow along while I break things, fix them, and occasionally yell about PostgreSQL anonymous volumes on a Wednesday night with a glass of something from Kentucky, you&#8217;re in the right place.<\/p>\n\n\n\n<p>Now if you&#8217;ll excuse me, Bourbon O&#8217;Clock fired twenty minutes ago and I&#8217;ve been ignoring it while I wrote this.<\/p>\n\n\n\n<p><em>\u2014 Dave<\/em><\/p>\n\n\n\n<p><em>P.S. \u2014 I have two R730s. The fans are fine. I said what I said.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Posted at 11:47pm on a Wednesday. There is bourbon involved.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-46","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts\/46","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=46"}],"version-history":[{"count":1,"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts\/46\/revisions"}],"predecessor-version":[{"id":47,"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts\/46\/revisions\/47"}],"wp:attachment":[{"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=46"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=46"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=46"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}