Atlas - Hosting your own mediaserver
Building a Mediaserver
A mediaserver is kind of the hello world project of the self hosted world for many homelab enthusiasts. My goal was to build a reliable, fully automated and accessible from anywhere. The final result looks like the following:

The Stack
- Jellyfin: the frontend media server and player
- Jellyseer: the media request management, allowing my friends and family to request new medias
- Sonarr / Radarr: respectively the automated TV shows and movie management
- Prowlarr: manages the different indexers that allows radarr and sonarr to search easily across multiple sources
- QBittorrent: the download client, wired into the arr stack. All QBitTorrent traffix is done through a VPN tunnel.
The flow is entirely hands-off. Users can add movies or shows they are interested in. Radarr / Sonarr will search for it across its configured indexer, grabthe best matching release and download it via QBittorrent, before processing it. This new media will be picked up by Jellygin in the next library scan, and display it for viewing.
Remote Access via Headscale
Rather than exposing my Jellyfin instance through the Internet, I wanted to allow remove access through a local VPN. I initially used Wireguard, but that was a bit too technical for my family and friends. I then moved to Headcale, a self-hosted implementatio of the Tailscale control server, creating a private mesh network. The attack surface is then minimal, since there are no open ports, no reverse proxy to harden, no authentication layer to manager.
Ongoing improvements
Although the current setup works great, here are some future work I would investigate:
- Check out Cloudlare reverse tunnels as an alternative for the remote access. I think it might be easier to use for my family, since they won’t need to remember to activate the VPN anymore. However, these tunnels work by handling an outgoing connection from the homelab to a cloudflare server, which can be unstable and break.
- When a media codec is not supported by a client device, Jellyfin has to transcode it on the fly. A good solution for that would be to integrate tdarr in the stack, a transcoding tool from the arr suite. This would also help compressing some extremely large movies.
- Languages and subtitles management. My girlfriend likes to watch movies in spanish, and my sister in french. It turns out that grabbing the correct release and matching with the correct subtitles can be tricky, specially since some releases starts at different “timestamps” of the movie, or might have some added / deleted scene.
- Check out usenet as a complementary approach to torrenting.
A note on legality and morality
It turns out downloading and streaming medias, including from illegal sources, is tolerated in Switzerland. However, seeding is illegal. I fully understand the argument stating that it is stealing intellectual properties and hurting small and independent film making. On the other hand, the streaming world has become extremely unfriendly for users, where you need to subscribe to many different services, each one increasingly expensive over the past years.