Skip to main content
Martin Hähnel

Trying Out Jellyfin

Changelog

  • 2026-01-06 - fixed a link, fixed a duplicated word

Jellyfin is a full-fledged media server for all kinds of media. "[It] enables you to collect, manage, and stream your media" according to their website. But what the hell does that even mean?

Well, maintaining a Jellyfin instance allows you to have a centralized access point for all your music, movies, tv shows, etc. that you own. It can also do photos and home videos, but I am only using it (or intent to use it) for non-personal media. So music, movies and shows (for now). Having everything in one spot and then streaming it from there allows you to follow a single source of truth approach to your media: All the files are there and all the clean metadata with it as well: You stream from this media server only. So decay of data and data loss e.g. from moving from one device to the next should be minimal.

The way you access your media from this server is by using a client. Jellyfin itself provides a client, but there are others. One that caught my eye was manet that seems very nice.

If you have a server on the internet (like I have nowadays) and you use Coolify (like I do, although not without some reservations... I mean seriously?!), installing Jellyfin is super easy.

This is a four minute video that shows how it's done.

However in order to use it, you'll have to change the compose file that it comes with. The person making that video only mentioned it (and gave incomplete advice in the comments) but didn't really explain how to set it up.

You see, Jellyfin expects you to upload files to your server on your own. It doesn't offer upload capabilities. But since Coolify is Docker based and the Jellyfin that is so easy to install is docker compose based, AND Coolify's own files in /data/coolify are root-owned, you'll have to use what is called a volume (bind) mount and point to a location outside coolify's file tree. If you've followed the video from above, around 2:38 you'll see how he opens up the docker-compose file in the Coolify web ui and talks about changes that have to be made.

Here's what I'll add to make Jellyfin actually work on servers (especially if your standard vps user isn't root which it shouldn't be):

  1. Jellyfin has a concept called a library that hold different kinds of media types. The Coolify standard install only includes a predefined setup for tv shows and movies. But what if you want one for music? Well, you just create one. Same with e.g. photos or whatever: You can create new volume mounts (see below) for all library types and make it so that Jellyfin can access them.[1]
  2. As I said, the initial setup is kind of useless, as you can't access the docker-volumes from the host directly (I mean you can, but it'd be a pain). So we'll instead tell Coolify/docker that it is supposed to make a specific folder on the host available inside Jellyfin's container. Let's say we setup /srv/media/music on the actual server.[2] We can change the config in such a way that /data/music inside the container shows the contents of /srv/media/music on the server. We'll also need to make sure that our normal user can write to /srv/media/music.
  3. Finally we can use something like Cyberduck to move files from our local machine to /srv/media using sftp.[3]

Alright. Let's start with the docker compose file. Here's how the volumes portion my file looks now:

services:
  jellyfin:
# ...
    volumes:
      - 'jellyfin-config:/config'
      - '/srv/media/tvshows:/data/tvshows'
      - '/srv/media/movies:/data/movies'
      - '/srv/media/music:/data/music'

Then I added the directories on the actual server:

$ ssh vps
$ # ...
$ sudo mkdir -p /srv/media
$ sudo chown -R user:user /srv/media # user your actual login user here
$ cd media
$ mkdir music tvshows movies

Finally I restarted/redoployed my Jellyfin instance in Coolify. Et voilà: I can now add a new library using the container path (f.x. /data/music).[4] If I want to add new albums to my library, I fire up Cyberduck and copy files with it, skipping any files the server already has.


  1. Think of a library as a directory with a certain file/folder structure within. Here's an example for a music library. ↩︎

  2. srv is meant for "site-specific data which is served by this system. This main purpose of specifying this is so that users may find the location of the data files for particular service. [...]". I think that fits reasonably well for our use case here. Allthough I opted to name the "service" this data belongs to somewhat agnostically "media". Don't use /media btw. ↩︎

  3. Cyberduck is smart about skipping over files that the server already has if you instruct it to do so and is easier to use than rsync. ↩︎

  4. Don't worry if you already skipped ahead in the setup wizzard: I did the same. You can add libraries later. You can also add new volume mounts for let's say books (no idea how good or bad Jellyfin is for books, yet) later. Just follow the template above. ↩︎