My self-hosted media server set-up

My self-hosted media server set-up

#0005



This is a quick write-up of the software stack I use to run my self-hosted media server. I plan to eventually publish tutorials on setting up and installing each of these individual components, although there should already be plenty of information online on how to do that.

Admittedly, this is a fairly rudimentary setup as media servers go. The sky is truly the limit when it comes to options for customization and automation, but this meets my needs without too much fuss or overhead.

The Stack

Component Software / Service
Operating SystemLinux Mint Cinnamon
Media ManagementSonarr, Radarr, Jellyseerr
Usenet ProvidersFrugal, Newsdemon
Usenet IndexersNZB.life, NZBGeek
Download ManagerSABnzbd
Media ServerJellyfin
Playback ClientsJellyfin for Android, Jellyfin for Android TV, Jellyfin Web UI
External AccessTailscale

Why Usenet?

I use Usenet for downloading media. I'll eventually make a post about this as well but in short, there are a few reasons I settled on Usenet over torrents:

  • Download speeds tend to be consistently higher, often exceeding 200 Mbps.
  • Even on private indexers, there are no ratio or seeding requirements, because seeding is not needed.
  • Private indexers tend to be easier to join and cheaper, especially when purchasing during sales.
  • Older files have better availability, as the majority of Usenet files are compressed with a recovery record.
  • Obscure media tends to be more readily accessible.
  • Assuming you use SSL, your ISP cannot see which individual files you are downloading, even without a VPN.

Disclaimer: Be mindful not to accidentally violate your local copyright law when automatically downloading files from P2P file-sharing services. The movie I'm downloading for example purposes is in public domain, but to be cautious I'm censoring the media shown in the screenshots below.

How It All Works

  1. The user requests media in Seerr, which forwards the request to Radarr (movies) or Sonarr (TV/anime).
  2. Radarr/Sonarr searches the indexers for the requested media using RSS or API calls. If found, the .nzb (or torrent) file is sent to the download manager. If not found, the request is added to a watchlist to be monitored and downloaded once it becomes available.
  3. SABnzbd downloads the file from Usenet through the providers and reports the download status back to the media managers. Failed downloads trigger a search for an alternative file; completed downloads are referred for processing.
  4. The media managers restructure the file architecture and rename files so they can be properly indexed by the media server. Jellyfin is particularly fussy about file naming conventions, so this is arguably the most time-saving step. Once renamed, the file is moved to whichever directory Jellyfin serves from.
  5. Jellyfin detects the new file, identifies the media, downloads any missing metadata, subtitles, and poster art, and indexes it. The file is now available for playback on your client of choice.
  6. I use Tailscale to create a VPN accessible only by my own devices, so I can reach the server from external networks without exposing any individual service to the open internet. Jellyfin handles transcoding and can throttle quality based on your client's download speed.

The net result is a self-hosted, Netflix-style streaming experience that works on any of my devices—at least any with a web browser or a modern version of Android. Finding new media is as simple as doing a quick search in Seerr's web UI and letting the automation handle the rest.

Webmentions