Self-Hosting Our Music: A HomeLab Adventure Begins
This post was written by Ori and Oracle, with some input from Ichika.
After posting our rant about Spotify's algorithm, we'd been thinking a lot about the ways we engage with our music. So, we figured now was as good a time as any to walk you all through our current music workflow. The apps we use, the hardware our services run on, the clients we interact with every day, everything.
We've started homelabbing for the first time, very, very recently. This has allowed us to create what we think to be a music setup ripe for optimization and automation. However, this means getting to the fun music stuff kinda requires some additional context, so while this blog post is about our music workflow, allow us to take a quick detour over into our little homelabbing journey before we get too far.
Why, and Why Now?
Now, we could've waited. Made it a Christmas gift for ourselves, maybe. But we did have a few good reasons to build one sooner rather than later:
- We wanted to build one before potential tariffs made computer hardware prohibitively expensive in a few months.
- We wanted a quick and reliable way to self-host our own media library and media streaming services.
- We really wanted a project, and we scored some pretty good eBay deals.
- Selfishly, our nesting partner was upgrading hers, and a close friend of ours was building their own, and we were just getting jealous.
We're very, very big on having an offline collection of the media that matters to us. We've written at length about the importance of preserving the things you love - especially music! - and we wanted to make keeping and hosting all of these things as easy and seamless as possible, making it a breeze to access from anywhere we want. Having a system designed to store this media, and make it easily accessible, was something we really wanted to do; up until this point, we've been relying on servers run by partners and friends to host our media, which is great for backup reasons, but made it a bit difficult to access if their servers or networks went down. We wanted more (and by 'more' we mean 'total') control over how we accessed these things.
Hardware and Software
Picking the hardware was, largely, down to "whatever the best deal on eBay I could get" was. I had a few spare parts laying around - a 500GB NVMe SSD, a 4TB HDD - so that saved a bit of cash. I knew I had a few requirements, but the real priority was getting a machine that had an Intel iGPU. Intel's iGPUs - especially their 7th/8th gen models - are very competent at transcoding H264 and H265 content, which is really useful for media servers. They're integrated into the CPU, so they don't take up space, or generate extra heat. So, after a bit of searching, we found the perfect machine for our starter use case - an old HP EliteDesk 800 G4 SFF.
This machine, at $85, came with a Core i5-8600 (with Intel UHD 630 graphics - perfect for transcoding!), 8GB of DDR4, two NVMe slots, and two 3.5" hard drive bays. The bays are a bit of a limiting factor for future upgrades, but the goal is to get as much mileage out of this machine as possible - by the time I need to upgrade, I'll probably want to just start over anyway. Good budget starter machine, but not a permanent solution by any means. I also picked up a recertified 4TB hard drive for $40, so I could run my two 4TB drives in parity. The total cost of this project was about ~$125 or so, which I'd say was a pretty good deal. (I initially also picked up an extra 16GB of RAM for about $18, but that memory ended up being faulty, so it's getting returned.)
Finding software was both easy and difficult. It was easy because we knew what we wanted to use, but it was difficult because the aforementioned "bad sticks of RAM" ended up causing all sorts of issues - Docker crashing, corrupted ZFS pools, the works. We tried using Ubuntu Server on its own, but found a lack of web UI for managing it to be a pain (and Cockpit just...wasn't for us). We tried TrueNAS, and didn't mind it, but it felt a bit limiting and required just a bit too much wrestling with to fit our needs.
We ultimately settled on Unraid, which is unfortunately a paid and proprietary product, but it has been perfect for our use-case so far. It's easy to use, and to setup, and has extensive community support and documentation. And, luckily for us, we didn't have to pay for it: our license was given to us by our nesting partner, who said, and I quote, "I have no plans to ever use unraid again ever, fuck that operating system".
Rave reviews, I know. (Please bookmark this blogpost so when I tweet something like "unraid is really starting to get on my nerves" in a year or so, every single one of you can go "I told you so".)
Regardless, Unraid has proven to be super useful for us, because we're not very well-versed in a lot of sysadmin stuff just yet, and we didn't have the energy to learn absolutely everything from scratch. We're getting the hang of Docker (and we'd already had prior experience with it and Docker Compose), and managing shares has been super easy as well. The app store has pretty much every app we've ever wanted, and within a few hours, we'd had pretty much every service we wanted up and running - a torrent client with a permanent VPN connection, Soulseek, file organizers, media streamers.
All the things we need to get started...
Hosting Our Music
This server currently houses our entire music library. It's still pretty small - 175GB or so, consisting primarily of ALAC and FLAC - but that's where it stays. Here's how we manage it, and listen to it from anywhere.
To get started, we use a few Docker containers for sharing and organizing our music.
For sharing, we use binhex-nicotineplus. This is just Nicotine+, a Soulseek client, running in a Docker container, with a VNC session running to access it via web UI. It stays pointed at our music library. There's nothing particularly important about it, but we're a firm believer in sharing our music as much as we can, so having our Soulseek share be always available to others is nice. Keep circulating the tapes, as they say.
For organizing, we use Bliss. It's set up with our particular rules to just organize file structure - put a tagged file in the Music folder, wait a minute or two, and it'll pull the metadata from the music and organize it in the folder accordingly. Bliss is super powerful, and has options for automatically pulling and assigning metadata, but we're too meticulous about our tags (for now), so we tag them all manually and just let Bliss handle file structure, which creates a very easy-on-the-eyes music folder, as seen below.
But organizing is only part of the equation. After all, what's the point of organizing all these files just to not do anything with them? Indeed, now, for the fun stuff...
Media servers!
The first, and the most obvious, is Plex. Plex is a multi-media server designed primarily for TV shows and movies, but in recent years has become increasingly powerful for music.
This is largely thanks to its dedicated music app, Plexamp, which has seen constant improvements in the past few years. Plexamp is, bar none, the best experience for listening to a self-hosted library on mobile, with a polished UI, reliable downloads, and many features built-in, such as AirPlay and CarPlay support.
Unfortunately, desktop Plexamp is...well, bad, since it's basically just a mobile UI still, and the standard Plex web/desktop app isn't the best for music listening, either.
Due to Plex being a proprietary platform, there aren't very many alternative clients either, unfortunately, so despite being very powerful, Plex is a bit hard to stick with, since we do a lot of desktop listening.
Luckily, if there's other clients we want, then we do have options, because we also host Navidrome. Navidrome is a media server focused solely on music. It's very, very lightweight, entirely open-source, and even though it does have a built-in web UI and can be used on its own, its compatibility with the Subsonic API allows for all sorts of options for clients.
For example, there's Feishin, a cross-platform desktop app with a UI reminiscent of mainstream music platforms, and this is our client of choice. There's also Submariner, an entirely-native macOS client developed by a friend of ours.
As for mobile clients, there are a plethora of options on both iOS and Android. So far, however, our two favorites have been Amperfy, which also has a macOS app, and Arpeggi, which is currently in beta, but is aiming to offer a very native-feeling app. Both of these clients are good, but fall flat in their own ways, whether that's responsiveness or UI design. They're still solid options, though, and Arpeggi especially looks really promising.
There are still some glaring issues with both Plex and Navidrome, however; notably, they both absolutely suck at handling multiple artists. According to some GitHub posts posted in late November, Navidrome should be receiving a major refactor before the end of the year that properly handles multiple artists (both duplicate tags and separators), but as of right now, implementing them at all still feels kind of hackjobby. Hopefully these updates come soon, because we're not happy with the current state of our library & metadata.
The End, For Now
Now, that's pretty much our entire setup. However, we still think there is room for improvement, especially if automation is on the table.
One of the real kickers is that with a system like this, we still have to do a fair amount of work manually. We download the songs ourselves, from the sources we pick, and hand-tag a lot of our music. If we really wanted to, we could automate a lot of this using tools like Lidarr for grabbing music and MusicBrainz Picard for automatic tagging, but that would require a kind of critical reassessment of how we handle metadata, especially after we hand-tagged everything earlier this year. We're not entirely sure what we're going to do, but we are looking into further automation. Being able to just search and add a song or album to our library in just one or two clicks would be awesome, but I think that's going to take a bit of work and experimentation to figure out.
We also looked at potentially using a VM to sync our iPod directly and automatically on the server instead of doing it over SMB on our desktop, but gave up on that idea pretty quickly. Once we get more RAM in the server again, though, we'll probably look at it again. Right now we just use Foobar2k with some plugins.
If we ever have any meaningful developments in the future, you can be sure we will write about them. We are also always looking for suggestions, pointers, and helpful tips, so feel free to ping us on one of our social media accounts if you have feedback!
We don't normally do this, but it's the holiday season, so we feel a bit less bad about it; If you enjoyed this post, or any of our other posts, please consider supporting us over on our KoFi page! <3
Until next time.
Digital Stars out.