Skip to main content

Command Palette

Search for a command to run...

Self-Hosted Streaming with Jellyfin and ngrok – A Personal Weekend Project

Stream your personal movies and family videos across devices using Docker, Jellyfin, and ngrok, straight from your desktop.

Updated
4 min read
Self-Hosted Streaming with Jellyfin and ngrok – A Personal Weekend Project

It all started with a simple need — I wanted to watch some old movies and personal family videos stored on my desktop. My niece had also backed up a bunch of vacation clips from her phone onto my machine, and now that she’s back home, I needed an easy way to send them back to her without juggling USB drives or cloud uploads.

Being someone from a DevOps/SRE background, these small personal needs often spiral into fun infrastructure experiments. So, I figured, why not use this as a chance to self-host a media server?

That’s when I turned to Jellyfin — a free, open-source media streaming solution. Paired with ngrok securely sharing access with family, I now had my very own private “Netflix” running directly from my Linux desktop. This was one of those side projects that started as a practical fix but turned into an unexpectedly enjoyable weekend build.

In this post, I’ll walk you through exactly how I set it all up using Docker and ngrok — clean, simple, and DevOps-style.

📌 Why Jellyfin?

As someone who values open-source tools and self-hosted alternatives, Jellyfin hits the sweet spot:

  • Fully open-source

  • No telemetry or licensing headaches

  • Supports local media, subtitles, transcoding, and even user profiles

I had a folder full of personal and family videos collecting digital dust. Jellyfin gave them a Netflix-like interface without the surveillance.


🐳 Step 1: Run Jellyfin in Docker

To keep things clean and reproducible (DevOps mantra!), I went with Docker.

docker run -d \
  --name jellyfin \
  -p 8096:8096 \
  -v /home/user/Documents/p2p:/media \
  jellyfin/jellyfin

A few things to note:

  • -d runs it in the background

  • Port 8096 is Jellyfin’s default web UI

  • The -v mount points my local media directory into the container at /media

Once the container spins up, hit http://localhost:8096 on your browser and follow the setup wizard. You’ll be able to:

  • Create an admin account

  • Add your media libraries

  • Configure transcoding and user access

Simple and smooth.


🌍 Step 2: Access Jellyfin from Anywhere Using ngrok

Since I didn’t want to mess with router port forwarding or dynamic DNS at home (and certainly not expose ports to the internet unsafely), ngrok was the perfect plug-and-play solution.

Install ngrok

wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.tgz
tar -xvf ngrok-v3-stable-linux-amd64.tgz
sudo mv ngrok /usr/local/bin
ngrok version

You’ll need an ngrok account to get an auth token. Then:

ngrok config add-authtoken <YOUR_AUTH_TOKEN>

Create a Tunnel for Port 8096

ngrok http 8096

Boom! You’ll get a public HTTPS URL https://abc123.ngrok.io that tunnels securely to your local Jellyfin instance.

Bonus: Protect it with Basic Auth

To prevent unauthorized access, use basic auth:

ngrok http -auth="username:password" 8096

Replace with your credentials. Now even if someone stumbles upon the link, they’ll need to authenticate first.


📦 Alternate: Run ngrok in Docker

If you like consistency (like me), you might prefer running ngrok in a container too:

docker run -it \
  -e NGROK_AUTHTOKEN=<YOUR_AUTH_TOKEN> \
  ngrok/ngrok http 8096

Optional: include -auth="username:password" in the command above if you want the same security via Docker.


🔒 A Quick Word on Security

This setup is intended for personal use. If you're planning to stream across multiple users or set up a family server, consider:

  • Running Jellyfin behind a proper reverse proxy (like Nginx)

  • Using a free domain with Let's Encrypt certs

  • Disabling public tunnels when not in use

  • Not exposing write access to the mounted media directory (read-only is safer)


🎯 Real-World Use Cases

  1. Personal Netflix Clone – Watch your ripped DVDs or archived home videos from anywhere.

  2. Test Media Playback Over Slow Networks – Useful if you’re tuning transcoding profiles for a home server.

  3. Portable Demos – Great for showing media apps at meetups or events without deploying to a cloud server.

  4. Media Backup Viewer – Remote preview of a NAS or cold storage drive contents.


🧠 Final Thoughts

For anyone in DevOps, self-hosting isn't just about saving money. It's about owning your stack, learning through tinkering, and reusing familiar tools (like Docker, tunneling, logs) in a low-stress, real-life scenario.

This Jellyfin + ngrok combo was less than an hour-long weekend project, but the satisfaction it gives — seeing your own media beautifully indexed and remotely accessible — is real.

Give it a try. This might just become your favorite side gig for relaxing after a long sprint.


If you found this helpful or tried something similar, I’d love to hear about your setup, tweaks, or war stories. Leave a comment on Hashnode or connect via LinkedIn, I’m always happy to connect and geek out about self-hosting and home lab fun.

Happy streaming! 🎥🍿


ImageCredits: Photo by Marques Kaspbrak on Unsplash