diff --git a/manuscript/book.txt b/manuscript/book.txt index 59f37a0..6233374 100644 --- a/manuscript/book.txt +++ b/manuscript/book.txt @@ -39,6 +39,7 @@ recipes/emby.md recipes/homeassistant.md recipes/homeassistant/ibeacon.md recipes/huginn.md +recipes/jellyfin.md recipes/kanboard.md recipes/miniflux.md recipes/munin.md diff --git a/manuscript/ha-docker-swarm/docker-swarm-mode.md b/manuscript/ha-docker-swarm/docker-swarm-mode.md index 2713c98..99c2230 100644 --- a/manuscript/ha-docker-swarm/docker-swarm-mode.md +++ b/manuscript/ha-docker-swarm/docker-swarm-mode.md @@ -139,8 +139,8 @@ If your swarm runs for a long time, you might find yourself running older contai Create /var/data/config/shepherd/shepherd.env as follows: ``` -# Don't auto-update Plex or Emby, I might be watching a movie! (Customize this for the containers you _don't_ want to auto-update) -BLACKLIST_SERVICES="plex_plex emby_emby" +# Don't auto-update Plex or Emby (or Jellyfin), I might be watching a movie! (Customize this for the containers you _don't_ want to auto-update) +BLACKLIST_SERVICES="plex_plex emby_emby jellyfin_jellyfin" # Run every 24 hours. Note that SLEEP_TIME appears to be in seconds. SLEEP_TIME=86400 ``` diff --git a/manuscript/images/jellyfin.png b/manuscript/images/jellyfin.png new file mode 100644 index 0000000..96abba9 Binary files /dev/null and b/manuscript/images/jellyfin.png differ diff --git a/manuscript/recipes/autopirate.md b/manuscript/recipes/autopirate.md index c25b5be..a0df43e 100644 --- a/manuscript/recipes/autopirate.md +++ b/manuscript/recipes/autopirate.md @@ -24,7 +24,7 @@ Tools included in the AutoPirate stack are: * **[Mylar](https://github.com/evilhero/mylar)** : finds, downloads and manages comic books * **[Headphones](https://github.com/rembo10/headphones)** : finds, downloads and manages music * **[Lazy Librarian](https://github.com/itsmegb/LazyLibrarian)** : finds, downloads and manages ebooks -* **[Ombi](https://github.com/tidusjar/Ombi)** : provides an interface to request additions to a [Plex](/recipes/plex/)/[Emby](/recipes/emby/) library using the above tools +* **[Ombi](https://github.com/tidusjar/Ombi)** : provides an interface to request additions to a [Plex](/recipes/plex/)/[Emby](/recipes/emby/)/[Jellyfin](/recipes/jellyfin/) library using the above tools * **[Jackett](https://github.com/Jackett/Jackett)** : Provides an local, caching, API-based interface to torrent trackers, simplifying the way your tools search for torrents. Since this recipe is so long, and so many of the tools are optional to the final result (_i.e., if you're not interested in comics, you won't want Mylar_), I've described each individual tool on its own sub-recipe page (_below_), even though most of them are deployed very similarly. diff --git a/manuscript/recipes/autopirate/ombi.md b/manuscript/recipes/autopirate/ombi.md index bdfd5d3..75f3296 100644 --- a/manuscript/recipes/autopirate/ombi.md +++ b/manuscript/recipes/autopirate/ombi.md @@ -8,10 +8,10 @@ * Lets users request Movies and TV Shows (_whether it being the entire series, an entire season, or even single episodes._) * Easily manage your requests User management system (_supports plex.tv, Emby and local accounts_) -* A landing page that will give you the availability of your Plex/Emby server and also add custom notification text to inform your users of downtime. +* A landing page that will give you the availability of your Plex/Emby/Jellyfin server and also add custom notification text to inform your users of downtime. * Allows your users to get custom notifications! * Will show if the request is already on plex or even if it's already monitored. -Automatically updates the status of requests when they are available on Plex/Emby +Automatically updates the status of requests when they are available on Plex/Emby/Jellyfin ![Ombi Screenshot](../../images/ombi.png) diff --git a/manuscript/recipes/jellyfin.md b/manuscript/recipes/jellyfin.md new file mode 100644 index 0000000..5fbeff5 --- /dev/null +++ b/manuscript/recipes/jellyfin.md @@ -0,0 +1,98 @@ +# Jellyfin + +[Jellyfin](https://jellyfin.org/) is best described as "_like [Emby](/recipes/emby) but really [FOSS](https://en.wikipedia.org/wiki/Free_and_open-source_software)_". + +![Jellyfin Screenshot](../images/jellyfin.png) + +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](https://jellyfin.org/docs/general/about.html). + +## Ingredients + +1. [Docker swarm cluster](/ha-docker-swarm/design/) with [persistent shared storage](/ha-docker-swarm/shared-storage-ceph.md) +2. [Traefik](/ha-docker-swarm/traefik) configured per design +3. DNS entry for the hostname you intend to use, pointed to your [keepalived](ha-docker-swarm/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: + +!!! tip + I share (_with my [sponsors](https://github.com/sponsors/funkypenguin)_) a private "_premix_" git repository, which includes necessary docker-compose and env files for all published recipes. This means that sponsors can launch any recipe with just a ```git pull``` and a ```docker stack deploy``` 👍 + + +``` +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](/reference/networks/) here. + + +## Serving + +### Launch Jellyfin stack + +Launch the stack by running ```docker stack deploy jellyfin -c ``` + +Log into your new instance at https://**YOUR-FQDN**, and complete the wizard-based setup to complete deploying your Jellyfin. + +## Chef's Notes 📓 + +1. I didn't use an [oauth2_proxy](/reference/oauth_proxy/) for this stack, because it would interfere with mobile client support. +2. Got an NVIDIA GPU? See [this blog post](https://www.funkypenguin.co.nz/note/gpu-transcoding-with-emby-plex-using-docker-nvidia/) re how to use your GPU to transcode your media! +3. We don't bother exposing the HTTPS port for Jellyfin, since [Traefik](/ha-docker-swarm/traefik/) is doing the SSL termination for us already. diff --git a/manuscript/reference/networks.md b/manuscript/reference/networks.md index 1b07782..88ebda5 100644 --- a/manuscript/reference/networks.md +++ b/manuscript/reference/networks.md @@ -53,4 +53,5 @@ In order to avoid IP addressing conflicts as we bring swarm networks up/down, we | [Harbor](https://geek-cookbook.funkypenguin.co.nz/recipes/graylog/) | 172.16.53.0/24 | | [Harbor-Clair](https://geek-cookbook.funkypenguin.co.nz/recipes/graylog/) | 172.16.54.0/24 | | [Duplicati](https://geek-cookbook.funkypenguin.co.nz/recipes/duplicati/) | 172.16.55.0/24 | -| [Restic](https://geek-cookbook.funkypenguin.co.nz/recipes/restic/) | 172.16.56.0/24 | \ No newline at end of file +| [Restic](https://geek-cookbook.funkypenguin.co.nz/recipes/restic/) | 172.16.56.0/24 | +| [Jellyfin](https://geek-cookbook.funkypenguin.co.nz/recipes/jellyfin/) | 172.16.57.0/24 | diff --git a/mkdocs.yml b/mkdocs.yml index fc388e4..57fe0f8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -83,6 +83,7 @@ nav: - Start: recipes/homeassistant.md - iBeacon: recipes/homeassistant/ibeacon.md - Huginn: recipes/huginn.md + - Jellyfin: recipes/jellyfin.md - Kanboard: recipes/kanboard.md - KeyCloak: - Start: recipes/keycloak.md