How to Install Emby Media Server on Ubuntu 24.04 — Stream Your Library Anywhere
Emby turns a modest VPS into a polished personal streaming service that indexes your movies, TV shows, music, photos, and live TV, then delivers them to every device you own — phones, smart TVs, browsers, Kodi, Roku, Apple TV, and DLNA receivers. This guide walks you through installing the official Emby Server package on Ubuntu 24.04, configuring libraries, enabling hardware acceleration where possible, exposing the server safely to the internet behind Nginx with TLS, and deciding whether an Emby Premiere subscription makes sense for your setup.
Want a bigger media box? The CloudCore Professional plan ships with 6 vCPU, 12 GB RAM, and 200 GB NVMe for EUR 19.99/month — comfortable for a family-scale Emby deployment.
Table of Contents
What is Emby?
Emby is a closed-core, freemium media server that organizes your personal media library and streams it to clients over the local network and the internet. The server component runs on Linux, Windows, macOS, FreeBSD, NAS appliances, and Docker. Clients exist for nearly every modern platform, including iOS, Android, Android TV, Apple TV, Fire TV, Roku, LG webOS, Samsung Tizen, Xbox, PlayStation, and the web.
Emby scrapes metadata from TheMovieDB, TheTVDB, and MusicBrainz, fetches artwork, reads subtitles and chapters, detects intros and credits, and transcodes on the fly so that a 1080p H.265 movie plays smoothly on an older phone that only supports H.264. It also handles user profiles, parental controls, watch history, multi-device resume, DVR, live TV via HDHomeRun tuners or IPTV M3U playlists, and photo libraries synced from phones. Out of the box you get a clean web UI at http://your-server:8096.
Emby sits between fully-open Jellyfin and the cloud-bound Plex. The server binary is not open source, but the product model is "own your data" — your database, metadata, and media live entirely on your VPS.
Why Self-Host Emby on a VPS?
Running Emby on a VPS instead of a home NAS or paying for a streaming service has several upsides:
- Public internet access without port forwarding. A VPS has a stable public IP. You do not need to poke holes in a home router, deal with CGNAT, or rely on a dynamic DNS client.
- Symmetric, unmetered bandwidth. Many home ISPs cap upload to 10-40 Mbit/s. A datacenter VPS typically offers 1 Gbit/s or more, so 4K remote playback becomes realistic.
- Always-on, 24/7. No wake-on-LAN dance, no family member pulling the plug on the NAS, no brownout pausing a transcode mid-movie.
- Better than cloud services for your own files. Netflix and Disney+ can remove titles at any time. Your Emby library is whatever you put into it, available forever.
- Full data ownership. No telemetry pipeline back to a vendor, no "our free tier just changed." Your watch history and user accounts live only on your server.
- Cheaper long-term than multi-service streaming bundles. A single VPS at EUR 19.99/month is usually less than one premium streaming subscription, with far more content control.
- Compliant with your own backup policy. Snapshot the VPS, replicate to a second region, or rsync to a Hetzner Storage Box — you decide the RPO and RTO.
Cost Comparison: VPS-Hosted Emby vs Cloud Streaming
| Scenario | Cloud Streaming Bundle | Home NAS + Home ISP | VPS-Hosted Emby |
|---|---|---|---|
| Monthly cost | EUR 30-60/mo (bundles) | Hardware + electricity | EUR 19.99/mo flat |
| Upload bandwidth | N/A | 10-40 Mbit/s typical | 1 Gbit/s unmetered |
| Reliability | Vendor-dependent | Home power / ISP outages | Datacenter SLA |
| Content control | Vendor curates | Full control | Full control |
| Remote access | Native | Requires VPN / port fwd | Built-in via public IP |
| Offline downloads (Emby mobile) | Requires vendor app | Yes (with Premiere) | Yes (with Premiere) |
| 4K remote playback | Vendor-dependent | Upload-limited | Practical on 1 Gbit/s |
Emby vs Plex vs Jellyfin
Choosing the right media server matters because migration between them is time-consuming (metadata, watch history, and user accounts do not move cleanly). Here is how Emby positions against the alternatives:
- Emby — Polished UI, strong native clients on smart TVs and consoles, optional paid tier for advanced features, server binary closed source. Good middle ground.
- Plex — The most refined UI and the best smart-TV client ecosystem, but requires a Plex cloud account and routes some relay traffic through Plex.tv servers. Plex Pass subscription unlocks most premium features.
- Jellyfin — Fully open-source fork of an earlier Emby release. No paid tier, no telemetry, no vendor dependency, but clients are less polished on smart TVs.
Prerequisites
Before starting, make sure you have:
- A VPS running Ubuntu 24.04 LTS with root or sudo access.
- SSH access to the server.
- A domain name (such as
media.example.com) with an A record pointing to your VPS IP. - At least 2 GB of RAM (4 GB+ recommended for transcoding).
- At least 100 GB of storage for a starter media library (1-2 TB for a serious collection).
- Ports 80 and 443 open on the firewall for Nginx and Let's Encrypt.
Recommended Plan: CloudCore Professional>
For a comfortable Emby deployment with room for metadata, transcoding, and other services, we recommend the CloudCore Professional plan:>
- 6 vCPU cores
- 12 GB RAM
- 200 GB NVMe SSD
- Unmetered 1 Gbit/s bandwidth
- EUR 19.99/month>
This supports 2-3 simultaneous transcoded 1080p streams plus background metadata tasks. For larger libraries, add a block storage volume or mount an external object store.
Connect to your VPS:
ssh root@your-server-ipStep 1: Update the System
Refresh the package index, upgrade existing packages, and install a few helpers you will need later (curl for downloading the deb, ffmpeg libs are pulled in automatically by Emby, but keeping apt current prevents dpkg conflicts):
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget ca-certificates gnupg lsb-release ufwIf the kernel was upgraded, reboot:
sudo rebootReconnect after a minute.
Step 2: Download the Emby Server .deb
Emby does not ship an apt repository the way Jellyfin does. Instead, downloads are hosted directly on emby.media and on GitHub. We grab the latest stable emby-server-deb package for amd64 (use arm64 for ARM VPS).
Browse to the official download page to confirm the latest version number. For this guide we use version 4.8.10.0 as an example — substitute the current version in the URL below.
cd /tmp
wget https://github.com/MediaBrowser/Emby.Releases/releases/download/4.8.10.0/emby-server-deb_4.8.10.0_amd64.debExpected output:
Resolving github.com (github.com)... 140.82.121.3
Connecting to github.com (github.com)|140.82.121.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
...
2026-04-16 10:00:00 (24.1 MB/s) - 'emby-server-deb_4.8.10.0_amd64.deb' saved [162384720/162384720]Verify the file size is roughly what the release page advertised (around 155-165 MB for amd64).
Step 3: Install with dpkg
Install the package. dpkg -i does the install, and apt install -f resolves any missing dependencies that the deb declares (ffmpeg libs, libicu, libssl, and similar):
sudo dpkg -i emby-server-deb_4.8.10.0_amd64.deb
sudo apt install -f -yExpected output:
Selecting previously unselected package emby-server.
(Reading database ... 73421 files and directories currently installed.)
Preparing to unpack emby-server-deb_4.8.10.0_amd64.deb ...
Unpacking emby-server (4.8.10.0) ...
Setting up emby-server (4.8.10.0) ...
Created symlink /etc/systemd/system/multi-user.target.wants/emby-server.service
Emby Server started successfully.The installer:
/opt/emby-server/.emby system user and group./var/lib/emby/ for the database, metadata, and user data./lib/systemd/system/emby-server.service.Step 4: Verify the Service
Confirm Emby is running:
sudo systemctl status emby-serverExpected output:
emby-server.service - Emby Server
Loaded: loaded (/lib/systemd/system/emby-server.service; enabled)
Active: active (running) since Wed 2026-04-16 10:05:00 UTC; 30s ago
Main PID: 2345 (EmbyServer)
Tasks: 32 (limit: 14236)
Memory: 240.0M
CGroup: /system.slice/emby-server.service
└─2345 /opt/emby-server/emby-server ...Allow the Emby port locally and confirm it is listening on 8096:
sudo ss -tlnp | grep 8096You should see a line containing 0.0.0.0:8096.
Before opening 8096 to the public, we will proxy it behind Nginx (Step 10). For now, use SSH port forwarding from your laptop to complete the first-run wizard privately:
# Run this on your local machine
ssh -L 8096:localhost:8096 root@your-server-ipThen open http://localhost:8096 in your browser.
Step 5: First-Run Wizard
The Emby first-run wizard appears the first time anyone loads the web UI. Work through these screens:
At the end, click Finish and sign in with the admin user you created. You land on the Emby dashboard.
Step 6: Configure Library Paths
Libraries are the top-level organizational unit in Emby. Each one maps to a folder on disk and a content type.
Create Media Directories
On the server, create a predictable directory layout. We use /srv/media as the root. Adjust if your storage is mounted elsewhere (such as /mnt/blockstorage/media):
sudo mkdir -p /srv/media/{movies,tv,music,photos,audiobooks}
sudo chown -R emby:emby /srv/media
sudo chmod -R 755 /srv/mediaPopulate the folders with content via scp, rsync, rclone, or by mounting an external drive. Emby expects a standard naming convention:
- Movies:
/srv/media/movies/Inception (2010)/Inception (2010).mkv - TV shows:
/srv/media/tv/Breaking Bad/Season 01/Breaking Bad - S01E01.mkv - Music:
/srv/media/music/Artist/Album/01 - Track.flac
Add Libraries in the Emby UI
/srv/media/movies.The first scan of a large library can take hours. Watch progress under Dashboard → Scheduled Tasks → Scan media library.
Step 7: Enable Hardware Acceleration
Transcoding converts video to a format the client can play. Software transcoding (libx264) burns CPU — one 1080p stream can saturate 4 vCPU cores. Hardware acceleration offloads that work to a GPU or an integrated Intel iGPU.
On a VPS, availability depends on the underlying hypervisor. Contabo and OVH KVM instances on modern Intel Xeon hosts expose Intel Quick Sync (QSV) through the virtualized /dev/dri/renderD128 device on some plans. On most shared plans, only software transcoding is available, and you should plan capacity around that.
Check for a Render Node
ls -la /dev/dri/Expected output if acceleration is available:
crw-rw---- 1 root render 226, 128 Apr 16 10:00 renderD128If /dev/dri/ is empty or absent, the VPS does not expose a GPU — skip this step.
Grant Emby Access to the Render Node
sudo usermod -aG render,video emby
sudo systemctl restart emby-serverEnable in the Emby UI
/dev/dri/renderD128.Test with a Transcode
Play a file in the Emby web app at a lower quality than the source (for example a 1080p file at 720p 2 Mbit/s). Watch CPU usage:
top -p $(pgrep -d, EmbyServer)With hardware acceleration, total Emby CPU usage during a 1080p transcode should stay under 30%. Without it, expect 200-400%.
Step 8: Emby Premiere — What It Adds
Emby Server is free for core streaming. An Emby Premiere subscription unlocks features aimed at heavy users:
- Mobile sync and offline downloads on iOS and Android clients.
- Cinema Mode — trailers and custom intros before main features.
- DVR — record live TV from an HDHomeRun or IPTV tuner with series scheduling, ad skipping, and automatic commercial detection.
- Cover art and posters downloaded at higher resolution from premium sources.
- Parental controls with per-user PINs.
- Free Emby Connect account linking for remote access without manual port setup.
- Free apps — the iOS, Android, Apple TV, Android TV, and Fire TV apps cost a one-time unlock fee for non-Premiere users, included with Premiere.
- Hardware transcoding on some client-server combinations — certain advanced transcoding features are gated behind Premiere.
Pricing (as of publication)
- Monthly: USD 4.99
- Yearly: USD 54
- Lifetime: USD 119
Step 9: Configure DLNA
DLNA lets smart TVs, PlayStation and Xbox consoles, and network audio receivers discover the Emby server on the local network without installing an app. Emby speaks DLNA out of the box on UDP port 1900 (SSDP discovery) and a random high TCP port for streaming.
Important security warning: DLNA has no authentication. Anyone who can reach the discovery port sees every library and can stream anything. On a public VPS, keep DLNA bound to a private interface only (WireGuard, Tailscale, or a LAN subnet reachable through VPN). Never expose 1900/udp on the public internet.
Enable and Restrict DLNA
Bind DLNA to a Private Interface
Install WireGuard on the VPS (see our WireGuard install guide) or join the server to a Tailscale network. Then constrain Emby's DLNA to the private interface:
100.64.0.0/10 for Tailscale or 10.8.0.0/24 for WireGuard).8920 (HTTPS) and leave HTTP internal only.sudo systemctl restart emby-server.On the public side of the firewall, explicitly block DLNA:
sudo ufw deny 1900/udp
sudo ufw deny 7359/udpStep 10: Nginx Reverse Proxy with TLS
Now expose Emby on the public internet at https://media.example.com behind Nginx. This gives you a friendly URL, automatic HTTPS via Let's Encrypt, and a place to add extra hardening like rate limiting and security headers.
Install Nginx and Certbot
sudo apt install -y nginx certbot python3-certbot-nginxOpen Firewall Ports
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enableCreate the Nginx Site Config
sudo tee /etc/nginx/sites-available/emby > /dev/null <<'EOF' server { listen 80; server_name media.example.com; return 301 https://$host$request_uri; }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;
ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on;
# Security headers add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
# Large uploads for artwork and subtitle imports client_max_body_size 50m;
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; proxy_set_header X-Forwarded-Protocol $scheme; proxy_set_header X-Forwarded-Host $http_host;
# WebSockets for real-time updates and Chromecast control proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
# Long-running streams — do not cut off during a movie proxy_buffering off; proxy_read_timeout 1800s; proxy_send_timeout 1800s; }
# Optional: direct WebSocket endpoint for embedded players location /embywebsocket { proxy_pass http://127.0.0.1:8096; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 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; } } EOF
Replace media.example.com with your real hostname.
Enable the Site and Issue a Certificate
sudo ln -s /etc/nginx/sites-available/emby /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo certbot --nginx -d media.example.com
sudo systemctl reload nginxCertbot edits the config to reference the issued certificate and installs an automatic renewal timer.
Tell Emby About the Public URL
Back in the Emby UI:
443.media.example.com.Browse to https://media.example.com and sign in. Your Emby is now publicly accessible over TLS.
Companion Apps: Sonarr, Radarr, and More
Emby handles playback brilliantly but does not download new content on its own. Pair it with the *-arr stack for end-to-end automation:
- Sonarr — monitors TV shows, watches for new episodes on configured indexers, and hands them to a download client. Sonarr renames the resulting files into the exact layout Emby expects, and real-time monitoring picks them up within seconds.
- Radarr — the movie equivalent of Sonarr. Configure a quality profile (say 1080p Bluray remux, fall back to 1080p WEB-DL), a size limit, and let it fill your watchlist automatically.
- Lidarr — same pattern for music albums.
- Bazarr — sidecar that grabs subtitles for everything Sonarr and Radarr manage, in the languages you configure.
- Prowlarr — unified indexer manager; point Sonarr, Radarr, and Lidarr at Prowlarr and it distributes torrent/Usenet indexers to all of them.
Troubleshooting
| Problem | Cause | Solution |
|---|---|---|
dpkg: error processing package emby-server | Missing dependency | Run sudo apt install -f -y to let apt fetch the missing libs. |
| Web UI loads forever after login | Nginx WebSocket not configured | Verify proxy_http_version 1.1, Upgrade, and Connection "upgrade" headers in the Nginx config. |
| Playback starts then stops after ~1 minute | Nginx proxy_read_timeout too low | Increase proxy_read_timeout to 1800s as shown in the Step 10 config. |
| Hardware acceleration option greyed out | emby user lacks render/video group membership | sudo usermod -aG render,video emby && sudo systemctl restart emby-server. |
| Media library empty after scan | Permission mismatch — emby cannot read /srv/media | sudo chown -R emby:emby /srv/media. |
| Mobile app keeps asking for a login unlock | Running on free tier without Premiere | Either pay the one-time app unlock, subscribe to Premiere, or use the web UI on mobile browsers. |
| Certbot fails with DNS / port 80 error | DNS not propagated or firewall blocks 80 | Verify dig media.example.com resolves, and sudo ufw status shows Nginx Full allowed. |
| Server appears in DLNA on public internet | UPnP or DLNA leaked to public interface | Disable UPnP, bind LAN networks to a private subnet only, and block 1900/udp + 7359/udp at the firewall. |
Logs
Emby logs live at /var/lib/emby/logs/. The most useful file is embyserver.txt:
sudo tail -f /var/lib/emby/logs/embyserver.txtOr follow systemd-level events:
sudo journalctl -u emby-server -fFAQ
Is Emby free to use?
Emby Server is free for core streaming. Advanced features such as mobile sync, Cinema Mode, DVR, and hardware-accelerated transcoding on remote clients require an Emby Premiere subscription. The server software itself is freely installable on Ubuntu.
How much storage do I need on my VPS?
Budget roughly 4-8 GB per 1080p movie and 20-40 GB per 4K movie. For a 500-movie library, plan on at least 2-4 TB. Many users keep Emby's metadata and database on fast NVMe on the VPS itself, and mount bulk media from a block storage volume or an S3-compatible object store via rclone mount.
Does Emby support hardware transcoding on a VPS?
Yes, when the underlying hypervisor exposes an Intel iGPU (QSV) or a passed-through GPU through /dev/dri/renderD128. On most shared VPS plans only software (libx264) transcoding is available, which is CPU-heavy. If hardware acceleration matters to you, pick a plan with a dedicated GPU or confirmed IGP passthrough before deploying.
Can I run Emby and Jellyfin side by side?
Yes, but it is rarely worth it. They use similar default ports (Emby on 8096, Jellyfin also on 8096 — one must be changed), separate config directories, and duplicate the entire metadata cache. Running both doubles CPU, RAM, and disk usage. Most self-hosters pick one and stick with it.
Should I choose Emby, Plex, or Jellyfin?
Emby balances polish and self-hosting control; Plex offers the slickest UI but depends on Plex cloud accounts and routes some traffic through Plex.tv; Jellyfin is fully open source with no paid tier, though its smart-TV clients lag behind. If you want a premium-feel product you mostly own, Emby is the middle ground.
Is DLNA safe to enable on a public VPS?
DLNA is unauthenticated by design and should never be exposed to the public internet. Keep it bound to the local subnet or to a WireGuard/Tailscale interface and firewall ports 1900/udp and 7359/udp on the public interface. If you only stream via the Emby web app and native clients (which authenticate), DLNA is not needed at all on a VPS — disable it entirely.
How do I back up an Emby Server?
Stop the service and back up the entire /var/lib/emby directory:
sudo systemctl stop emby-server
sudo tar czf /root/emby-backup-$(date +%F).tar.gz /var/lib/emby
sudo systemctl start emby-serverIt contains the database, metadata cache, user accounts, plugins, and server configuration. Pair this with a snapshot schedule on your VPS for point-in-time recovery, and mirror the tarball to off-site storage (Backblaze B2, Hetzner Storage Box, AWS S3).
Next Steps
With Emby running behind TLS on a production-grade VPS, consider these add-ons to round out a full media stack:
- Automate downloads with Sonarr and Radarr — end-to-end pipeline from release to playable file with zero manual work.
- Add Bazarr for subtitles — auto-downloads subtitles in your chosen languages for every library item Sonarr and Radarr manage.
- Set up Tautulli-style analytics — Emby ships its own Playback Reporting plugin under Dashboard → Plugins. Enable it to see who watches what, when, and from where.
- Monitor uptime with Uptime Kuma — ping the public URL and alert to Telegram or email if Emby stops responding.
- Mirror the library — for disaster recovery, sync
/srv/mediato a second VPS or a Hetzner Storage Box withrclone sync --fast-list.
Need a bigger box? The CloudCore Professional plan delivers 6 vCPU, 12 GB RAM, 200 GB NVMe, and 1 Gbit/s unmetered traffic for EUR 19.99/month — enough headroom for Emby plus Sonarr, Radarr, Bazarr, and Prowlarr on a single VPS.>
For deeper troubleshooting, the official Emby support site maintains an active forum and documentation portal.