selfhosted-apps-docker/jellyfin
DoTheEvo 6b66bd63d0 update 2022-01-09 17:06:59 +01:00
..
readme.md update 2022-01-09 17:06:59 +01:00

readme.md

Jellyfin in docker

guide-by-example

logo

Purpose & Overview

WORK IN PROGRESS
WORK IN PROGRESS
WORK IN PROGRESS

Stream movies/tv-shows/music to a browser, or a large selection of devices and services.

Jellyfin if a free media system, an alternative to proprietary Plex.
The core server side is written in C#, web client in Javascript, and a number of other clients written in various languages and frameworks.

Starting point for me was this viggy96 repo

Files and directory structure

/mnt/
└── bigdisk/
    ├── tv/
    ├── movies/
    └── music/
/home/
└── ~/
    └── docker/
        └── jellyfin/
            ├── jellyfin-cache/
            ├── jellyfin-config/
            ├── transcodes/
            ├── .env
            ├── docker-compose.yml
            └── jellyfin-backup-script.sh
  • /mnt/bigdisk/... - a mounted media storage share
  • jellyfin-cache/ - cache
  • jellyfin-config/ - configuration
  • transcodes/ - transcoded video storage
  • .env - a file containing environment variables for docker compose
  • docker-compose.yml - a docker compose file, telling docker how to run the containers
  • jellyfin-backup-script.sh - a backup script if you want it

You only need to provide the files.
The directories are created by docker compose on the first run.

docker-compose

The media are mounted in read only mode.

docker-compose.yml

services:

  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    hostname: jellyfin
    restart: unless-stopped
    env_file: .env
    devices:
      - /dev/dri
    volumes:
      - ./transcodes/:/transcodes
      - ./jellyfin-config:/config
      - ./jellyfin-cache:/cache
      - /mnt/bigdisk/serialy:/media/video:ro
      - /mnt/bigdisk/mp3/moje:/media/music:ro
    expose:
      - 8096
    ports:
      - 1900:1900/udp

networks:
  default:
    name: $DOCKER_MY_NETWORK
    external: true

.env

# GENERAL
MY_DOMAIN=example.com
DOCKER_MY_NETWORK=caddy_net
TZ=Europe/Bratislava

All containers must be on the same network.
Which is named in the .env file.
If one does not exist yet: docker network create caddy_net

Reverse proxy

Caddy is used, details here.

Caddyfile

jellyfin.{$MY_DOMAIN} {
    reverse_proxy jellyfin:8096
}

First run

interface-pic

Specifics of my setup

  • no long term use yet

  • no gpu, so no experience with hw transcoding

  • media files are stored and shared on trunas scale VM and mounted directly on the docker host using systemd mounts, instead of fstab or autofs.

    /etc/systemd/system/mnt-bigdisk.mount

    [Unit]
    Description=12TB truenas mount
    
    [Mount]
    What=//10.0.19.19/Dataset-01
    Where=/mnt/bigdisk
    Type=cifs
    Options=ro,username=ja,password=qq,file_mode=0700,dir_mode=0700,uid=1000
    DirectoryMode=0700
    
    [Install]
    WantedBy=multi-user.target
    

    /etc/systemd/system/mnt-bigdisk.automount

    [Unit]
    Description=12TB truenas mount
    
    [Automount]
    Where=/mnt/bigdisk
    
    [Install]
    WantedBy=multi-user.target
    

    to automount on boot - sudo systemctl start mnt-bigdisk.automount

Update

Manual image update:

  • docker-compose pull
  • docker-compose up -d
  • docker image prune

Backup and restore

Backup

Using borg that makes daily snapshot of the entire directory.

Restore

  • down the bookstack containers docker-compose down
  • delete the entire bookstack directory
  • from the backup copy back the bookstack directory
  • start the containers docker-compose up -d

Backup of just user data

dont care