If you've been looking at Plex and wincing at the subscription prompts, you're not alone. Jellyfin is the free, open-source answer — no account required, no premium tier holding features hostage, and it runs great in a small LXC container on Proxmox VE. This guide walks you through building that container from scratch and getting your movies, shows, and music streaming to any device on your network.
We'll keep things practical. You don't need a GPU, a Kubernetes cluster, or prior Linux admin experience — just a working Proxmox VE host and about twenty minutes.
What You Will Learn
- What Jellyfin actually is and how it differs from Plex
- Why an LXC container is the right home for it on Proxmox VE
- How to create and configure the container step by step
- How to install Jellyfin using its official installer script
- How to give the container access to your media files
- Common errors people hit during setup, and how to fix them
What Is This Feature?
Jellyfin is a free, open-source media server. You install it on a machine that has your movies, TV shows, or music, and it organizes that library, pulls in artwork and metadata, and streams it to apps on your phone, smart TV, browser, or tablet. Think of it as your own private Netflix, except you own the server and nobody's tracking what you watch.
It's a fork of Emby that went fully open source back in 2018, and it's stayed that way. There's no cloud account, no forced sign-in, and no paywall for things like hardware-accelerated transcoding — features Plex charges for through Plex Pass.
We're installing it inside an LXC container. LXC stands for Linux Containers, and it's a way of running an isolated Linux system that shares the host's kernel instead of emulating an entire virtual machine. That makes containers much lighter than VMs — a Jellyfin container can happily run on 2 CPU cores and 2 GB of RAM, and it boots in a couple of seconds.
Why Would You Use It?
The honest answer: because you want your media library to just work, without a subscription tied to it. Jellyfin has caught up to Plex in most areas that matter for a home setup — apps for Android, iOS, Roku, Android TV, Fire TV, and a solid web client that runs in any browser.
A few reasons people move to it specifically on Proxmox:
- It's genuinely free. Hardware transcoding, live TV, and mobile sync aren't locked behind a subscription.
- Your data stays local. Jellyfin doesn't need to phone home to a company's servers to work.
- Containers are cheap. You can run Jellyfin alongside a dozen other LXC containers on the same node without the overhead a full VM would add.
- It's easy to snapshot and back up. Since it's a container, Proxmox can back it up with vzdump like anything else on your host.
I'll be upfront: Jellyfin's interface isn't quite as polished as Plex's, and its client apps can feel a step behind in places. If you already pay for Plex Pass and you're happy with it, there's no urgent reason to switch. But if you're starting fresh, or you just don't want a media server dependent on someone else's cloud account, Jellyfin is the better starting point.
Prerequisites
Before you start, make sure you have:
- A working Proxmox VE 8.x or 9.x host (this guide was tested on 9.2)
- A Debian 12 (bookworm) container template downloaded — grab it under Storage > local > CT Templates if you don't already have it
- At least 8 GB of free storage and 2 GB of RAM to spare for the container
- Basic comfort typing commands into a Linux shell — nothing advanced
- A folder of media files somewhere accessible to your Proxmox host, or a plan to add one later
- Network access from the container to the internet, since we'll be pulling packages from Jellyfin's repository
You don't need a GPU for this tutorial. Hardware transcoding is a nice upgrade later, but Jellyfin will happily transcode on the CPU for a couple of simultaneous streams on modest hardware.
Step-by-Step Tutorial
Step 1: Create the LXC Container
In the Proxmox web interface, click your node and then Create CT in the top-right corner.
- General: set the hostname to something like
jellyfin, and set a root password (or add your SSH key). - Template: pick
debian-12-standard. - Disk: 8 GB is fine for the OS and app — your media will live outside this disk.
- CPU: 2 cores is a reasonable starting point.
- Memory: 2048 MB, with a similar amount of swap.
- Network: bridge it to
vmbr0and use DHCP unless you already have a static IP scheme.
Leave the container unprivileged (the default). You don't need root-on-host privileges just to run Jellyfin, and keeping it unprivileged limits what a compromised container could do to the rest of your system.
Click Finish, then start the container from the Proxmox UI.
Step 2: Log In and Update the System
Open the container's console (click the container, then Console) and log in as root. First thing, update the package lists and installed packages:
apt update && apt full-upgrade -y
This can take a minute or two on a fresh template. Reboot the container afterward if the upgrade pulled in a new kernel-related package — for an LXC container that's rare, but it doesn't hurt to check with pct reboot <CTID> from the Proxmox shell if prompted.
Step 3: Install curl
The Debian template is minimal, so curl usually isn't installed yet:
apt install -y curl
Step 4: Download and Verify the Jellyfin Installer
Jellyfin publishes an official install script for Debian and Ubuntu, along with a checksum file so you can confirm you got the real thing before running anything as root:
curl -s https://repo.jellyfin.org/install-debuntu.sh -O
curl -s https://repo.jellyfin.org/install-debuntu.sh.sha256sum -O
sha256sum -c install-debuntu.sh.sha256sum
You should see install-debuntu.sh: OK. If you don't, stop — don't run the script. Try the download again on a clean connection before proceeding.
Step 5: Run the Installer
bash install-debuntu.sh
The script adds Jellyfin's official repository, imports its signing key, and installs the jellyfin package along with its dependencies. It will ask a couple of setup questions along the way — for a plain home install, the defaults are fine. Give it a few minutes; it's pulling down FFmpeg and the web client alongside the server itself.
Step 6: Confirm the Service Is Running
systemctl status jellyfin
You're looking for active (running) in green. If it's there, enable it so it survives reboots:
systemctl enable jellyfin
Step 7: Give the Container Access to Your Media
This is the step people skip and then wonder why their library is empty. Your media should live outside the container's root disk, mounted in from the Proxmox host — that way a container backup doesn't balloon in size, and you can swap or resize the container without touching your files.
From the Proxmox host shell (not inside the container), add a bind mount pointing at wherever your media actually lives:
pct set 105 -mp0 /mnt/media,mp=/media
Replace 105 with your container's ID, and /mnt/media with your real storage path. After that, the folder shows up as /media inside the container, and Jellyfin can read it.
Step 8: Finish Setup in the Browser
Find the container's IP address with ip a inside the console, then visit:
http://<container-ip>:8096
Jellyfin's setup wizard walks you through picking a display language, creating your admin account, and adding your first media library — point it at /media (or whatever subfolder holds your movies or shows). Give it a minute to scan; a large library can take a while the first time.
Commands Explained
| Command | What It Does |
|---|---|
apt update && apt full-upgrade -y | Refreshes the package index and upgrades everything already installed, including replacing packages where needed |
curl -s ... -O | Downloads a file quietly and saves it under its original filename |
sha256sum -c file.sha256sum | Checks a downloaded file's checksum against the published one, confirming it wasn't corrupted or tampered with |
bash install-debuntu.sh | Runs Jellyfin's official installer, which adds the repository and installs the server |
systemctl status jellyfin | Shows whether the Jellyfin service is currently running |
systemctl enable jellyfin | Sets Jellyfin to start automatically whenever the container boots |
pct set <CTID> -mp0 /host/path,mp=/container/path | Adds a bind mount so a folder on the Proxmox host is visible inside the container |
Common Errors
"sha256sum: WARNING: 1 computed checksum did NOT match" — the download got interrupted or corrupted. Delete both files and download them again rather than ignoring the warning.
"Could not resolve host: repo.jellyfin.org" — the container has no working DNS. Check that vmbr0 is actually bridged to your real network and that the container picked up a DHCP lease (ip a should show an address, not just 127.0.0.1).
Browser can't reach port 8096 — usually a firewall issue. If you've enabled the Proxmox firewall on the container or the datacenter level, make sure port 8096 is allowed, or turn the firewall off for testing to confirm that's the cause.
Library scan finds nothing — almost always a mount point path mismatch. Double-check the path you gave Jellyfin in the setup wizard matches exactly what you mounted with pct set, including capitalization.
Troubleshooting
If Jellyfin won't start at all, check the logs first instead of guessing:
journalctl -u jellyfin -e
This shows the most recent log entries for the service, which usually points straight at the problem — a permissions issue on the media folder, a port already in use, or a corrupted config after an interrupted install.
If the container itself seems unreachable, confirm it's actually running from the Proxmox host:
pct status 105
And if the media folder shows up empty inside the container even though files exist on the host, check permissions. Jellyfin runs as its own system user, and if your media folder is only readable by your personal user account on the host, Jellyfin won't be able to see inside it. A quick fix for a home setup is opening up read permissions on the media directory:
chmod -R o+rX /mnt/media
Best Practices
Keep media outside the container's root disk. Bind-mounting it in, as we did above, means your nightly vzdump backups stay small and fast instead of trying to back up terabytes of video every night.
Take a snapshot before major changes — new plugin installs, a version upgrade, or a big library reorganization. Snapshots are nearly instant on ZFS-backed storage and give you an easy way back if something breaks.
Don't expose port 8096 directly to the internet if you want remote access. Put a reverse proxy like Nginx Proxy Manager or Caddy in front of it with a real TLS certificate instead. It's not much extra work, and it saves you from having an unencrypted media server sitting open on the public internet.
Set a static IP once you're happy with the setup. DHCP is fine for testing, but a server you're going to point client apps at every day should have an address that doesn't change after a reboot.
Frequently Asked Questions
Is Jellyfin really free, with no catches?
Yes. It's fully open source under the GPL, with no premium tier, no ads, and no account requirement.
Do I need Docker for this, or does LXC work fine?
LXC works fine and is what we used here. Docker inside an LXC container is also possible, but it adds complexity you don't need for a single app like Jellyfin.
Can I run Jellyfin and Plex on the same Proxmox host?
Absolutely — they're separate containers with separate resources. Some people run both while they decide which one they prefer.
Will I need hardware transcoding?
Only if multiple people stream at once on devices that need a different format than the source file. For one or two viewers on modern devices, direct play usually avoids transcoding altogether.
Does upgrading Jellyfin break my library?
Not normally. Run apt update && apt upgrade jellyfin inside the container, and your library and settings stay put since they live outside the package itself.
Conclusion
You now have a self-hosted media server running in a lightweight container, pulling media from a folder that lives safely outside it. From here, the natural next steps are setting up a reverse proxy for remote access and installing the Jellyfin app on your phone or TV so you can actually watch something.
It's a small project, but it's the kind that tends to snowball — once people see how well Jellyfin runs on a spare Proxmox node, the next LXC container they spin up is usually for something else on this same list.