Media Server

Jellyfin and Emby Setup Guide

Use Jellyfin or Emby as a free or low-cost alternative to Plex for serving VOD content to your IPTV customers.

4 min read
Published February 12, 2026
Updated March 1, 2026
18 views
jellyfin
emby
media-server
vod
open-source
streaming

Jellyfin and Emby Setup Guide

Jellyfin and Emby are media server platforms similar to Plex but with different licensing models. Jellyfin is fully open-source and free, while Emby offers a free tier with a paid Premiere option. Both can serve VOD content to your IPTV customers.

Jellyfin vs Emby vs Plex

Feature Jellyfin Emby Plex
Cost Free (open-source) Free tier + Premiere (paid) Free tier + Plex Pass (paid)
User management Built-in, no account limit Built-in Requires Plex Home/Friends
Hardware transcoding Free Premiere only Plex Pass only
Client apps Web, Android, iOS, Roku, Fire TV Web, Android, iOS, Roku, Fire TV Broadest device support
API Full REST API Full REST API HTTP API
Self-hosted Yes, always Yes Yes

Recommendation: Use Jellyfin if cost is a priority and you want full control. Use Emby if you prefer a slightly more polished UI. Use Plex if your customers are already familiar with it.

Installing Jellyfin

Ubuntu/Debian

curl https://repo.jellyfin.org/install-debuntu.sh | sudo bash
sudo systemctl enable jellyfin
sudo systemctl start jellyfin

Jellyfin runs on port 8096 by default. Access the setup wizard at http://your-server-ip:8096.

Docker

docker run -d \
  --name jellyfin \
  -p 8096:8096 \
  -v /path/to/config:/config \
  -v /path/to/media:/media \
  jellyfin/jellyfin:latest

Installing Emby

Ubuntu/Debian

Download the latest .deb package from emby.media and install:

wget https://github.com/MediaBrowser/Emby.Releases/releases/download/4.8.0/emby-server-deb_4.8.0_amd64.deb
sudo dpkg -i emby-server-deb_4.8.0_amd64.deb

Emby runs on port 8096 (same as Jellyfin -- do not run both on the same port).

Adding Media Libraries

Both Jellyfin and Emby use the same folder structure as Plex:

/media/movies/Movie Name (Year)/Movie Name (Year).mkv
/media/tv/Show Name/Season 01/Show Name - S01E01 - Episode Title.mkv

During the setup wizard:

  1. Create an admin account.
  2. Add a Movies library pointing to your movies folder.
  3. Add a TV Shows library pointing to your series folder.
  4. Select metadata providers (TMDb recommended).
  5. Enable remote access.

User Management for IPTV Billing

Unlike Plex, Jellyfin and Emby let you create users directly without needing the customer to have an external account. This makes billing integration simpler.

Creating Users via API (Jellyfin)

POST /Users/New
Content-Type: application/json
Authorization: MediaBrowser Token="your-admin-api-key"

{
  "Name": "customer_username",
  "Password": "generated_password"
}

Granting Library Access

After creating the user, grant access to specific libraries:

POST /Users/{userId}/Policy
{
  "EnableAllFolders": false,
  "EnabledFolders": ["library-id-1", "library-id-2"]
}

This lets you create tiered access -- basic customers get Movies only, premium customers get Movies + TV Shows + 4K.

Disabling Users (Suspension/Cancellation)

POST /Users/{userId}/Policy
{
  "IsDisabled": true
}

Set IsDisabled back to false to reactivate.

Integrating with IPTVbp

The integration follows the same pattern as Plex:

  1. Create a product in IPTVbp for the media server add-on.
  2. Configure a webhook that fires on purchase, renewal, and cancellation.
  3. Your webhook handler script:
    • On purchase: Creates a Jellyfin/Emby user via API and emails credentials.
    • On renewal: No action needed (user stays active).
    • On cancellation/expiry: Disables the user via API.
    • On reactivation: Re-enables the user.

Reverse Proxy Setup

For production, serve Jellyfin/Emby behind a reverse proxy with SSL:

Nginx example for Jellyfin:

server {
    listen 443 ssl http2;
    server_name media.example.com;

    ssl_certificate /etc/letsencrypt/live/media.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/media.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8096;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /socket {
        proxy_pass http://127.0.0.1:8096;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Performance Tuning

  • Transcoding: Enable hardware acceleration (VAAPI for Intel, NVENC for NVIDIA).
  • RAM: Allocate at least 4 GB; more if you expect heavy concurrent usage.
  • Storage: Use SSDs for the database/metadata, HDDs for media files.
  • Network: Ensure at least 1 Gbps to handle multiple simultaneous streams.
  • Throttle transcodes: Limit to 2-3 simultaneous transcodes per server unless you have powerful hardware.

Monitoring

Both Jellyfin and Emby have built-in activity dashboards showing:

  • Active streams and their transcode status.
  • User activity history.
  • Server CPU, memory, and network usage.

Pair this with IPTVbp's billing data to understand which customers are heaviest users and whether your hardware needs upgrading.