Signup for our newsletter to get notified about sales and new products. Add any text here or remove it.
No products in the cart.
The Jellyfin project and its contributors offer a number of pre-built binary packages to assist in getting Jellyfin up and running quickly on multiple systems.
Official container image: jellyfin/jellyfin .
LinuxServer.io image: linuxserver/jellyfin .
hotio image: hotio/jellyfin .
Jellyfin distributes official container images on Docker Hub for multiple architectures. These images are based on Debian and built directly from the Jellyfin source code.
Additionally the LinuxServer.io project and hotio distribute images based on Ubuntu and the official Jellyfin Ubuntu binary packages, see here and here to see their Dockerfile.
For ARM hardware and RPi, it is recommended to use the LinuxServer.io or hotio image since hardware acceleration support is not yet available on the native image.
Docker allows you to run containers on Linux, Windows and MacOS.
The basic steps to create and run a Jellyfin container using Docker are as follows.
docker pull jellyfin/jellyfin
docker volume create jellyfin-config docker volume create jellyfin-cache
mkdir /path/to/config mkdir /path/to/cache
The default network mode for Docker is bridge mode. Bridge mode will be used if host mode is omitted. Use host mode for networking in order to use DLNA or an HDHomeRun.
Using Docker command line interface:
docker run -d \
--name jellyfin \
--user uid:gid \
--volume /path/to/config:/config \
--volume /path/to/cache:/cache \
--mount type=bind,source=/path/to/media,target=/media \
Using host networking (--net=host) is optional but required in order to use DLNA or HDHomeRun.
Bind Mounts are needed to pass folders from the host OS to the container OS whereas volumes are maintained by Docker and can be considered easier to backup and control by external programs. For a simple setup, it’s considered easier to use Bind Mounts instead of volumes. Replace jellyfin-config and jellyfin-cache with /path/to/config and /path/to/cache respectively if using bind mounts. Multiple media libraries can be bind mounted if needed:
There is currently an issue with read-only mounts in Docker. If there are submounts within the main mount, the submounts are read-write capable.
Using Docker Compose:
Create a docker-compose.yml file with the following contents:
# Optional - alternative address used for autodiscovery
Then while in the same folder as the docker-compose.yml run:
To run the container in background add -d to the above command.
You can learn more about using Docker by reading the official Docker documentation.
An Unraid Docker template is available in the repository.
A community project to deploy Jellyfin on Kubernetes-based platforms exists at their repository. Any issues or feature requests related to deployment on Kubernetes-based platforms should be filed there.
Podman allows you to run containers as non-root. It’s also the offically supported container solution on RHEL and CentOS.
Steps to run Jellyfin using Podman are almost identical to Docker steps:
dnf install -y podman
podman pull jellyfin/jellyfin
podman volume create jellyfin-config podman volume create jellyfin-cache
podman run \ --cgroup-manager=systemd \ --volume jellyfin-config:/config \ --volume jellyfin-cache:/cache \ --volume jellyfin-media:/media \ -p 8096:8096 \ --label "io.containers.autoupdate=image" \ --name myjellyfin \ jellyfin/jellyfin
Note that Podman doesn’t require root access and it’s recommended to run the Jellyfin container as a separate non-root user for security.
Keep in mind that the --label "io.containers.autoupdate=image" flag will allow the container to be automatically updated via podman auto-update.
If SELinux is enabled you need to use either the z (shared volume) or Z (private volume) volume option to allow Jellyfin to access the volumes.
Replace jellyfin-config, jellyfin-cache, and jellyfin-media with /path/to/config, /path/to/cache and /path/to/media respectively if using bind mounts.
To mount your media library read-only append ‘:ro’ to the media volume:
To run as a systemd service see Running containers with Podman and shareable systemd services.
As always it is recommended to run the container rootless. Therefore we want to manage the container with the systemd --user flag.
podman generate systemd --new --name myjellyfin > ~/.config/systemd/user/container-myjellyfin.service
# container-myjellyfin.service # autogenerated by Podman 2.2.1 # Wed Feb 17 23:49:24 EST 2021 [Unit] Description=Podman container-myjellyfin.service Documentation=man:podman-generate-systemd(1) Wants=network.target After=network-online.target [Service] Environment=PODMAN_SYSTEMD_UNIT=%n Restart=on-failure ExecStartPre=/bin/rm -f %t/container-myjellyfin.pid %t/container-myjellyfin.ctr-id ExecStart=/usr/bin/podman run --conmon-pidfile %t/container-myjellyfin.pid --cidfile %t/container-myjellyfin.ctr-id --cgroups=no-conmon -d --replace --cgroup-manager=systemd --volume jellyfin-config:/config:z --volume jellyfin-cache:/cache:z --volume jellyfin-media:/media:z -p 8096:8096 --userns keep-id --name myjellyfin jellyfin/jellyfin ExecStop=/usr/bin/podman stop --ignore --cidfile %t/container-myjellyfin.ctr-id -t 10 ExecStopPost=/usr/bin/podman rm --ignore -f --cidfile %t/container-myjellyfin.ctr-id PIDFile=%t/container-myjellyfin.pid KillMode=control-group Type=forking # Security Features PrivateTmp=yes NoNewPrivileges=yes ProtectSystem=strict ProtectHome=yes ProtectKernelTunables=yes ProtectControlGroups=yes PrivateMounts=yes ProtectHostname=yes [Install] WantedBy=multi-user.target default.target
systemctl --user enable container-myjellyfin.service
loginctl enable-linger <username>
systemctl --user start container-myjellyfin.service
Cloudron is a complete solution for running apps on your server and keeping them up-to-date and secure. On your Cloudron you can install Jellyfin with a few clicks via the app library and updates are delivered automatically.
The source code for the package can be found here. Any issues or feature requests related to deployment on Cloudron should be filed there.
Windows installers and builds in ZIP archive format are available here.
If you installed a version prior to 10.4.0 using a PowerShell script, you will need to manually remove the service using the command nssm remove Jellyfin and uninstall the server by remove all the files manually. Also one might need to move the data files to the correct location, or point the installer at the old location.
nssm remove Jellyfin
The Basic Install is the recommended way to run the Jellyfin Server. Using the Advanced/Service mode may experience FFmpeg Hardware Acceleration issues, and is only for advanced users.
Add or remove programs
<--Your install path-->\jellyfin\system\jellyfin.exe
<--Your install path-->\jellyfin\system\jellyfin.exe -d <--Your install path-->\jellyfin\data
<--Your install path-->\jellyfin\system\jellyfin.exe -d <--Your install path-->\jellyfin\data -noautorunwebapp
macOS Application packages and builds in TAR archive format are available here.
This will delete all settings and user information. This applies for the .app package and the portable version.
Closing the terminal window will end Jellyfin. Running Jellyfin in screen or tmux can prevent this from happening.
Upgrading the Portable Version
Uninstalling the Portable Version
Using FFmpeg with the Portable Version
The portable version doesn’t come with FFmpeg by default, so to install FFmpeg you have three options.
brew install ffmpeg
More detailed download options, documentation, and signatures can be found.
If using static build, extract it to the /Applications/ folder.
Navigate to the Playback tab in the Dashboard and set the path to FFmpeg under FFmpeg Path.
Generic amd64 Linux builds in TAR archive format are available here.
Create a directory in /opt for jellyfin and its files, and enter that directory.
sudo mkdir /opt/jellyfin
Download the latest generic Linux build from the release page. The generic Linux build ends with “linux-amd64.tar.gz“. The rest of these instructions assume version 10.4.3 is being installed (i.e. jellyfin_10.4.3_linux-amd64.tar.gz). Download the generic build, then extract the archive:
sudo wget https://github.com/jellyfin/jellyfin/releases/download/v10.4.3/jellyfin_10.4.3_linux-amd64.tar.gz
sudo tar xvzf jellyfin_10.4.3_linux-amd64.tar.gz
Create a symbolic link to the Jellyfin 10.4.3 directory. This allows an upgrade by repeating the above steps and enabling it by simply re-creating the symbolic link to the new version.
sudo ln -s jellyfin_10.4.3 jellyfin
Create four sub-directories for Jellyfin data.
sudo mkdir data cache config log
If you are running Debian or a derivative, you can also download and install an ffmpeg release built specifically for Jellyfin. Be sure to download the latest release that matches your OS (4.2.1-5 for Debian Stretch assumed below).
sudo wget https://repo.jellyfin.org/releases/server/debian/versions/jellyfin-ffmpeg/4.2.1-5/jellyfin-ffmpeg_4.2.1-5-stretch_amd64.deb
sudo dpkg --install jellyfin-ffmpeg_4.2.1-5-stretch_amd64.deb
If you run into any dependency errors, run this and it will install them and jellyfin-ffmpeg.
sudo apt install -f
Due to the number of command line options that must be passed, it is easiest to create a small script to run Jellyfin.
sudo nano jellyfin.sh
Then paste the following commands and modify as needed.
-d $JELLYFINDIR/data \
-C $JELLYFINDIR/cache \
-c $JELLYFINDIR/config \
-l $JELLYFINDIR/log \
Assuming you desire Jellyfin to run as a non-root user, chmod all files and directories to your normal login user and group. Also make the startup script above executable.
sudo chown -R user:group *
sudo chmod u+x jellyfin.sh
Finally you can run it. You will see lots of log information when run, this is normal. Setup is as usual in the web browser.
Platform-agnostic .NET Core DLL builds in TAR archive format are available here. These builds use the binary jellyfin.dll and must be loaded with dotnet.
Jellyfin can be found in the AUR as jellyfin, jellyfin-bin and jellyfin-git.
Fedora builds in RPM package format are available here for now but an official Fedora repository is coming soon.
sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
sudo dnf install (link to version jellyfin server you want to install)
sudo dnf install (link to web RPM you want to install)
sudo systemctl start jellyfin
sudo systemctl enable jellyfin
sudo firewall-cmd --permanent --add-service=jellyfin
sudo systemctl reboot
CentOS/RHEL 7 builds in RPM package format are available here and an official CentOS/RHEL repository is planned for the future.
The default CentOS/RHEL repositories don’t carry FFmpeg, which the RPM requires. You will need to add a third-party repository which carries FFmpeg, such as RPM Fusion’s Free repository.
You can also build Jellyfin’s version on your own. This includes gathering the dependencies and compiling and installing them. Instructions can be found at the FFmpeg wiki.
The Jellyfin team provides a Debian repository for installation on Debian Stretch/Buster. Supported architectures are amd64, arm64, and armhf.
Microsoft does not provide a .NET for 32-bit x86 Linux systems, and hence Jellyfin is not supported on the i386 architecture.
Steps 1 to 3 can also be replaced by:
sudo apt install extrepo
sudo extrepo enable jellyfin
sudo apt install apt-transport-https gnupg lsb-release
wget -O - https://repo.jellyfin.org/debian/jellyfin_team.gpg.key | sudo apt-key add -
echo "deb [arch=$( dpkg --print-architecture )] https://repo.jellyfin.org/debian $( lsb_release -c -s ) main" | sudo tee /etc/apt/sources.list.d/jellyfin.list
sudo apt update
sudo apt install jellyfin
sudo service jellyfin status sudo systemctl restart jellyfin sudo /etc/init.d/jellyfin stop
Raw Debian packages, including old versions, are available here.
The repository is the preferred way to obtain Jellyfin on Debian, as it contains several dependencies as well.
sudo dpkg -i jellyfin_*.deb jellyfin-ffmpeg_*.deb
sudo apt -f install
Previous versions of Jellyfin included Ubuntu under the Debian repository. This has now been split out into its own repository to better handle the separate binary packages. If you encounter errors about the ubuntu release not being found and you previously configured an ubuntu jellyfin.list file, please follow these steps.
sudo rm /etc/apt/sources.list.d/jellyfin.list
The Jellyfin team provides an Ubuntu repository for installation on Ubuntu Xenial, Bionic, Cosmic, Disco, Eoan, and Focal. Supported architectures are amd64, arm64, and armhf. Only amd64 is supported on Ubuntu Xenial.
sudo apt install apt-transport-https
sudo add-apt-repository universe
sudo apt-get install software-properties-common
wget -O - https://repo.jellyfin.org/ubuntu/jellyfin_team.gpg.key | sudo apt-key add -
echo "deb [arch=$( dpkg --print-architecture )] https://repo.jellyfin.org/ubuntu $( lsb_release -c -s ) main" | sudo tee /etc/apt/sources.list.d/jellyfin.list
Raw Ubuntu packages, including old versions, are available here.
The repository is the preferred way to install Jellyfin on Ubuntu, as it contains several dependencies as well.
sudo add-apt-repository universe sudo apt update
sudo apt install at libsqlite3-0 libfontconfig1 libfreetype6 libssl1.0.0
It’s possible to map your local installation’s files to the official docker image.
You need to have exactly matching paths for your files inside the docker container! This means that if your media is stored at /media/raid/ this path needs to be accessible at /media/raid/ inside the docker container too – the configurations below do include examples.
To guarantee proper permissions, get the uid and gid of your local jellyfin user and jellyfin group by running the following command:
You need to replace the <uid>:<gid> placeholder below with the correct values.
docker run -d \
--user <uid>:<gid> \
-e JELLYFIN_CACHE_DIR=/var/cache/jellyfin \
-e JELLYFIN_CONFIG_DIR=/etc/jellyfin \
-e JELLYFIN_DATA_DIR=/var/lib/jellyfin \
-e JELLYFIN_LOG_DIR=/var/log/jellyfin \
--volume </path/to/media>:</path/to/media> \
Powered by BetterDocs
Username or email address *
Lost your password?