PLEXodus: Rebuilding My Media Server With Jellyfn

This was supposed to be a pretty basic article detailing my process of switching my media server away from Plex and over to Jellyfin. The process of switching the server itself was super simple: I already had my media libraries set up, already had an instance of Jellyfin available (just disabled and unused), and am quite familiar with what's going on with my NAS and home network so the remaining handful of tasks to fully switch everything over were pretty simple to complete.
What I had not factored in was the process of setting up remote access to my media server for my parents, which led me down several interconnected rabbit holes for tools and services I was generally aware of and had largely planned to toy around with in the future. Most of this was not particularly necessary in order to get Yellowstone to stream to my dad's TV, but had a lot of benefits for usability, organization and security while also turning into a fun (and occasionally wildly frustrating) learning experience.
I had been a Plex user since somewhere around 2017 and have been increasingly annoyed with the direction it had been going in the last couple of years. Despite offering a free tool, Plex is a business and makes decisions accordingly. That means they need to generate revenue. This is expected and perfectly fine, provided the usability and functionality of the core media server tool was relatively untouched and continued as expected. However, features started to trickle in to my server that were becoming annoying - namely:
- The push for their own ad-supported streaming content, which I completely disabled.
- The push to become a hub for all of a user's streaming services, which is extra annoying because Plex clients are already apps installed on the devices that already run all of my streaming services. Netflix is already on my Shield.
- The mobile app redesign.
- Bonus gripe: Downloads still don't really work.
- The increasing cost of the Plex Pass and the overall enshittification of the service as they move towards more of a SaaS model.
I stopped using my Plex instance last April after remote access was disabled for non-Plex Pass users (although it does look like Remote Access is now available as a subscription). The Plex Pass itself also had a major price hike. I was always on the fence about it, especially at full-cost. I only run my server for me and my parents. Hardware transcoding probably would have been nice, but I never noticed many issues, especially since picking up an NVIDIA Shield and getting it connected through my stereo receiver to handle audio. If I'd managed to pick up a dirt cheap Plex Pass during one of the sales years ago, I'd probably still be using Plex.
I bought my 2017 NVIDIA Shield for a dollar. It was buried in a pile of miscellaneous cables and PC parts in a local estate auction. I happened to click on the listing and flipped through the image to notice a suspiciously angular black box in one of the photos and placed a winning $1 bid alongside bids for a few other lots. It had the power cord and controller cord but was missing the controller and remote. I dusted off my Logitech Harmony hub and remote and got it linked up the the Shield without any issues. As a pleasant bonus, I ended up with a handful of useful cables and adapters, and was able to sell a few other items for well over the few bucks I paid for everything.
More recently I had my "oh fuck off Plex" moment and completely deleted my server and account. I happened to check Plex and was greeted with this frankly insulting message.

Why the fuck would anybody agree to that? That was the nail in the coffin for my career as a Plex admin.
So we're all-in on Jellyfin. As mentioned, I already had an instance active, but a fresh install is basically:
- Set up Docker container
- Start Docker container
- Point Jellyfin at media folders
- Fiddle with a few settings
- Install Jellyfin apps on my TV clients
- Watch Yellowjackets
- Be made to feel uneasy
- Continue watching Yellowjackets
- What the fuck is up with the woods?
- Repeat step 6 with other shows
The issue is remote access. Plex handles all of this for you. Set up your server, maybe open a single router port, share it and you're good to go. Sharing externally and accessing your library remotely Just Works™.
With Jellyfin, it's all up to you. Such is the cost of FOSS.
Easy Mode
Easy mode is to use Tailscale. I've already been using it for a while and love it. Install Tailscale on my NAS, then install Tailscale on a remote PC, and suddenly the remote machine thinks it's on my home network and can access Jellyfin as such.
For my parent's house, I've reconfigured my old Zotac AD11 HTPC (with a blazing 4GB of RAM) with Debian and Tailscale, and will install it at my parents' house then use the subnet router function to make their smart TVs think they're on my home network.
I have not installed the HTPC yet, but don't really expect any issues. Then again, I've never used the subnet router function so who knows.
Medium Mode
- Create a free Oracle Cloud VPS account
- Create an Ubuntu Server virtual machine
- Install Pangolin as a reverse proxy/tunnel server
- Connect Pangolin to my server
- Connect my domain to Pangolin via Cloudflare
- Point Pangolin to Jellyfin and configure remote access
- Sign in to Jellyfin at my parents' house
- Use the Jellyfin Quick Connect feature to sign in to the Jellyfin apps on their TVs
- Let my dad fawn over Kevin Costner.
Hard Mode
Hard mode, which is obviously what I did, is:
- Create a free Oracle Cloud VPS
- Repeat Step 1 in Medium Mode
- Make a complete mess of my Oracle account
- Abandon, wait for account to be removed so I can make a new one and try again
- Decide to set up a reverse proxy
- Set up Nginx Proxy Manager
- Decide I'm too much of a n00b to safely open ports
- Get scared, abandon
- Decide I now want tidy local domain names instead of IP addresses and Ports
- Realize I'm going to need NPM
- Set up Nginx Proxy Manager again
- Purchase a domain for just in-home services
- Set up the new domain with Cloudflare for safe access
- Notice a bunch of bots from Western Europe probing around, mostly trying to hit WordPress page paths
- Block all non-Canadian traffic
- Set up any and all other security measures on the free Cloudflare plan
- Realize I'm going to need NPM
- Need a DNS service for local domains
- Set up Pihole, which has been on my list forever as a very low priority
- Decide I'm this far so I might as well set up network ad blocking
- Point my router at my Pihole
- Destroy my internet connection for an hour
- Panic
- Fix
- Set up a backup Pihole
- Set up a service to sync them
- Set up tidy local domains
- Realize that since NPM is still exposed to the internet
- Decide to install single sign-on and authentication
- Install Authentik
- Realize that I need an email server
- Set up a free Mailgun account
- Integrate with domain name
- Realize I've locked myself out of this website
- Integrate Mailgun with website
- Successfully reset password
- Spin up Authentik
- Get Authentik roughly configured with: 2FA, 2fa time periods, CAPTCHA bot detection and Forgotten Password emails
- Connect to conveniently recently made Mailgun account
- Pull hair out trying to get email to work
- Forgotten Password emails magically work a few days later
- Realize NPM has rules for local vs external access
- Apply rules
- Keep Authentik anyway
- Set up tidy domain names for several services
- Start to reconfigure other services to point back at each other via domain names
- Realize some services are problematic
- Also realize that I don't really care about a tidy domain name for qBittorrent
- An update breaks NPM
- Remember that this is why we disable auto-updates on important services.
- Scramble to fix.
- Roll back version to fix. Figure out roughly to do the fix, but decide to stick with the older version until a permanent fix is available because I am a Linux command line novice.
- Get email from Oracle Cloud that account has been deleted (which was requested)
- Realize Oracle probably isn't letting me create another free account
- Curse failures
- Make note to try again later
- Consider buying a VPS
- Will probably not bother
- Try again later
- Different address, different email, different credit card, different IP address and location via a VPN: no dice.
- Give up.
- Realize Oracle probably isn't letting me create another free account
- Provide fiancée with access to some services
- Assume she will not use them
- She notes that the internal wiki would be nice to use.
- Set up Jellyfin to use tidy domain name
- Still use Tailscale for parents
- Watch Yellowjackets
- Be made to feel uneasy
- Continue watching Yellowjackets
- Repeat step 11 with other shows
And it's just THAT easy.