Plex gets all the attention and Jellyfin gets all the open-source praise, but there's a third media server that quietly does its own thing: Emby. If you've landed on this page, you're probably trying to decide whether it's worth running instead of (or alongside) the other two, or you already picked Emby and just want a clean LXC container for it on your Proxmox VE host. Either way, this guide walks you through the whole build.
You don't need a beefy machine for this. A small container with 2 CPU cores and 2 GB of RAM handles a couple of simultaneous streams without breaking a sweat. The whole setup takes about fifteen minutes once your Debian template is downloaded.
What You Will Learn
- What Emby is, and how it's actually different from Plex and Jellyfin
- Why an LXC container is a sensible place to run it on Proxmox VE
- How to build the container and install Emby Server using its official APT repository
- How to hand the container access to your media files without duplicating storage
- The errors people run into most often, and the fix for each one
- A few habits that will save you a headache later, like where to put your media and how to back the container up properly
What Is This Feature?
Emby is a media server. You point it at folders full of movies, TV shows, music, or home videos, and it builds a browsable library complete with artwork, descriptions, and cast information pulled from online metadata sources. From there you can stream that library to apps on your phone, a smart TV, a browser, a game console, or pretty much anything with a screen.
Here's the part that actually matters when you're choosing between Emby and its cousins: Emby used to be fully open source, under the name Media Browser. In December 2018 the project closed its source for the 4.x release line, which is the exact reason Jellyfin exists — a group of contributors forked the last open version and kept developing it in the open. Emby itself has stayed closed-source since, though the core server is still free to run. Extra features live behind an optional subscription called Emby Premiere.
We're going to install it inside an LXC container rather than a full virtual machine. LXC stands for Linux Containers — instead of emulating a whole computer the way a VM does, it runs an isolated Linux environment that shares the host's kernel. That's why containers start in a couple of seconds and can run comfortably on far less RAM and disk than a VM would need for the same job.
Why Would You Use It?
Honestly, most people who end up on Emby have already tried Plex or Jellyfin and want something in between. A few reasons it keeps a loyal following:
- The free tier is genuinely usable. You get a full media library, transcoding, and access from the web app without paying anything.
- Official native apps. Emby has dedicated apps for Android TV, Fire TV, Roku, Xbox, PlayStation, and more — not just a web client wrapped in a shell.
- Live TV and DVR support. If you're feeding it a tuner, Emby can record and manage live television, something Jellyfin handles less smoothly.
- It's a light footprint in a container. Same story as Plex and Jellyfin here — it doesn't need much to run well.
The tradeoff is Emby Premiere. Hardware-accelerated transcoding, offline sync to mobile devices, and full access to some of the official apps sit behind that subscription. If you never plan to pay for it, Jellyfin gives you those same things for free. I'd only pick Emby over Jellyfin if you specifically want its native client apps or its DVR features — otherwise you're paying eventually for stuff Jellyfin already includes.
Prerequisites
Before you start, get these sorted:
- A working Proxmox VE 8.x or 9.x host — this guide was written and tested on 9.2
- A Debian 12 (bookworm) container template downloaded, found under Storage > local > CT Templates in the web interface
- At least 8 GB of free storage and 2 GB of RAM you can spare for the container
- Basic comfort typing commands at a Linux shell — nothing beyond copy and paste is required here
- A folder of media somewhere your Proxmox host can reach, whether that's local storage, an NFS share, or a mounted USB drive
- Outbound internet access from the container, since Emby's installer pulls packages from its own repository
A GPU isn't required for this walkthrough. It becomes relevant later if you want hardware transcoding, and that specific feature needs both a passthrough setup and an active Emby Premiere subscription — worth knowing before you go looking for it in the free tier.
Step-by-Step Tutorial
Step 1: Create the LXC Container
On your Proxmox node, click Create CT in the top-right corner.
- General: give it a hostname like
embyand set a root password (or drop in your SSH key). - Template: select
debian-12-standard. - Disks: 8 GB is plenty — your actual media will live outside this disk.
- CPU: 2 cores is a comfortable starting point.
- Memory: 2048 MB, with roughly the same amount of swap.
- Network: bridge to
vmbr0and use DHCP unless you're assigning static addresses manually.
Leave the container unprivileged, which is the default. Emby doesn't need root-level access to the host, and an unprivileged container limits the damage if it were ever compromised. Click Finish, then start it.
Step 2: Update the Base System
Open the container's console and log in as root. Update the package lists and installed packages before adding anything new:
apt update && apt full-upgrade -y
On a fresh template this usually finishes in under a minute.
Step 3: Install curl and gnupg
You'll need both to pull down and verify Emby's signing key:
apt install curl gnupg -y
Step 4: Add Emby's Official APT Repository
Emby publishes a proper APT repository, which is worth using over a manually downloaded .deb file since it lets apt handle future updates for you. Start by creating the keyring directory and importing the signing key:
install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://pkg.emby.media/keys/emby-public.gpg -o /etc/apt/keyrings/emby-public.gpg
chmod 0644 /etc/apt/keyrings/emby-public.gpg
Then add the repository source file itself:
curl -fsSL https://pkg.emby.media/apt/emby.sources -o /etc/apt/sources.list.d/emby.sources
Step 5: Install Emby Server
Refresh your package lists so apt picks up the new repository, then install:
apt-get update
apt-get install emby-server -y
The package pulls in its dependencies automatically, creates a systemd service, and starts Emby right away. Confirm it's running:
systemctl status emby-server
You should see active (running) in green. If it isn't, jump to the troubleshooting section below before moving on.
Step 6: Give the Container Access to Your Media
Rather than copying media into the container's small root disk, mount it in from the host. From the Proxmox shell (not inside the container), stop the container first, then add a bind mount pointing at wherever your media actually lives:
pct set 200 -mp0 /mnt/pve/media,mp=/mnt/media
Swap 200 for your container's actual ID, and /mnt/pve/media for the real path on your host — that could be local storage, an NFS mount, or anything else Proxmox can see. Start the container back up, and /mnt/media will appear inside it automatically.
Step 7: Run the Setup Wizard
Find the container's IP address from the Proxmox summary tab (or run ip a inside the console), then visit it in a browser on port 8096:
http://<container-ip>:8096
Emby's setup wizard walks you through picking a display language, creating your admin account, and pointing it at /mnt/media as your first library. Once that's saved, it'll start scanning and pulling in artwork.
Commands Explained
A quick rundown of what each command actually did, since copying commands blind is a bad habit:
apt full-upgrade -yupgrades every installed package, including ones that need to remove or replace others to satisfy dependencies — safer than a plainapt upgradeon a fresh template.install -d -m 0755 /etc/apt/keyringscreates the keyrings directory with standard read/execute permissions for everyone, write for root only.curl -fsSL ... -o ...downloads a file quietly (-fsSsuppresses progress output but still shows errors), following redirects (-L), and saves it to the path given after-o.apt-get install emby-server -yinstalls the package and automatically answers "yes" to any confirmation prompts.pct set 200 -mp0 /host/path,mp=/container/pathadds a bind mount point to an LXC container's configuration —mp0is just the first mount point slot; you can add more asmp1,mp2, and so on.systemctl status emby-servershows whether the Emby service is currently running and, if not, the last few log lines explaining why.
Common Errors
A handful of things trip people up during this specific install:
| Error | What's Actually Happening |
|---|---|
| NO_PUBKEY or "signatures couldn't be verified" | The GPG key wasn't imported correctly, or its file permissions are wrong. Re-run the key import step and double-check the file exists at /etc/apt/keyrings/emby-public.gpg. |
| E: Unable to locate package emby-server | You installed before running apt-get update after adding the repository, or the sources file didn't download correctly. |
| Connection refused on port 8096 | The service isn't running yet, or you're using the wrong IP address. Give it a few seconds after install and re-check with systemctl status emby-server. |
| Media library shows as empty after scanning | Emby can't read the mount path, usually because /mnt/media wasn't actually populated — check the bind mount from the Proxmox shell, not from inside the container. |
| "Access is denied" reading specific files | Almost always a permissions mismatch between the host folder's owner and the container's mapped UID, which is common with unprivileged containers. |
Troubleshooting
If the service won't start, check the logs directly rather than guessing:
journalctl -u emby-server -e
That shows the most recent entries, which almost always point straight at the problem — a missing dependency, a permissions error, or a port already in use by something else. Speaking of which, if you're also running Jellyfin or Plex in another container on the same network, remember they all default to different ports (Emby and Jellyfin both use 8096, Plex uses 32400), so a conflict there usually means two containers somehow ended up with the same IP rather than a port clash.
If the container can't reach the internet during setup, confirm basic connectivity first:
ping -c 3 deb.debian.org
No response usually means the container's network bridge or firewall rules are the actual issue, not Emby.
For the permissions problem on mounted media: unprivileged LXC containers shift UIDs by an offset (typically starting at 100000) when mapping to the host. If Emby's service user can't read files that look perfectly normal from the host's side, check the effective ownership from inside the container with ls -la /mnt/media, and adjust the host folder's permissions to be world-readable, or add a specific UID mapping in /etc/subuid and /etc/subgid if you need tighter control. For most home setups, making the media folder group-readable on the host is the simplest fix.
Best Practices
A few things that'll save you trouble down the road:
- Keep your media outside the container. Bind-mounting it in, like we did, means reinstalling or resizing the container never touches your actual files.
- Back up the container config with vzdump. This captures Emby's settings and library configuration, but note that vzdump does not include bind-mounted content by default — your actual media needs its own backup plan separately.
- Leave the container unprivileged unless you have a specific reason not to. It's a meaningful security boundary for very little cost.
- Update deliberately, not automatically. Emby occasionally changes database schemas between versions — check the release notes before running
apt full-upgradeon a system with an active library you care about. - Only pay for Premiere if you'll use what it unlocks. If hardware transcoding and offline sync don't matter to you, the free tier does everything most homelab setups need.
Frequently Asked Questions
Is Emby actually free?
The core server and web-based streaming are free with no time limit. Emby Premiere is an optional paid add-on for things like hardware transcoding, DVR, and full mobile app access.
Should I use Emby or Jellyfin?
If you want everything free with no subscription ever, Jellyfin is the simpler choice — it includes hardware transcoding out of the box. Pick Emby if you specifically want its native TV and console apps or its DVR features.
Do I need a GPU for this setup?
No. This guide covers a CPU-only install, which handles a couple of simultaneous streams fine on modest hardware. Hardware transcoding is a separate project involving GPU passthrough and an active Premiere subscription.
Can I run Emby and Jellyfin on the same Proxmox host?
Yes, without any conflict, as long as each one lives in its own container with its own IP address. They'll both try to use port 8096 by default, but that's fine since each container has a separate address.
What happens to my library if I delete the container?
If you followed Step 6 and kept your media on a bind-mounted host path, the actual files are untouched. You'd only lose Emby's database — the watched status, metadata cache, and user accounts — unless you'd also backed that up separately.
Conclusion
You've now got Emby running in its own lightweight container, pulling media from storage that lives outside it and reachable from any device on your network. The setup itself is quick — the real decision was always whether Emby's particular mix of free core features and paid extras fits how you actually watch things, versus what Jellyfin or Plex would offer instead. Now that it's running, the next step is usually just adding libraries and letting the metadata scan do its thing.