# 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](https://jellyfin.org/) — 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.

```bash
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`](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

```bash
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](https://ngrok.com/) to get an auth token. Then:

```bash
ngrok config add-authtoken <YOUR_AUTH_TOKEN>
```

### Create a Tunnel for Port 8096

```bash
ngrok http 8096
```

Boom! You’ll get a public HTTPS URL [`https://abc123.ngrok.io`](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:

```bash
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:

```bash
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](https://hashnode.com/@cyrilsebastian) or connect via [LinkedIn](https://linkedin.com/in/yourprofile), I’m always happy to connect and geek out about self-hosting and home lab fun.

Happy streaming! 🎥🍿

---

ImageCredits: Photo by [Marques Kaspbrak](https://unsplash.com/@popcornmatch?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash) on [Unsplash](https://unsplash.com/photos/black-flat-screen-tv-turned-on-on-brown-wooden-tv-rack-n1amn-SHKzw?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash)
