How to Set Up a Self-Hosted Media Server

Updated June 2026
A self-hosted media server lets you stream your personal movie, TV show, and music collection to any device in your home or remotely over the internet. This guide walks you through every step of building a media server with Jellyfin, from organizing your library and installing the software to enabling hardware transcoding and connecting client apps on all your devices.

Streaming your own media library gives you control that no commercial service can match. You choose the content, you set the quality, there are no licensing disagreements that remove shows without warning, and you never pay a monthly fee. Once your server is running, it works like your own private Netflix with a catalog you curate yourself.

Choose Your Media Server Software

Three media server applications dominate the self-hosting landscape, and each occupies a distinct position.

Jellyfin is fully open source with no proprietary components, no premium tier, and no account creation requirement. Every feature is free, including hardware transcoding, live TV and DVR support, multiple user profiles, and parental controls. It is maintained by an active community of volunteers and funded through donations. Jellyfin is the recommended choice for this guide because it aligns with the principles of self-hosting: you own the software as completely as you own the hardware.

Plex is the most polished option with the largest ecosystem of client apps and the most mature metadata handling. However, the Plex server is proprietary software, requires a Plex account to use, and gates several important features (including hardware transcoding on some platforms and mobile app playback) behind a Plex Pass subscription that costs $5/month or $120 for a lifetime license. Plex also phones home to Plex's servers for authentication, which some self-hosters find philosophically uncomfortable.

Emby occupies the middle ground with a proprietary server that offers a free tier and a paid Emby Premiere tier for advanced features. It has less community momentum than either Jellyfin or Plex.

For a purely self-hosted, fully open source media server with no strings attached, Jellyfin is the clear choice.

Prepare Your Hardware and Storage

A media server's hardware requirements depend heavily on whether you need transcoding. If all your client devices can play your media files in their original format (called direct play), even a Raspberry Pi can serve media to multiple clients simultaneously. Transcoding, where the server converts the media format in real time for a device that cannot play the original, is far more demanding.

For a household that streams to a variety of devices, a mini PC with an Intel N100 or newer processor is the practical minimum. The Intel Quick Sync hardware encoder built into these chips handles one to two simultaneous transcoding sessions efficiently while using minimal power. For three or more simultaneous transcodes, consider a system with a dedicated GPU or a more powerful Intel or AMD processor with a capable integrated GPU.

Storage is the primary expense for a media server. A modest collection of movies and TV shows in 1080p requires 2 to 4 TB. A larger library with 4K content can easily reach 10 TB or more. Standard hard drives (HDDs) offer the best cost per terabyte for media storage. An 8 TB drive costs around $120 to $150 and is more than adequate for starting a library. Store the operating system and Jellyfin's database on an SSD for responsiveness, and use HDDs for the media files themselves.

Organize Your Media Library

Proper file organization is critical because Jellyfin relies on folder structure and file naming to match your media with the correct metadata, artwork, and descriptions from online databases like TheMovieDB and TheTVDB.

Create a top-level directory for each media type: /media/movies, /media/tv, and /media/music. Within the movies folder, each film gets its own subdirectory named with the title and release year: /media/movies/The Matrix (1999)/The Matrix (1999).mkv. TV shows follow a nested structure: /media/tv/Breaking Bad (2008)/Season 01/Breaking Bad S01E01.mkv. This naming convention allows Jellyfin to automatically identify each title, download cover art, plot summaries, cast information, and ratings.

For music, organize by artist and album: /media/music/Artist Name/Album Name/01 - Track Title.flac. Jellyfin reads embedded ID3 tags from music files for metadata, so properly tagged files will display correctly regardless of folder structure, but consistent organization makes your library easier to manage manually.

Avoid putting unrelated files in your media directories. Jellyfin scans everything in the configured library paths, and stray files can cause metadata matching errors or clutter your library with unintended entries.

Install Jellyfin with Docker

Docker is the recommended installation method for Jellyfin because it isolates the application from the host system and makes updates straightforward. Create a directory for your Jellyfin configuration, then create a docker-compose.yml file with the Jellyfin service definition.

The key configuration elements are the volume mounts that connect your media directories and configuration folder to the container, the port mapping (Jellyfin uses port 8096 by default for the web interface), and the user/group ID settings that ensure Jellyfin has read access to your media files. If you are using Intel Quick Sync for hardware transcoding, you also need to pass through the /dev/dri device to the container.

Launch the container with docker compose up -d and open your browser to http://your-server-ip:8096. The initial setup wizard walks you through creating an admin account, selecting your preferred language, and adding your media library paths. Point each library type (Movies, Shows, Music) to the corresponding directory you mounted into the container. Jellyfin will begin scanning and matching your files with metadata from online databases.

The initial library scan can take anywhere from a few minutes to several hours depending on the size of your collection. Subsequent scans are incremental and much faster, picking up only new or changed files.

Configure Hardware Transcoding

Hardware transcoding uses your GPU or integrated graphics processor to convert media formats significantly faster and more efficiently than software transcoding on the CPU. In Jellyfin, navigate to Dashboard, then Playback, and select your hardware acceleration method.

For Intel systems (N100, Core i-series, Xeon), select Intel Quick Sync Video (QSV) or Video Acceleration API (VAAPI). Both use the integrated Intel GPU. QSV is generally preferred for its broader codec support and better quality output. Make sure /dev/dri is passed through to the Docker container so Jellyfin can access the GPU.

For NVIDIA GPUs, select NVIDIA NVENC and ensure the NVIDIA Container Toolkit is installed on the host system. Pass the GPU to the container using the deploy section in your Compose file with the nvidia runtime. NVIDIA GPUs provide excellent transcoding quality and can handle many simultaneous sessions.

After enabling hardware acceleration, test it by playing a media file on a device that requires transcoding (such as a web browser playing an HEVC/H.265 file, since most browsers cannot play HEVC natively). Check the Jellyfin dashboard to confirm that the transcoding session shows "(HW)" next to the codec, indicating hardware acceleration is active. If transcoding falls back to software, review the Jellyfin logs for error messages about GPU access permissions.

Set Up Remote Access

To stream your media library when you are away from home, you need to make your Jellyfin server accessible over the internet. There are two main approaches, and your choice depends on your network setup and security preferences.

Reverse proxy with HTTPS. Set up Caddy or Nginx Proxy Manager in front of Jellyfin with a domain name pointing to your home IP address. Forward port 443 on your router to the reverse proxy. Caddy handles Let's Encrypt certificate provisioning automatically. This approach gives you a clean URL like https://media.yourdomain.com that works in any browser and in the Jellyfin client apps. If your ISP uses CGNAT and you cannot forward ports, Cloudflare Tunnel provides an alternative that works without port forwarding by establishing an outbound connection from your server to Cloudflare's network.

VPN access. Tailscale or WireGuard creates an encrypted tunnel between your devices and your home network. With the VPN active, you access Jellyfin using its local IP address as if you were at home. This is more secure because Jellyfin is never exposed to the public internet, but it requires the VPN client to be running on every device you want to stream from.

When streaming remotely, bandwidth is the limiting factor. A single 1080p stream requires roughly 8 to 15 Mbps depending on quality settings, and a 4K stream needs 25 to 40 Mbps. Your home internet upload speed determines how many simultaneous remote streams your server can support. If upload bandwidth is limited, configure Jellyfin to transcode remote streams to lower bitrates.

Install Client Apps

Jellyfin has official and community-developed client apps for nearly every platform. The web interface works in any modern browser and requires no installation. For mobile devices, Jellyfin offers apps for both iOS and Android through their respective app stores. For living room devices, Jellyfin clients are available for Android TV, Amazon Fire TV, Roku, Apple TV, and LG webOS. The Kodi media center also supports Jellyfin through a dedicated plugin that syncs your library into Kodi's interface.

On each client, connect to your server by entering its address. For local access, use the local IP and port (like http://192.168.1.100:8096). For remote access through a reverse proxy, use your domain name. For VPN access, use the Tailscale or WireGuard IP of your server. Each client stores its connection settings, so you only need to configure this once per device.

Configure user profiles for each household member with individual settings for playback quality, subtitle preferences, parental content ratings, and next-up tracking. Each user gets their own watch history and recommendations without interfering with anyone else's experience.

Key Takeaway

A self-hosted media server with Jellyfin replaces streaming subscriptions with a one-time hardware investment. Start with a mini PC and an external hard drive, organize your media files with consistent naming, enable hardware transcoding, and you will have a personal streaming service that works on every device in your home and remotely.