DEV Community

Cover image for Self-Hosted Streaming with Jellyfin and ngrok – A Personal Weekend Project
Cyril Sebastian
Cyril Sebastian

Posted on • Originally published at tech.cyrilsebastian.com

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, I could securely share access with family and 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
Enter fullscreen mode Exit fullscreen mode

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.tgztar -xvf ngrok-v3-stable-linux-amd64.tgzsudo mv ngrok /usr/local/binngrok version
Enter fullscreen mode Exit fullscreen mode

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

ngrok config add-authtoken <YOUR_AUTH_TOKEN>
Enter fullscreen mode Exit fullscreen mode

Create a Tunnel for Port 8096

ngrok http 8096
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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, and logs) in a low-stress, real-life scenario.

This Jellyfin + ngrok combo was a less than an hour-long weekend project, but the satisfaction of 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

Top comments (0)