1
0
mirror of https://github.com/funkypenguin/geek-cookbook/ synced 2025-12-13 01:36:23 +00:00
Files
geek-cookbook/manuscript/recipes/jellyfin.md

3.3 KiB

Jellyfin

Jellyfin is best described as "like Emby but really FOSS".

Jellyfin Screenshot

If it looks very similar as Emby, is because it started as a fork of it, but it has evolve since them. For a complete explanation of the why, look here.

Ingredients

  1. Docker swarm cluster with persistent shared storage
  2. Traefik configured per design
  3. DNS entry for the hostname you intend to use, pointed to your keepalived IP

Preparation

Setup data locations

We'll need a location to store Jellyfin's library data, config files, logs and temporary transcoding space, so create /var/data/jellyfin, and make sure it's owned by the user and group who also own your media data.

mkdir /var/data/jellyfin

Also if we want to avoid the cache to be part of the backup, we should create a location to map it on the runtime folder. It also has to be owned by the user and group who also own your media data.

mkdir /var/data/runtime/jellyfin

Prepare environment

Create jellyfin.env, and populate with PUID/GUID for the user who owns the /var/data/jellyfin directory (above) and your actual media content (in this example, the media content is at /srv/data)

PUID=
GUID=

Setup Docker Swarm

Create a docker swarm config file in docker-compose syntax (v3), something like this:

--8<-- "premix-cta.md"

version: "3.0"

services:
  jellyfin:
    image: jellyfin/jellyfin
    env_file: /var/data/config/jellyfin/jellyfin.env
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/data/jellyfin:/config
      - /var/data/runtime/jellyfin:/cache
      - /var/data/jellyfin/jellyfin:/config
      - /srv/data/:/data
    deploy:
      labels:
        - traefik.frontend.rule=Host:jellyfin.example.com
        - traefik.docker.network=traefik_public
        - traefik.port=8096
    networks:
        - traefik_public
        - internal
    ports:
      - 8096:8096

networks:
  traefik_public:
    external: true
  internal:
    driver: overlay
    ipam:
      config:
        - subnet: 172.16.57.0/24

!!! note Setup unique static subnets for every stack you deploy. This avoids IP/gateway conflicts which can otherwise occur when you're creating/removing stacks a lot. See my list here.

Serving

Launch Jellyfin stack

Launch the stack by running docker stack deploy jellyfin -c <path -to-docker-compose.yml>

Log into your new instance at https://YOUR-FQDN, and complete the wizard-based setup to complete deploying your Jellyfin.

--8<-- "recipe-footer.md"