Create a Media Server with Your FxBlox — How To Install Jellyfin: A Beginners Series

Fierro Labs
7 min readNov 1, 2023

--

We’re going to embark on a quest to cancel our streaming subscriptions and save hundreds of dollars a year! Self-hosting a Jellyfin media server is easier than ever with our good friend Docker.

In the age of digital tracking, having seamless access to our personal library of movies, TV shows, and music is more important than ever. Jellyfin, an open-source media server, steps up to the plate as a versatile solution to organize, stream, and enjoy our media collection. What makes it even better? Running Jellyfin in a Docker container on our FxBlox allows for easy installation, enhanced security, and effective media management.

In this guide, we will learn:

  • What’s DLNA?
  • Why choose Jellyfin?
  • How to install Jellyfin using Docker

Preface

We started this journey of Blox discovery by first learning how to ssh into the FxBlox to start creating our own NAS. If you want to check out the bare basics you can start with:

If you want to learn how to access your Jellyfin server on the go (highly recommend), check out this tutorial to get your Blox server ready:

If you are wondering what is Docker? Check out this quick 6-minute read on Docker for beginners:

What is DLNA?

I like to go over the fundamentals in these guides, so there is one fundamental you might want to know about and that is the Digital Living Network Alliance. DLNA is a set of industry standards and guidelines that enable the sharing of digital media and content among different devices over a local network. A DLNA server is a device or software application that stores and shares media files, such as photos, videos, and music, with other DLNA-certified client devices within the same network.

This is what will enable us to stream our movies and other media from the FxBlox to our TV or other client devices on the same network. So, when you see this setting (along with UPnP) in your router, make sure to not touch it and leave it on.

Plex vs Emby vs Jellyfin

These are all DLNA servers that you may have heard of but let me address this question before someone asks it. What is the difference between Plex, Emby, and Jellyfin? I know there are more media servers, but these are the “big three” (like Dragon Ball, One Piece, and Naruto). These are the best of the rest, because they offer the smoothest experiences, widest device compatibility, and user-friendliest configuration workflows.

The big three self-hosting media servers

Plex is the biggest of the three, because of its compatibility with a multitude of devices. It used to have a people-focused mission, but lately it has been for profit, changed its UI to dramatically change the user experience to a non-favorable one, and is not open source.

Emby has a similar story. Except, they have been here for the people since the beginning. It was an open-source project but has since closed its metaphorical doors. It IS for profit, but it does it in a much more accepted way by the community. Their app is generally community recognized to have the smoothest experience of the three and has about the same level of device compatibility as Plex. Many communities are happy with their subscription or lifetime access licenses, even if there is a free option.

As mentioned in the intro, Jellyfin is an open-source media server, it is actually the community’s derivative of Emby! It shares much of the original code as Emby, before Emby went closed source. It doesn’t have widespread adoption with respect to app and playback support, but it keeps to its roots as being for the people and not for profit. There are features Jellyfin has that Emby or Plex don’t, but the opposite is also true. One of which makes Jellyfin a perfect option for the FxBlox.

Fierro Labs is all about supporting open-source projects and we want to use them as much as possible, which is why we are choosing Jellyfin.

Install Jellyfin with Docker

The FxBlox is uniquely setup, out of the box, to already be running Docker. Before you run any commands, it’s good practice to make sure your system packages are all up-to-date:

sudo apt update && sudo apt upgrade

If you’re like me, you installed additional storage and would like to use that to store your movies and other media.

  1. To do this we need to create the directories where we’re going to store the data. My drive is located at /media/pi/nvme0n1p1, you can find yours by typing:
df -h

2. Now create the following directories:

mkdir -p /media/pi/nvme0n1p1/media-stack/AppData/Config/jellyfin
mkdir -p /media/pi/nvme0n1p1/media-stack/AppData/Cache/jellyfin
mkdir -p /media/pi/nvme0n1p1/media-stack/data/media/music
mkdir -p /media/pi/nvme0n1p1/media-stack/data/media/movies
mkdir -p /media/pi/nvme0n1p1/media-stack/data/media/tv

Note 1: Replace the path to where you want the installation to go on YOUR machine! Also, the -p flag is used to create any parent directories that don’t already exist.

3. Change directory to the newly created media-stack directory:

cd /media/pi/nvme0n1p1/media-stack

4. Now create a file (gif shown below):

vim docker-compose.yml

If you don’t have vim, you can install it with sudo apt install vim

5. Now, press “i” for insert and copy/paste (might need to right-click):

version: '2.1'
services:
jellyfin:
image: lscr.io/linuxserver/jellyfin:latest
container_name: jellyfin
environment:
- PUID=1000
- PGID=1000
- TZ=Americas/Los_Angeles # Change this to your timezone
volumes:
- /media/pi/nvme0n1p1/media-stack/AppData/Config/jellyfin:/config
- /media/pi/nvme0n1p1/media-stack/AppData/Cache/jellyfin:/cache
- /media/pi/nvme0n1p1/media-stack/data/media/music:/music
- /media/pi/nvme0n1p1/media-stack/data/media/movies:/movies
- /media/pi/nvme0n1p1/media-stack/data/media/tv:/tv
restart: unless-stopped
network_mode: 'host'

You can find your timezone code here: List of tz database time zones — Wikipedia

6. Now exit the file by pressing the esc key and type :wq! (as shown in gif). To run the Jellyfin docker container we can now just type:

docker compose up -d

What this will do is download and start Jellyfin in the background.

gif of steps 4–6

If you’re interested, this is an explanation of what each instruction does:

  • jellyfin: This is the name of the service or container. It’s user-defined and can be used to reference this container within the Compose file.
  • image: jellyfin/jellyfin:latest. This line specifies the Docker image that will be used to create the “jellyfin” container. In this case, it uses the official Jellyfin image from Docker Hub.
  • container_name: jellyfin. It sets the name of the container to “jellyfin.” Can be referenced with this name from the same docker network.
  • environment: This section defines environment variables for the container.
  • PUID:PGID=1000 Is used to specify the user and group inside the container. In this case we just use the pi user and group it’s in.
  • network_mode: ‘host’. Think of this line as what enables Network Discovery on your home network. With this set to “host”, you could find and cast to your smart TV’s. It uses the host’s network stack.
  • volumes: This section defines what folders Jellyfin will have access to. We use this to include paths to our Movies, Music, and tv shows. The folders config and cache are necessary for Jellyfin to function.
  • restart: ‘unless-stopped’. Means that the container will automatically start when your device boots up. Won’t stop unless it is explicitly stopped by the user.

Accessing Jellyfin

7. If set up a domain name and port forwarding, then you can access your Jellyfin server by going to domain.tld:8096. Otherwise, you can go to:

http://<ip-of-blox>:8096
or
localhost:8096

Now we can follow the instructions to set up a username and password.

8. Now let’s proceed to select our Movies folder. In this section, just select your language + region and accept the rest of the defaults.

9. And if we have additional folders mounted from step 5, then we can connect those now.

Congrats! All that's left to do is let the FxBlox load the media and search online repositories for artwork and other metadata. We can start enjoying our videos, or in my case, music streamed straight from the FxBlox as soon as it starts populating.

Conclusion

HOORAY!! You have just completed step one in sticking it to the man! I’m excited to go down this journey, because of the fact that we don’t own our digital purchases. At any point in time, centralized services like Google or Apple, could take it all away if they ever decide to shut down their services. (Looking at you Google *cough Google Play Music*). That is why it is imperative we learn how to take control of our own data.

In addition, we will explore the world of movie downloading servers to gain self-hosted access to movies we have already digitally purchased! So, sit back, relax, and enjoy the endless possibilities of your media server on FxBlox.

Follow my YouTube channel for more web 3 content. Follow my Medium blog for more personal experience content and tutorials. Find me on X at @legendofmar. Checkout the Functionland Telegram for support and updates. Cheers!

--

--

Fierro Labs

Fierro Labs is a Web3 content and documentation creative studio. In this blog we talk about and make guides on IT and Web3 topics! Email: marco@fierrolabs.com