Overhauled homelab

Source: timharek.no
24 points by zk a day ago on lobsters | 7 comments

I started this “blog-series” to force myself to write more about my set up, and my continuous iterations. But it didn’t happen… until today! This post has been a long time coming, and I have kept the ideas in my head and notes.

I will walk through everything I did, in order:

Previous setup

Two years ago, I revamped my homelab. I had just bought a new machine to use as my main home server, coming from a 9U server rack with a bunch of machines tangled together. Back then I finally sat down to figure out how I want things. And it has worked great… until it hasn’t.

The new machine back then, a Zimaboard, was set up with NixOS, which seems excellent and worked perfectly until I wanted to do a basic cronjob for backups. I never figured out how to do that, so I basically did my backups manually whenever I had the time. I use Restic, which is awesome.

Network situation

We have a 750/750 Mbps fiber-connection with Bergen Fiber (Altibox), which is more than enough for our needs. It’s a very reliable connection, never slow, absolutely no complaints about the connection.

Earlier this year we moved to a house, where we own the whole thing, it’s amazing! But the network situation wasn’t great. Not a single Ethernet port in the whole house, except where the fiber and modem were located. And guess where that’s located!? Beside the door to the balcony, where the previous owner used to have their TV (we have made a separate TV room). One thing to note, there was a bunch of phone lines throughout the house, and we’ll get to those later.

A white Maine Coon cat sitting on a wall-mounted feeding shelf, with the old router, Zyxel modem, power strip and a tangle of cables on the floor underneath.
My previous setup, underneath the cat's feeding station.

As you can see, not an ideal placement, especially after we found out that it was the perfect location for the cat to have his food, away from the dog.

Another thing that I particularly didn’t like about the Zimaboard setup I had done, was that I chose to install NixOS directly on the onboard flash storage. Whenever I tried to upgrade the NixOS version, I ran into issues with having enough space. I had to do a bunch of clean ups and micro adjustments every fucking time to get it to work.

My networking situation was fine after moving into the new house, but I was unable to get WiFi in the garage. The coverage seemed fine, but it wasn’t ideal outside or in the TV room. I don’t think having the router on the floor was the best spot, but I didn’t want to mount the thing on the wall of the living room either.

All the WiFi came from an ASUS RT-AX92U router, which worked pretty well, especially on the second floor where it was located. But it was a whole different story on the first floor, and outside.

What I self-hosted

For all my ripped media, TV shows and movies, I used Jellyfin, which is so good, it just works. I also used Jellyfin for audiobooks with a great iOS app, plappa. And for all my Linux ISOs, I used qBittorrent. It runs great as a headless torrenting client, and there’s also a great iOS app for it, qRemote.

I also had a bunch of small Docker containers, for Foundry and some personal projects.

And I used to self-host Nextcloud, but it became cumbersome and just a hassle to maintain. It was bloated for my use-case.

Networking

I bought Ubiquiti UniFi gear, specifically:

  • UCG Ultra
  • U7 Lite access points x3
  • PoE-injectors

I also bought a fresh roll of Ethernet cable, 500 meters, and tools to make my own cables.

UniFi has a lot of respect from homelabbers, and for good reason. It’s not (F)OSS, but it’s excellent hardware with no subscription and no account required to use it.

All the UniFi networking gear unboxed on the floor: a UCG Ultra, U7 Lite access points, a bag of RJ45 connectors and strain-relief boots, and a coil of Ethernet cable.
The easy part: unboxing all the new gear.

Buying all the equipment was the easy part, putting it all together, oh man, it was a totally different ordeal.

Fiber adventure

One of the first things I thought about when we bought the house was to move the fiber inlet and modem to the attic, so that it could be out of the way and not be an eyesore. I politely asked my local ISP, Bergen Fiber, if they could do it for me, or if they could provide me with a 5 meter fiber-cable SC/UPC. They said yes to providing me with a cable, and when I followed them up via email asking what I needed to do for them to send me the cable, they replied via SMS that they couldn’t 🙃. They could send me a 2 meter cable though. So I asked around, and spent some time looking for the specific cable online. Most of what I found was the wrong length or way too expensive for a short cable. I managed to find one, from a B2B company that is 5 minutes away from where I live. I asked a plumber-buddy of mine that shops there if he could pick up the cable, and he did for 32 kr (~ $3).

Wiring

Besides the fiber cable looking adventure, I had to wire up the whole house, especially for my new access points. I needed cables going from the attic to the living room, downstairs hallway, and to the garage in a separate building. In addition, I wanted Ethernet in my home office and TV room. How hard can it be?

I asked a buddy of mine to help out figuring out the locations for all the things, and helping me pull cables. I told him it would take a few hours. We spent six hours, and he had to go home, I continued for three more days after that. I thought it was going to be easy…

We started by moving the fiber and modem, which was easy, made a 42 mm hole in the wall from the attic and pushed a conduit down the wall to the living room, then we pulled the fiber. Worked like a charm!

Then we made a hole in the middle of the ceiling in the living room for the PoE access point, that also was easy.

But then came the hardest part, going from the attic, down two floors, without any existing conduit. Like I mentioned, there were phone cables throughout the house, but none of them were wired up, and the conduit didn’t lead anywhere near the attic. We spent the majority of the initial day pulling on the phone cables to figure out where they went and how we could get the wires from the attic. I ended up making a hole above a phone connection box in the living room, so that I could pull conduit from the attic down to the box. Because this box lead to the first floor, in the entrance.

Looking down into a cramped attic corner lit by a work light, with wooden rafters, a sheet-metal plate and a Ryobi cordless drill, while locating the top of an interior wall.
Finding exactly where the wall lined up, from up in the attic.
An attic floor of paper-faced insulation and wooden joists with a drill, a red cable-pulling reel, ear protection and a tape measure scattered around a spot being drilled.
Making holes and fishing cable down through the wall.
A living-room wall down by the floor with two openings: a freshly drilled round hole and an old blue phone junction box exposed under torn-off wallpaper, with a wall-mounted network keystone jack near the skirting board.
The hole I made above the old phone connection box in the living room.
Close-up of the two wall openings: on the left a round hole exposing a corrugated conduit, on the right the blue junction box with twisted-together phone wires.
Pulling conduit from the attic down to the phone box.

And the actual cable-making? What a fucking mess that was. I knew there was an order to do things in, but the ones I bought, had no documentation, so I just relied on the internet to figure out the order. It took me two hours to get a working cable, because I didn’t notice there was another transparent plastic bag within the transparent plastic bag with “guides” for keeping the twisted pairs in order. I only realized that when I read the bad reviews. I used a super simple cable tester to check that I made the cables right, it was a super worthwhile thing to buy, it would have been a headache without one.

Wiring the garage

My original plan was always to wire Ethernet to the garage, but I didn’t know how to do it. I knew there was conduit going from the house, but I had no idea if there was a room for an Ethernet-cable. Luckily, I found a cut telephone-wire in the garage coming from a yellow conduit, which was the same color as the conduit in the entrance where I had already wired the first floor! I was certain it was the same conduit, so I started pulling the cable to see if it moved the cable from the house, but nothing happened. I did all sorts of shenanigans to make the cable move, but it didn’t flinch, not one bit. I ended up ruining the insulation of the wire, that was how tight it was stuck.

A garage wall where a red conduit and a smaller yellow conduit run along the concrete blocks, with a black fibreglass rod fed through and a stuck telephone wire, cleaning supplies on a shelf nearby.
The old telephone wire, stuck solid in the garage conduit.

By pure coincidence, I found the old coax and telephone box still attached to the house outside. I opened it up, I loosened all the wires from the contraption, and followed the cables down the conduit on the outside of the house. Lucky for me, the ground outside is gravel, so I just started to dig. And what do you know, I found the fucking conduit, in fact, I found three! One for the house, one for the garage, and one for what I think is the previous ISP/telephone company. I just cut them all, and pulled them out. And now the telephone-wire in the garage came loose like nothing.

An old grey telephone junction box mounted on a rendered exterior wall, opened to reveal a bundle of colourful phone wires, with a grey cable running down from it.
The old coax and telephone box I found still attached outside.

I pulled the cable from the house through the conduit and into the garage’s conduit, and voila! We have Ethernet in the garage!

Outside at ground level where the gravel has been dug away from the house foundation, exposing a black cable and a yellow conduit disappearing into the ground.
Digging along the foundation, and finding three buried conduits.

The new server

I managed to get my hands on a huge HPE DL380 Gen10 server as decommissioned hardware. It has two dedicated Intel Xeon CPUs and 288 GB RAM. I got 16x 600 GB enterprise 10k RPM HDDs, I haven’t put in the last 8, but it’s on the to-do list! The 8 that are put in are in RAID6, so I have two that can die before I have to switch them out.

        _,met$$$$$gg.          tim@hailmary
     ,g$$$$$$$$$$$$$$$P.       -------------
   ,g$$P""       """Y$$.".     OS: Debian GNU/Linux 13 (trixie) x86_64
  ,$$P'              `$$$.     Host: ProLiant DL380 Gen10
',$$P       ,ggs.     `$$b:    Kernel: Linux 6.12.94+deb13-amd64
`d$$'     ,$P"'   .    $$$     Uptime: 3 days, 2 hours, 42 mins
 $$P      d$'     ,    $$P     Packages: 406 (dpkg)
 $$:      $$.   -    ,d$$'     Shell: bash 5.2.37
 $$;      Y$b._   _,d$P'       Display (VGA-1): 1024x768 [External]
 Y$$.    `.`"Y$$$$P"'          Terminal: /dev/pts/0
 `$$b      "-.__               CPU: 2 x Intel(R) Xeon(R) Bronze 3204 (12) @ 1.90 GHz
  `Y$$b                        GPU: Matrox Electronics Systems Ltd. MGA G200eH3
   `Y$$.                       Memory: 8.58 GiB / 267.31 GiB (3%)
     `$$b.                     Swap: 22.89 MiB / 127.66 GiB (0%)
       `Y$$b.                  Disk (/): 955.36 GiB / 3.10 TiB (30%) - ext4
         `"Y$b._               Local IP (eno4): 192.168.1.23/24
             `""""             Locale: en_US.UTF-8

My initial plan was to have this server in the attic beside the fiber/modem and router, but after firing the machine up, I quickly realized that I would be able to hear the machine through the ceiling. Good thing I have plenty of room in the garage’s loft.

I never measured the power draw before and after, and honestly it’s not a big concern for me, electricity is fairly cheap here in Norway.

The machine is named hailmary, after the ship in Project Hail Mary. If you look at the neofetch above, you’ll notice it has a butt load of RAM, 288 GB, and I’m barely using any of it. I still have to figure out what to do with it all. I’m thinking about getting a GPU for the server, for running local LLMs on it.

A rack server lying flat on a plywood floor in the garage loft, with a Samsung monitor, an RGB-backlit mechanical keyboard and a gaming mouse set up on top of it.
The ultimate server setup: straight on the garage loft floor.

The new setup

Before setting all this up, I moved over everything I wanted to keep from the Zimaboard: all my media (movie and TV show rips, audiobooks), and my photos.

For the first time in my self-hosting career, I have a fucking dashboard for all the stuff that I have!

A dark Glance dashboard listing self-hosted services grouped as Local (Mesh) and Public (NetBird), Dokploy, Jellyfin, qBittorrent, Beszel, Immich, Linkding, Grafana, Uptime Kuma and Syncthing, all showing green OK status with response times, plus a Bookmarks section.
My first-ever homelab dashboard, running Glance.

Let me walk you through everything!

Debian

After having used NixOS for the last two years in my homelab, I wanted to go back to what I know. I could have used Ubuntu server, but I wanted to keep it as minimal as I could, but still familiar.

And remember the cronjob I never managed to set up on NixOS? On Debian that’s just boring, reliable cron again, the tooling is no longer the thing standing between me and automated backups (more on that in What’s remaining).

Dokploy

This is where I throw all my Docker related stuff. We started using this at work recently, so it’s also an excuse to get myself more familiar with how everything works.

It’s useful having a dashboard for all the Docker related stuff for checking if something is running, how resources are being used, or if something is just stuck. I can do this now both in the browser, but also still using the Docker CLI, even from my own machine using Docker context.

Media

Jellyfin

The home of all my media, except photos. Like before, I use it for all my ripped media, TV shows and movies, but also my DRM-free audiobooks. I think the current setup here is a bit of a downgrade in comparison to the Zimaboard because of video-encoding, but I might fix that with a GPU in the server.

Immich

I thought I would be fine without having a dedicated app for all my photos, but I saw that I had space on the server, and more than enough resources. I have heard so much about this piece of software that I had no excuse to not give it a try. It’s really cool, and it’s fast!

Files

I have used Syncthing before, but only between my phone and laptop. Now both my laptop and phone syncs to the new server instead, because it’s always up and available. It’s a sync-server that always — and I mean always — just works.

Monitoring

This time around I’m doing stuff differently, I have monitoring now. But I don’t just have one app/service for that, I have three!

  • Uptime Kuma, for checking the uptime of my stuff.
  • Beszel, for monitoring the server(s) itself (themselves).
  • Grafana + Loki, for having all the logs for everything in one place.

Miscellaneous

qBittorrent

For all of my Linux ISOs. It runs great. I don’t want to keep checking my qBittorrent progress, I just want to know that my Linux ISOs are downloading to the correct location.

Linkding

I have been using Linkding for the last five years, and now it was finally time to have the data on my own machine. It’s the best bookmarking software I have used. I use it daily, and it’s the source of all my links in my monthly posts.

Mesh VPN

After I first heard about NetBird from Jan-Lukas, and that they have a first-party reverse proxy, I had to give them a try. They even have email/password login, no more tying myself to big tech!

I know there are security implications of exposing services via a reverse proxy, so I only expose ones I trust to have good security in the first place. I don’t want to run every little thing I host on a VPS, so NetBird is very convenient when I need to share something with family or friends.

Final result

Like I mentioned in Network situation, our connection is excellent, but now the WiFi-coverage is also excellent. Both floors and the garage have around 700+ Mbps on WiFi! And going from an ASUS router to a Ubiquiti router, wow, what a difference! The UI/UX feels like they want me to use the thing, and doesn’t expect me to look up how to do stuff.

I haven’t done anything with VLANs or network segmentation yet, but it’s something I might play around with in the future now that I have the gear for it.

Remember all the holes I made? Because I have a 3D-printer, I could just fix the holes without doing any painting!

The same section of wall with both holes now covered by flush white circular caps.
Patched up with 3D-printed covers, no painting required.

There’s still some work to do with tidying things up, but it works now. And the mess isn’t visible unless you move stuff around.

A ceiling corner in the entrance where a blue junction box has several Ethernet and phone cables coming out, feeding a UniFi PoE adapter and a small switch hanging loosely against the wall.
The still-janky junction in the entrance, it works, but needs tidying.

And now everything is perfectly cable-managed in the attic!

A dimly lit attic with a network switch and a Zyxel modem sitting on a board, surrounded by a tangle of loose white, red and black cables running across the floorboards.
"Perfect" cable management in the attic.

I’m super happy with how all the access points turned out!

A white UniFi access point with a glowing blue status ring mounted on a hallway ceiling, next to two framed landscape photographs. A white UniFi access point with an illuminated blue ring and the Ubiquiti logo, mounted on the living-room ceiling beside a smoke detector. A white UniFi access point mounted on a garage ceiling, with fluorescent tube lights and the garage door track in the background.

The access points: hallway, living room, and finally the garage.
The tidied entrance corner: a wooden wall-mounted cat feeding shelf with a bowl and an automatic feeder, above a power outlet and a small white fibre-termination box with a yellow patch cable.
The new setup, same cat station, far less cable chaos.

What’s remaining

I have now let my new set up soak (Wikipedia) for the last three days, so next up on my list is to turn my old Zimaboard with the HDDs into a backup machine using scheduled Restic jobs. It’ll be named blip-a, since it will be a foreign entity to the hailmary, a separate backup machine (if you know, you know).

And I need to add the remaining 8 HDDs to the server, or maybe not all of them, might be good to have some as a backup.

But for now, I’m just happy it all works. This overhaul was way more involved than I expected when I started, and I learned a ton along the way. Got a homelab horror story about pulling cable through walls, or a service I’m missing? Reply via email, I read everything. See you in the next Kaizen!