Merge branch 'master' into pr/867

This commit is contained in:
felix920506
2025-06-25 15:56:36 +01:00
231 changed files with 16479 additions and 8738 deletions
+2
View File
@@ -1,3 +1,5 @@
.github/ @jellyfin/core
blog/ @jellyfin/core
src/data/ @jellyfin/core
docs/general/about.md @jellyfin/core
docs/general/community-standards.md @joshuaboniface
+10 -3
View File
@@ -1,11 +1,18 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["github>jellyfin/.github//renovate-presets/nodejs", ":semanticCommitsDisabled"],
"extends": [
"github>jellyfin/.github//renovate-presets/nodejs",
":semanticCommitsDisabled"
],
"packageRules": [
{
"description": "Disable major updates for React",
"matchPackagePrefixes": ["react"],
"matchPackageNames": ["@types/react", "@types/react-helmet", "@types/react-router-dom"],
"matchPackageNames": [
"@types/react",
"@types/react-helmet",
"@types/react-router-dom",
"react{/,}**"
],
"matchUpdateTypes": "major",
"enabled": false
}
+92 -9
View File
@@ -1,7 +1,11 @@
name: build
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
on:
pull_request:
pull_request_target:
branches: [master]
push:
branches: [master]
@@ -16,23 +20,31 @@ jobs:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
cache: npm
node-version: 20
- uses: actions/configure-pages@1f0c5cde4bc74cd7e1254d0cb4de8d49e9068c7d # v4.0.0
- uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0
- name: Run build
run: |
npm ci
npm ci --no-audit
npm run build
- name: Upload artifact
if: github.event_name != 'pull_request'
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: jellyfin-org__build
path: build
- name: Upload pages artifact
if: github.event_name == 'push'
uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3.0.1
with:
path: ./build
path: build
deploy:
if: github.event_name != 'pull_request'
if: github.event_name == 'push'
name: Deploy to GitHub Pages
concurrency: build-deploy-pages
environment:
@@ -43,4 +55,75 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@decdde0ac072f6dcbe43649d82d9c635fff5b4e4 # v4.0.4
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5
publish:
if: github.event_name != 'push' && github.repository == 'jellyfin/jellyfin.org'
name: Deploy to Cloudflare Pages
runs-on: ubuntu-latest
needs: build
steps:
- name: Add comment
uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3.0.1
if: github.event_name == 'pull_request_target'
with:
github-token: ${{ secrets.JF_BOT_TOKEN }}
message: |
## Cloudflare Pages deployment
| **Latest commit** | <code>${{ github.event.pull_request.head.sha || github.sha }}</code> |
|-------------------|:-:|
| **Status** | 🔄 Deploying... |
| **Preview URL** | Not available |
| **Type** | 🔀 Preview |
pr-number: ${{ github.event.pull_request.number }}
comment-tag: CFPages-deployment
mode: recreate
- name: Download workflow artifact
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: jellyfin-org__build
path: build
- name: Publish to Cloudflare
id: cf
uses: cloudflare/wrangler-action@da0e0dfe58b7a431659754fdf3f186c529afbe65 # v3.14.1
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy build --project-name=jellyfin-org --branch=${{
(github.event_name != 'pull_request_target' || github.event.pull_request.head.repo.full_name == github.repository)
&& (github.event.pull_request.head.ref || github.ref_name)
|| format('{0}/{1}', github.event.pull_request.head.repo.full_name, github.event.pull_request.head.ref)
}} --commit-hash=${{ github.event.pull_request.head.sha || github.sha }}
- name: Update status comment (Success)
if: ${{ github.event_name == 'pull_request_target' && success() }}
uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3.0.1
with:
github-token: ${{ secrets.JF_BOT_TOKEN }}
message: |
## Cloudflare Pages deployment
| **Latest commit** | <code>${{ github.event.pull_request.head.sha || github.sha }}</code> |
|-------------------|:-:|
| **Status** | ✅ Deployed! |
| **Preview URL** | ${{ steps.cf.outputs.deployment-url != '' && steps.cf.outputs.deployment-url || 'Not available' }} |
| **Type** | 🔀 Preview |
pr-number: ${{ github.event.pull_request.number }}
comment-tag: CFPages-deployment
mode: recreate
- name: Update status comment (Failure)
if: ${{ github.event_name == 'pull_request_target' && failure() }}
uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3.0.1
with:
github-token: ${{ secrets.JF_BOT_TOKEN }}
message: |
## Cloudflare Pages deployment
| **Latest commit** | <code>${{ github.event.pull_request.head.sha || github.sha }}</code> |
|-------------------|:-:|
| **Status** | ❌ Failure. Check workflow logs for details |
| **Preview URL** | Not available |
| **Type** | 🔀 Preview |
pr-number: ${{ github.event.pull_request.number }}
comment-tag: CFPages-deployment
mode: recreate
+3 -3
View File
@@ -13,10 +13,10 @@ jobs:
steps:
- name: Check out Git repository
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Set up Node.js
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 20
check-latest: true
@@ -33,7 +33,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Set up problem matcher
uses: xt0rted/markdownlint-problem-matcher@1a5fabfb577370cfdf5af944d418e4be3ea06f27 # v3.0.0
- name: Run markdownlint
+2 -2
View File
@@ -21,10 +21,10 @@ jobs:
steps:
- name: Check out Git repository
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Set up Node.js
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 20
check-latest: true
+2
View File
@@ -36,4 +36,6 @@ Full release notes available on [GitHub](https://github.com/jellyfin/jellyfin-ko
If you have the Jellyfin for Kodi addon repository installed and updates enabled, this version will automatically be installed for you.
<!-- markdownlint-disable MD059 -->
If you have installed the addon manually, the new zip file is available [here](https://repo.jellyfin.org/releases/client/kodi/plugin.video.jellyfin/plugin.video.jellyfin-0.5.0.zip).
+126
View File
@@ -0,0 +1,126 @@
---
title: New CI, New Repo, A Renewed Push for 10.9.0
description: There's some things about our repo we need to share as we prepare for 10.9.0
authors: joshuaboniface
date: 2024-03-05
slug: new-ci-new-repo
tags: [release, infrastructure]
---
Over the last several weeks, I've been driving a major push to revamp and improve our CI, in an effort to improve our release workflow, our velocity of releases, and the burden they have on me as the release manager. This post will detail the changes we've made, how they might affect you as a user or contributor, and how we're planning to proceed with our 10.9.0 release cycle.
## The TL;DR
1. We have [a new repository browser UI](https://repo.jellyfin.org) along with a new file layout, on a new master repository machine, built by new CI, that will hopefully make it nicer to look around and get right to what you need. This has now been cut over into production, but is still a bit of a work in progress, so please report any bugs you find to us! Note that quite a number of paths will have changed (anything under `/server` especially), but some will remain the same. If you get a 404 and can't find it through the browser UI, best to check in. **3rd party packagers downloading files manually from us are advised to contact us if needed.**
1. We are dropping non-LTS Ubuntu packages, dropping our own Fedora/CentOS packages in favour of [RPMFusion builds](https://admin.rpmfusion.org/pkgdb/package/free/jellyfin/), and adding [GHCR as a container repository](https://ghcr.io/jellyfin/jellyfin) for our Docker images.
1. For 10.9.0, we will not be producing explicit "beta" releases. Instead, we will test using our new Weekly Unstable builds. Once the master branch is sufficiently stable and good, we will release 10.9.0 directly from there (via our standard release branch process).
1. The 10.9.0 feature freeze (bugfix PRs only after this) will tentatively begin on **Monday, March 18th**. The hope is that all of the above will be ready by then so that obtaining Unstable builds for testing will be easy.
1. The 10.9.0 release itself is tentatively planned for the **last weekend in April**. To all **3rd parties who build packages of our releases, please read until the end for an important note about this release**.
Read on for more details.
\- Joshua
{/* truncate */}
## Why build a new CI?
Our old CI was assembled way back in 2019 by a few dedicated team members (mostly @EraYan) using Azure DevOps. While it was a major improvement over my self-built pure-BASH build system that we had used for the first year or so, it still had a number of drawbacks:
1. It was a little difficult to understand, and relied on an external system (Microsoft Azure).
2. It still relied on a very complex, convoluted, and error prone [BASH script to finalize the builds](https://github.com/jellyfin/jellyfin-metapackages), because...
3. It built the Server and Web components of Jellyfin independently, triggered independently off the different repository tag events, and then had to rely on a whole lot of shenanigans to combine the results into unified, user-friendly packages.
There was also, though not a flaw with the CI system itself, the matter of Unstable builds. For a long time, they've been built on every merged PR, which was good for quickly seeing if things worked, but were effectively unusable for normal people as they changed so often. This was also something we wanted to fix.
At the time, GitHub Actions did not yet exist, and while we got everything to work, the CI as a whole was clunky and prone to failure. Major releases would often take me over 20 man-hours to prepare for and execute, while point releases would take at least 4-6 hours. It was a huge burden as a release manager, and also very cumbersome to fix if things broke in obscure ways, especially after the tag, because all the CI was in the code repos.
All this meant that our release velocity was extremely slow, as there was never a clear flow between master being tested and preparing for the next release.
Rather than continue incremental tweaking of this setup, about 2 years ago a project was started by @ferferga and @h1dden-da3m0n (who has since moved on) to move to GitHub Actions. While they did lay a lot of groundwork, that project ultimately stalled out and was effectively abandoned. Earlier this year, I took up the mantle to finally get this done in preparation for 10.9.0, and was able to get it working well, in a much easier to understand and hopefully much more consistent way.
## More Automation
The next part, besides just the CI itself, is an automation bot. As mentioned, releases took a long time, but only a fraction of that was spent actually dealing with Azure. The rest was administrative work: building changelogs, ensuring repos were in sync, running `bump-version` scripts, creating release drafts, checking them 3 times and still missing something, writing a release post for our Forum, etc. All of this added up to a significant time investment that I was rarely eager to do, which in turn trashed our velocity.
No project should be so dependent on one person, but we were, for a very long time. Part of the goal with this CI improvement is to streamline all these aspects as well using another piece of automation, a private chatbot.
The goal here is for us to tell our chatbot that we're ready for a release, for it to prepare all the text automatically, and then after review, tell it that it's ready to ship. Not only does this ease the process for myself, but it can easily be performed by others. And with the more reliable CI, this will hopefully mean a "set and forget" release process that helps us massively increase velocity.
While the bot isn't completely finished yet, the scaffolding is all there, and we definitely expect it to be ready to go in time for the actual 10.9.0 release.
## Unifying packages
One big drawback we mentioned of the previous CI was how it treated the server and web components of Jellyfin separately. It did this because these two components are indeed separate on the code side, in separate GitHub repositories and with different groups leading them. The problem is, that's not how Jellyfin is actually consumed by users. Users want just one package, installer, or archive to install and run out of the box. So we had to do a lot of complex shenanigans to combine the packages together.
No longer. With the updated CI, all our packaging is unified together, and split off into [its own dedicated repository](https://github.com/jellyfin/jellyfin-packaging). This repository handles the two code repos via submodules and a simple Python script to synchronize what version is checked out of each before a build. Then, another Python script handles the actual building, which itself is then called from GitHub actions. It is still a little convoluted, but this is unavoidable for how complex our software ultimately is to package, and the hope is that having this in Python (a robust but easy-to-understand language) will help ensure this process isn't nearly as opaque as it previously was.
What this means depends on the different packaging types. For Debian and Ubuntu, it means that there is now one Debian source package for the three resulting binary packages (metapackage, web, and server) and thus all 3 can be built at once using a single `dpkg-buildpackage` command. For archives, this means that both the server and web components are built in sequence and then combined into one archive at build time, rather than haphazardly later, a process that failed more times than we could count. For installers, this means that the process is now simpler and can be automated. And lastly, for Docker, it means that we now provide just a single image, `jellyfin/jellyfin`, that was built all at once and does not rely on two intermediate images, another very error-prone process.
Related to this, and as part of the unified builds, each version of Debian and Ubuntu now has its own distinct package, with version suffixes like `-deb12` or `-ubu2204`. This will help ensure smooth dependency handling for shared libraries like LibSSL. This should only matter if you're downloading `.deb` packages from the repo directly: ensure you download the right one for your release.
As a normal end user, you shouldn't see anything different because of this: you'll still install the packages the same way as always through our repositories. But for anyone building their own versions, you are now advised to use the above repository, as all non-development packaging (e.g. the `debian/` and `fedora/` folders, the `deployment/` folder, etc.) will be removed from the main repositories, leaving just a simple Dockerfile for building testing and development images quickly.
## A new repository master for a new CI system
One thing the ground-up CI and unified packages enables is a much cleaner repository structure. Our previous structure was based around the combining requirements, full of strange quirks and nested directories to try to make that simpler. With those out of the picture, we were able to settle on a much nicer layout, and thus, a brand new master server to house them for an easier transition.
Part of this also includes a revamped browser page to easily facilitate getting to the files you need, descending through the tree of the new layout in a much more user-friendly way.
The new browser and repository master is now live as of posting at https://repo.jellyfin.org for perusal, and still includes the stable release packages in the new layout for your convenience until 10.9.0 is released. So, as mentioned in the preamble, please test it out and let us know if you run into any trouble with it, any broken links, or similar issues.
## Unstable Releases
As mentioned a bit above, our previous "build things on every pull request merge" was quite cumbersome to use, as things would change very rapidly, and keeping testers up-to-date was nearly impossible during fast-moving days. Way back in the early days, we had experimented with daily builds before moving to this model, but even those felt a little too quick for both our current development pace, and for users to keep adequetly up-to-date.
Instead, going forward we are moving to a Weekly cycle for Unstable releases. The builds will occur on Monday mornings around midnight Eastern time (UTC-5/4-with-DST), a time chosen farily arbitrarily but ensuring each week starts with a fresh Unstable build. This process is completely automated, and the resulting builds will be available soon thereafter in all our normal places.
We hope that this slower pace will help ensure that users running our Unstable builds have more of a chance to actually test the current state of Jellyfin and not be overwhelmed by the speed of releases, while also providing fast enough movement for people to truly test the latest and greatest features and bugfixes.
One final note, mentioned in more detail below, is that these Unstable Weekly builds will act as our pre-release testing for 10.9.0: there will be no tagged "beta" or "rc" releases for this cycle. This is being done to avoid the major burden we found with 10.8.0 of trying to continually backport the fixes for the upcoming stable release back into master, while also forward-porting bugfixes in the other direction when they were accidentally mis-targeted.
## Cleaning up what we build
As mentioned in the TL;DR, we are making three major changes to what we build, both for the Unstable releases and the upcoming 10.9.0 release:
1. We are dropping all non-LTS Ubuntu releases from our official APT package repository.
The reason is simple: it's a huge burden to keep up with Ubuntu's 6 month release schedule, just to support what are in practice minor versions with a 9 month lifespan. While we understand people might want to run Jellyfin on desktops or ensure their servers have "the latest" stuff, this just isn't tenable for us long term. So, going forward, our packages will only target the LTS releases, starting with 20.04 "Focal", and including 22.04 "Jammy" and the new 24.04 "Noble" due to release in April.
If you are using a non-LTS version of Ubuntu, you still have options. First, you can always upgrade to 24.04 and use that going forward. However do note that 24.04 will be the latest release that we build for until 26.04 comes out. Alternatively, if you still want to keep your system on the 6-month update path, you can migrate to our Docker images instead, and these have the added benefit of additional long-term stability even as your base OS changes.
2. We are dropping our own "official" RPM builds for Fedora and CentOS(-like) distributions in favour of RPMFusion:
These builds have always been a bit of a red-headed-stepchild for us. They were poorly maintained (despite some valiant efforts and community contributions), broke frequently, and this all came to a head when we started working on a combined spec.
Luckily, a community member (@mooninite) has already been maintaning a stable combined RPMFusion build of Jellyfin. This seemed like a perfect time to switch to that, reducing another bit of packaging burden away from us, as well as (finally) providing a "real" repository for our RPM-based users. The RPMFusion build is now the official Fedora/CentOS build listed on our [downloads page](https://jellyfin.org/downloads/server) and will be going forward. We're also taking steps to get a packaged FFmpeg build provided there too, so stay tuned.
Unstable users on Fedora/CentOS are recommended to stick with the Docker container instead, as this both bundles FFmpeg today and helps ensure speedy upgrades.
3. We are finaly adding GHCR (ghcr.io) support for our Docker images. This will help ensure that, even if something were to happen to Docker Hub, there is another source for our Docker images. If you wish to, you can use this source immediately for Unstable builds, and for 10.9.0 when it is released.
## The 10.9.0 release cycle
As we outlined [over in this GitHub discussion](https://github.com/jellyfin/jellyfin/discussions/11051), all these changes mean there will be some big changes for how we approach the 10.9.0 release cycle. To clarify things, the exact process will be as follows:
1. Starting now, and moving forward indefinitely for all future releases, the Weekly Unstable builds will act as the "beta" versions. That is to say, if you want to help us test, or just keep up with all the latest and greatest features, use the Unstable releases. The instructions found on [our Downloads page](https://jellyfin.org/downloads/server) still apply for enabling Unstable builds, as well as listing all of our supported Unstable platforms.
2. As we approach the planned release date, we will begin a feature freeze. While in the feature freeze, only bugfix PRs will be accepted. We expect this to last between 3 and 5 weeks. Currently, the tentative start is **Monday, March 18th**. During the freeze, the Unstable builds should be consistent and working, with only the minor fixes being merged.
3. As users, please be diligent about reporting bugs in the Unstable releases. Our Triage team has been very diligent these last few months at ensuring issues are triaged and looked at, so it is vitally important that anyone using the Unstable releases properly reports their bugs!
4. As we approach stability, i.e. after the 3-5 weeks of frozen bug-fixing, we will make the decision to cut the actual final release. I am personally hoping to get this done during the weekend of April 27-28, but that may change depending on how things go during the freeze.
5. The release will actually happen. We will cut a fresh release branch, tag the version, and - using the new CI above - perform the release. We do want to ensure that **any 3rd parties who might trigger off of a Tag event** on our repositories *please turn this off* for this release, as we fully expect to hit at least one or two roadblocks as we run through the process "for real". Once the dust settles, we can ensure that your releases get built, just in case we need to do anything drastic like re-tagging the release. Longer-term, we'll also come up with a better coordination process, so we'd like to ensure we work with any 3rd party maintainers to assist here - please reach out.
6. At that point, master will resume normal operation, and we will begin the stable point bugfix cycle for 10.9.0. We hope that with the improvements, 10.10.0 will not be a very long ways away after that, perhaps 3-6 months, after which this process will start anew.
We are very nearly there, over 2 years in the making, so we wanted to ensure we spread the word about this plan as far and wide as possible, especially to help get more people testing the new Unstable builds for bugs as we prepare for the final release!
## Final thoughts
That basically concludes my thoughts right now, both on the roadmap to 10.9.0 and the improvements we're making and have already made to the release process. Happy watching!
+77
View File
@@ -0,0 +1,77 @@
---
title: Testing 10.9.0
description: We are now in feature freeze for 10.9.0; here's how to help test!
authors: joshuaboniface
date: 2024-03-27
slug: testing-10.9.0
tags: [release]
---
We are pleased to announce that we are now in our feature freeze window for the 10.9.0 release! That means that from now until the release, we'll be focusing only on merging bugfixes and other improvements, while all features will be on hold until the release is finalized.
That also means it's time to start testing. As outlined in our last blog post, we're doing things a bit differently this release, so this post will provide the steps one would need to take to help us test the new release.
If you want to help out, please read on!
\- Joshua
{/* truncate */}
## What's Different and The Release Plan
First, a quick rundown on what's different from our previous releases. The last few major releases, we went back and forth between various versions of `-beta` and `-rc` tags, but ultimately due to the complexity of 10.8.0 nearly two years ago, we've decided to abandon that idea going forward. As nice as it is to publish pre-release tags, we feel that doing so is not worth the burden and headache during this period and after, when we already have a better solution in our weekly unstable builds.
So, in effect, our weekly unstable builds are now working double-duty as our beta/release candidate versions. Here's how they map over the coming weeks:
- `20240325`: The first "beta". Feature freeze has begun.
- `20240401`: The second "beta". One week of freeze.
- `20240408`: The third "beta". Two weeks of freeze, and we hope to have most glaring bugs fixed by this point.
- `20240415`: The first "release candidate". We hope that by this point everything is in good shape for a release, with only a few lingering bugs.
- `20240422`: The second and, ideally, final "release candidate".
- `10.9.0`: The actual release, during the weekend of April 26th-28th.
All of this, of course, assumes a smooth window, we we are fairly hopeful of, but any number of things could throw a wrench in this plan, so we are continuing to play things by ear and see how each week turns out.
:::info
**Update (2024-05-04):** Due to some critical issues, we've decided to delay the release of 10.9.0 to ensure everything is working properly on release.
:::
## How You Can Test
Testing this release should be very easy, in a way that our previous releases weren't. Since our pre-releases are "just" our unstable releases here, that means that following our normal "unstable" install process is all you need to do.
To find that, visit our [main server downloads page](https://jellyfin.org/downloads/server), select the platform you require along the top centre, then on the top right, select "Unstable". The instructions and links will now be for the unstable release. You can also find [additional testing documentation in the docs](https://jellyfin.org/docs/general/testing/).
For Docker this simply means pulling the `unstable` tag on the image. For Debian and Ubuntu repositories, this means adding `unstable` to your existing `jellyfin.sources` entry. For other platforms, please review the provided instructions as not all platforms will support unstable.
Next, before installing an unstable release, ensure that you **back up your existing server configuration**. It is not possible to downgrade as there are a significant number of database changes. Just making a simple copy of your configuration directories is sufficient, and where those can be found depends on the platform.
Next, if you use plugins, install the unstable plugin repository. Due to compatibility issues, we distribute plugins for unstable in a separate manifest, so this must be added manually, and on first start all incompatible plugins (i.e. all existing plugins on an upgrade) will be upgraded. To add the repository, navigate to the Administration Dashboard, Advanced, Plugins, then click the Repositories tab at the top. Click the "+" Add button, and enter "Unstable" for the name and "https://repo.jellyfin.org/files/plugin-unstable/manifest.json" for the Repository URL. We also recommend that you disable/remove the Stable repository at this time, as it's possible they will conflict, and under 10.9.0 the repository URL will change. After the initial update you may need to manually restart your Jellyfin instance one further time to ensure all plugins are activated properly.
Finally, install the unstable version and run it. The upgrade should happen seamlessly in the background, and you'll be able to log in to your Jellyfin instance normally after this point. Ensure you perform a _hard_ refresh in your browser, and restart all clients.
Once 10.9.0 is fully released, you can switch back easily by reinstalling the new stable version, and changing back to the stable plugin manifest (URL "https://repo.jellyfin.org/files/plugin/manifest.json").
## How To Report Bugs
While running the unstable prereleases, reporting bugs is important. After all, if we don't know about bugs, we can't work to fix them!
First, if you encounter a bug, ensure you're running the latest version, and try to reproduce it. If you can't, it's always possible it was a one-off occurrence, but if it happens again, definitely report it!
Bugs can be reported on [our GitHub issues page](https://github.com/jellyfin/jellyfin) or [on our Forums](https://forum.jellyfin.org).
You'll want to include two important pieces of information in your bug report, beyond the standard asks. First, ensure you include the "Build Version" as shown in the main dashboard page. This reports the exact unstable build you're using to help narrow down what might have caused the issue. This is doubly important if you see a new bug turn up in a future unstable build. Second, please make clear that you are running the unstable builds and not stable builds as well as if this is an upgrade or fresh install, as that can be an important piece of information.
Once your bug is reported, please check back diligently to see if any additional information has been requested, and we hope to get it fixed soon.
## Information for 3rd Party Clients
At this point, with our feature freeze our APIs should be stable, though do please expect bugfixes to make minor changes over the next few weeks. Please feel free to begin testing compatibility and report any issues to us.
## Information for Contributors
If you're contributing to Jellyfin and your existing feature PRs have not yet been merged, please don't fret. 10.9.0 was an abnormally long release cycle and something we do not wish to repeat, so your changes _will_ get in soon for 10.10.0, which we expect to happen in about 6 months at most.
If you wish to help by submitting a bugfix, please do so as soon as you can, as we'd like to get as many fixes in and tested within the next ~3 weeks as possible, to give at least 2 weeks of final testing before the release. Ensure you clearly specify that it is a bugfix, and ensure you keep your changes to an absolute minimum needed to fix the bug. Bugfix PRs will target the `master` branch until the final release at which point they will target the `release-10.9.z` branch for upcoming point releases.
@@ -0,0 +1,141 @@
---
title: Jellyfin 10.9.0
description: We are pleased to announce the latest stable release of Jellyfin, version 10.9.0!
authors: joshuaboniface
slug: jellyfin-release-10.9.0
tags: [release]
---
We are pleased to announce the latest stable release of Jellyfin, version 10.9.0!
This major release brings many new features, improvements, and bugfixes to improve your Jellyfin experience.
You may upgrade your Jellyfin instances at any time now, however please read on for a complete detailing of what's new and changed, including some very important release notes. For those who were running Unstable builds for testing, we thank you immensely, and you may now switch back to the Stable repository and forcibly reinstall/repull the latest version.
Happy watching!
\- Joshua
{/* truncate */}
## Key Release Notes/Breaking Changes
There are several key changes with 10.9.0 that administrative users should be aware of, before getting into the more specific changes.
* As always, **ensure you back up your Jellyfin data and configuration directories before upgrading**. With a major release, it's possible you will hit a bug and want to revert, and to do so, you will need to restore from a backup.
* Ubuntu users: We have dropped support for non-LTS Ubuntu releases with 10.9.0. That is, we have not built 10.9.0 packages for any releases except 20.04 LTS, 22.04 LTS, and 24.04 LTS, and we will not publish builds for any new non-LTS releases going forward. For an explanation of why, please see [our previous blog post](https://jellyfin.org/posts/new-ci-new-repo). If you use another release, please upgrade to 24.04 LTS or switch to the Docker container.
* Fedora/CentOS/RHEL/etc. users: We have dropped our official RPM packages and suggest switching to [the 3rd-party RPMFusion repository](https://admin.rpmfusion.org/pkgdb/package/free/jellyfin/) or the Docker container. Support for RHEL-like distributions has been a major pain point for us for a very long time, and we feel that letting the community over at RPMFusion handle this is in our best interest going forward, similar to how Arch, Gentoo, etc. packages are handled. For more details, please see [our previous blog post](https://jellyfin.org/posts/new-ci-new-repo).
* Docker users: We now offer GitHub Container Registry (GHCR) as an alternative container registry in addition to Docker Hub. You can pull images from the new registry via URIs like `ghcr.io/jellyfin/jellyfin:latest`. Don't worry, we have no plans to drop Docker Hub as a container registry, but we feel providing both gives users more choice and flexibility.
* Docker users: If you encounter problems loading your homepage, you may need to remove the `DOTNET_SYSTEM_GLOBALIZATION_INVARIANT` environment variable from your container, as this is no longer valid in Jellyfin 10.9.0. For more details [please see](https://github.com/jellyfin/jellyfin/issues/11533) [these issues](https://github.com/jellyfin/jellyfin/issues/11528).
* Nginx reverse proxy users: If you have a block in your nginx config that begins with `location ~ ^/web/$ {` and the comment `# location block for /web - This is purely for aesthetics [...]`, please remove that block as it will cause [occasional issues with 404's and/or slow performance](https://github.com/jellyfin/jellyfin/issues/11540) on 10.9.z.
## The Big Changes
This release has been over two years in the making, so we're really glad to finally get it out to you. The long cycle does mean quite an extensive changelog however, with well over 1100 pull requests merged into our `master` branch since 10.8.0 first dropped back in 2022. This section will detail all the big changes, broken up by general function and area of the system. In addition to these big items, there are hundreds of smaller bugfixes, quality-of-life tweaks, and other minor changes that we won't touch on here, but if you want to see the full list, you can do so over on the GitHub releases for [the core server](https://github.com/jellyfin/jellyfin/releases/tag/v10.9.0) and [the Web UI](https://github.com/jellyfin/jellyfin-web/releases/tag/v10.9.0).
### General
* We now support "trickplay" a.k.a. live video scrubbing. When scrubbing through a video with this enabled, you will be able to see a live preview of the video at that timestamp. Note that this requires explicit client support, which may require some time to become available depending on your client.
* Web redirections are now handled more reliably, reducing the likelihood of hitting dead or invalid pages in the UI. Please ensure you force-refresh or clear any browser cache for your Jellyfin instance to see the full benefits.
* DLNA support is now provided by a plugin and has been removed from the core server. This has several major benefits: first, it can be updated independently of the server to some degree; second, it will not be enabled for anyone unless they want it and explicitly install the plugin; and third, it reduces the potential of security holes around DLNA due to both previous benefits. If you wish to use (or continue to use) DLNA, please install the plugin after upgrading.
* We now support AVIF and WEBP images for Pictures libraries.
* Tags are now accounted for during searches, allowing one to search by tag.
* We now support multiple simultaneous subtitle tracks (maximum of two, a primary and secondary) in the web player.
* We've revamped the administrative dashboard UI to help improve usability and ease of finding options.
### API & Security
* All API endpoints now return proper return codes, ensuring that API endpoint results can be reliably interpreted without additional parsing.
* Parental ratings are significantly improved, with better enforcement, inheritable ratings, and more.
* LiveTV and Collection permissions are now discrete and configurable per-user.
* The EasyPassword (PIN) feature has been removed as this was a big security risk especially for administrator accounts; QuickConnect login is still supported however.
* User permission handling has been unified and numerous bugs fixed, ensuring a more secure server from untrusted users.
### Core Server & Networking
* The .NET version has been upgraded to version 8, the latest major and LTS release. This brings us many under-the-hood improvements and changes to help with our ongoing effort to streamline the codebase and improve overall performance.
* Our minimum FFmpeg version has been bumped from 4.0 to 4.4 to take advantage of many new features. For users of our Jellyfin FFmpeg build (Docker, `.deb`/Debuntu repo, and Windows installs), you're already on a newer version with FFmpeg 6.0.1, but this minimum change would affect any other platforms.
* The server now supports in-process restarting, and removes the old hacky `restart.sh` method. This should make things like installing plugins much more robust and ensure a consistent restart experience regardless of platform or install method.
* Uploaded images are now subject to much more verification, helping plug several security holes in this feature.
* The backend SQLite database now supports connection pooling, which should improve performance for database operations.
* Support for the HappyEyeballs engine improving dual-stack IPv4/IPV6 network support.
* Improved handling of IP binding to fully respect these settings (including DLNA and SSDP).
### Packaging
* The `jellyfin` service user is now automatically added to the `render` and `video` groups on Debian/Ubuntu systems for new installs, helping improve the onboarding for hardware acceleration.
* Packaging is now unified with a new CI system, as outlined in [our previous blog post](https://jellyfin.org/posts/new-ci-new-repo). As a normal user you should see no change here, but this helps massively improve the build process, and if you are building your own packages please reference [the new packaging repository](https://github.com/jellyfin/jellyfin-packaging) for the updated process.
### Transcoding & FFmpeg
* The `--ffmpeg` command-line flag is now the primary method of setting FFmpeg paths, and configuration of the FFmpeg paths via `encoding.xml` is now deprecated. All official packaging will revert to defaults unless explicitly set before upgrade.
* Several audio improvements: support for Opus, FLAC, and ALAC codecs in the HLS engine; improved support and handling for transcoding DTS and TrueHD audio streams; new codec enforcement; better bitrate calculations; new audio normalization features; and stereo downmixing algorithm selection.
* FFmpeg segments can now be automatically deleted after the client requests them, significantly reducing the space requirements of the transcoding temporary directory. This optional feature is disabled by default and can be enabled in the transcoding settings.
* Support for direct stream playback of DVD and Blu-ray data folders, preferred over ISOs.
* Support for AV1 hardware and software encoding.
* Support for RK3588 hardware acceleration via MPP.
* Support for Vulkan-based tonemapping with AMD VA-API.
* Support for complete hardware acceleration on Apple systems (both Apple Silicon and Intel; previously was partial).
* Support for Dolby Vision playback remuxing.
### Scanning, Library & Playlist Management
* Support for scanning and displaying local lyric files (embedded or external files; Internet lyric provider searching is planned for 10.10).
* Season names are now parsed from NFO files.
* The MusicBrainz interface has been improved to better handle music libraries.
* Support for hearing-impaired subtitles (sdh/hi./cc).
* The visibility of playlists can now be made private
* User playlists are now private by default
* We're working on playlist sharing for a future release
* Invalid items will be automatically removed from playlists.
### Casting
* Better local network detection
* Connectivity improvements
* Ability to self-host cast receiver
We're looking for contributors for our [cast receiver](https://github.com/jellyfin/jellyfin-chromecast/). This is the application that loads on a TV when using the "Google Cast" feature. Please reach out if you're interested.
## The Next Version
With our continuous integrations improvements outlined previously, we're quite confident that this will be our last "very long" release cycle. Our plan is for the next major version (10.10.0) to be released at most 6 months from now, some time in October. We hope this increased cadence will help alleviate the problems with large releases such as a very long time-to-stable for new features, translations, etc. and help lower the number of major bugs at each major release, streamlining the upgrade process. But this needs everyone's help. Back in October 2023, we made a call for developers, and we've gotten a lot of interest, but this is not a one-and-done event. We need contributions now more than ever, especially around the web frontend to help implement our planned design changes. If this interests you, please reach out and we can help get you set up.
## Final Thoughts
We want to thank everyone who contributed to the 10.9.0 release. According to GitHub over 100 people contributed across both repositories, and Jellyfin wouldn't be what it is without your help. We're really proud of this project we've built as a community, and hope to continue to be the go-to FLOSS media system solution for a long time to come. Happy watching!
+110
View File
@@ -0,0 +1,110 @@
---
title: Android TV version 0.17
authors:
- nielsvanvelzen
slug: androidtv-v0.17.0
tags: [release, android-tv]
---
The latest Android TV app release features enhanced stability, improved navigation with a new home button, and an updated screensaver with
age rating filters. Check out the full blog post to see all the new features and update now!
{/* truncate */}
## Notable changes
This release comes with over 100 changes from 13 contributors. The complete list of changes, including their respective pull requests, can
be found on [GitHub](https://github.com/jellyfin/jellyfin-androidtv/releases/tag/v0.17.0). I've listed the most important/noticeable changes
below.
### Navigation
It might seem like just one button, but it solves a significant issue. A new 'home' button in the top-right corner lets you return to the
Jellyfin home screen easily, instead of pressing the back button repeatedly. Additionally, the layout of the item details has been slightly
tweaked to fit more useful information.
![Screenshot of item details in the Android TV app](./item-details.png)
### Playback
The current video player was improved by adding support for more audio codecs, including WAV, Vorbis and PCM. Additionally, timeouts for
player errors were increased to give transcode and remux tasks more time to start. This improves playback for media stored on network
drives and BDMV files that require unpacking.
Audio normalization support was added to automatically adjust volume levels for music playback. This feature prevents sudden volume changes
between songs. To activate this feature, you'll need to enable the LUFS scan for your music library.
### Screensaver
The screensaver now includes a feature to filter items based on their age rating. By default, only items with an age rating up to 13 will
be displayed, ensuring a family-friendly environment. Age rating options can be changed in the preferences under the customization tab.
Additionally, the screensaver has been enhanced to display a logo of the movie or series being shown.
![Screenshot of the updated screensaver design in the Android TV app](./screensaver.png)
### Other changes
Series and seasons now display their respective special features, which were previously available only for movies. Additionally, the search
function has been improved to include results for Live TV channels, playlists, collections, photo albums, and individual photos.
Invisible but noteworthy, a significant amount of work was invested in reworking the communication between the app and the server. This
has resulted in a faster and more reliable app, with improved performance and the groundwork laid for the development of exciting new
features. As a consequence of these changes, the app now requires Jellyfin 10.9 or newer and older versions are no longer supported.
## Contributors
Jellyfin is completely developed by volunteers, and we couldn't do without their great skills and dedication. Consider donating if you
appreciate their work. A big shout-out to all contributors that made this release possible:
**Jellyfin Team**
- [@nielsvanvelzen](https://github.com/nielsvanvelzen) - Sponsor via [GitHub sponsors](https://github.com/sponsors/nielsvanvelzen)
- [@Bond\-009](https://github.com/Bond-009) - Sponsor via [GitHub sponsors](https://github.com/sponsors/Bond-009)
**Other contributors**
- [@pascalwei](https://github.com/pascalwei)
- [@haydenzeller](https://github.com/haydenzeller)
- [@DoggoOfSpeed](https://github.com/DoggoOfSpeed)
- [@bathompson](https://github.com/bathompson)
- [@VizuaaLOG](https://github.com/VizuaaLOG)
- [@3l0w](https://github.com/3l0w)
- [@mnsrulz](https://github.com/mnsrulz)
- [@MichaelRUSF](https://github.com/MichaelRUSF)
- [@efreet7](https://github.com/efreet7)
- [@ConnorS1110](https://github.com/ConnorS1110)
- [@cbeyls](https://github.com/cbeyls)
We'd also like to thank everyone who reported bugs, provided feedback and participated in beta testing!
### Helping out
If you have experience with Android TV development or with Kotlin and are interested in contributing yourself, feel free to dive into the
[source code](https://github.com/jellyfin/jellyfin-androidtv) and open a pull request.
Alternatively, you can help with translating the app into your language on our
[Weblate](https://translate.jellyfin.org/engage/jellyfin-android/) instance.
## Downloads
Update your app now to check out all these changes! The app stores will auto-update your Jellyfin app if you're already using the app. For
new users, you can find the app here:
<a className='margin-right--md' href='https://play.google.com/store/apps/details?id=org.jellyfin.androidtv'>
<img width='153' alt='Jellyfin for Android TV on Google Play' src='/images/store-icons/google-play.png' />
</a>
<a className='margin-right--md' href='https://www.amazon.com/gp/product/B07TX7Z725'>
<img width='153' alt='Jellyfin for Fire TV at Amazon App Store' src='/images/store-icons/amazon.png' />
</a>
<a href='https://f-droid.org/en/packages/org.jellyfin.androidtv/'>
<img width='153' alt='Jellyfin for Android TV on F-Droid' src='/images/store-icons/fdroid.png' />
</a>
Direct downloads are available for sideloading at [repo.jellyfin.org](https://repo.jellyfin.org/releases/client/androidtv/)
or in the [GitHub release assets](https://github.com/jellyfin/jellyfin-androidtv/releases/tag/v0.17.0).
You can also join our [beta program on Google Play](https://play.google.com/apps/testing/org.jellyfin.androidtv) and help test new versions
before they're released to the public.
Binary file not shown.

After

Width:  |  Height:  |  Size: 558 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 648 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

@@ -0,0 +1,83 @@
---
title: Release Roadmap for 10.10.0
description: We are about to start the 10.10.0 release cycle; here is the roadmap. Please help us test!
authors: joshuaboniface
slug: release-roadmap-10.10.0
tags: [release, testing]
---
![Good heavens, look at the time!](./10.10.0.jpg)
We are pleased to announce that we are now beginning the process for the 10.10.0 release, with a *planned* release date of Saturday, October 26th (updated - see below), 2024! We said 6 months in our 10.9.0 release posts, and we're sticking by that! The feature freeze proper starts next week, with a soft "new PR freeze" today, so here's what you need to know about the timeline and a recap of how to help us test 10.10.0 before release. Remember, the more people who help test it out before release, the less bugs we're likely to find *after* release, so fire up those secondary servers and warn your users: 10.10.0 is coming!
Developers/contributors, and those users who want a bit more information, please read on!
\- Joshua
{/* truncate */}
## The Release
## What's Different This Time?
Not much at all! We're following the same general process as the 10.9.0 release, though with a slightly tweaked timeline and with more defined steps.
### The Release Timeline
- Monday, September 9th, 2024 (unstable `20240909`): Feature PR last-call, first beta. Any *new* feature PRs should get in right now to avoid missing the feature freeze. This is your 1 week warning! Developers/contributors **please keep on top of your PR review feedback** or your PR may **miss the following deadlines and have to wait** until 10.11.0.
- Monday, September 16th, 2024 (unstable `20240916`): Feature freeze, second beta. Any *new* feature PRs after this point must wait until 10.11.0 (in another ~6 months). In-flight feature PRs will likely make it assuming that all feedback is resolved before the API freeze. Again **developers/contributors, please keep on top of your PR review feedback**. New PRs should be **bugfixes only** after this point. Users **should be safe to begin testing in earnest** with this unstable.
- Monday, September 23rd, 2024 (unstable `20240923`): API freeze, third beta. **All feature PRs should be merged by this point**. If they're not, they will be moved to the 10.11.0 project and only merged to `master` once 10.10.0 is released. API is now soft-frozen so that **client developers can begin confidently working on any client support changes needed for 10.10.0**.
- Monday, September 30th, 2024 (unstable `20240930`): API lock, first release candidate. **Major bugfix PRs should hopefully be either be merged or well in-flight** by this point. Only **non-API-changing bugfixes** after this point. We should have a feature overview blog post in draft state by this point.
- Monday, October 7th, 2024 (unstable `20241007`): Final planned unstable, second release candidate. **The release should basically be ready to go**, and any remaining bugfix PRs **should be merged before this unstable**.
- Saturday, October 12th, 2024: Release of 10.10.0!
### Possible Timeline Changes
EDIT 2024-10-12: We have opted to take the **two week** delay due to pending changes in Web that must get in. We are currently planning for a release on October 26th.
Since this is a much smaller and quicker release than 10.8.0 or 10.9.0 were, hopefully this is enough time to get everything sorted and ready to go. But if we find it's **not**, we reserve the right to add an extra week in one or both of the following places:
- After the Feature freeze, if we find that there are any outstanding **major** bugfixes that require additional time to merge before the API freeze.
- After the API lock, if we find that there are any outstanding **non-API-breaking** bugfixes that require additional time to merge before the final unstable.
If neither of those happen, the release will proceed as planned; otherwise, an extra step will be added into the timeline after the given points that matches the previous stage. This might push the final unstable back to either October 14th or October 21st, and the final release to either October 19th or October 26th. If this is relevant to your interests, please keep an eye on our [Announcements Matrix channel](https://matrix.to/#/#jellyfin-announce:matrix.org) for announcements.
### Information for 3rd Party Clients
After the API freeze, our API should ideally remain stable, though it's possible there might be minor changes up until the API lock step. Please feel free to begin testing compatibility and report any issues to us now, and keep an eye out on those dates for the final API specification.
### Information for Contributors
If you're contributing to Jellyfin and your feature PRs miss the deadline, **please don't fret**. We are committed to this shorter major release timeline going forward, so 10.11.0 is at most about 6 months away. Your feature should eventually make it in.
If you wish to help by submitting a bugfix, please do so as soon as you can, as we'd like to get as many fixes in and tested before the API lock as possible, to give at least 2 weeks of final testing before the release. Ensure you clearly specify that it is a bugfix, and ensure you keep your changes to an absolute minimum needed to fix the bug. **Bugfix PRs will target the `master` branch until the final release**, at which point they will target the `release-10.10.z` branch for upcoming point releases.
## How You Can Test
Testing this release should be very easy, identical to 10.9.0. Since our pre-releases are "just" our unstable releases here, that means that following our normal "unstable" installation process is all you need to do.
To find that, visit our [main server downloads page](https://jellyfin.org/downloads/server), select the platform you require along the top centre, then on the top right, select "Unstable". The instructions and links will now be for the unstable release. You can also find [additional testing documentation in the docs](https://jellyfin.org/docs/general/testing/).
For Docker this simply means pulling the `unstable` tag on the image. For Debian and Ubuntu repositories, this means adding `unstable` to your existing `jellyfin.sources` entry. For other platforms, please review the provided instructions as not all platforms will support unstable.
Next, before installing an unstable release, ensure that you **back up your existing server configuration**. It is **not possible to downgrade in-place** as there are database changes. Just making a simple copy of your configuration directories **with Jellyfin stopped** is sufficient, and where those can be found depends on the platform.
Next, if you use plugins, install the unstable plugin repository. Due to compatibility issues, we distribute plugins for unstable in a separate manifest, so this must be added manually, and on first start all incompatible plugins (i.e. all existing plugins on an upgrade) will be upgraded. To add the repository, navigate to the Administration Dashboard, Advanced, Plugins, then click the Repositories tab at the top. Click the "+" Add button, and enter "Unstable" for the name and "https://repo.jellyfin.org/files/plugin-unstable/manifest.json" for the Repository URL. We also recommend that you disable/remove the Stable repository at this time, as it's possible they will conflict. After the initial update you may need to manually restart your Jellyfin instance one further time to ensure all plugins are activated properly.
Finally, install the unstable version and run it. The upgrade should happen seamlessly in the background, and you'll be able to log in to your Jellyfin instance normally after this point. Ensure you perform a _hard_ refresh in your browser, and restart all clients.
Once 10.10.0 is fully released, you can switch back easily by reinstalling the new stable version, and changing back to the stable plugin manifest (URL "https://repo.jellyfin.org/files/plugin/manifest.json"). Unstable releases will be **paused for at least 2 weeks** after the release to give you plenty of time to switch.
## How To Report Bugs
While running the unstable prereleases, reporting bugs is important. After all, if we don't know about bugs, we can't work to fix them!
First, if you encounter a bug, ensure you're running the latest unstable version, and try to reproduce it a couple times. If you can't, it's always possible it was a one-off occurrence, but if it happens again, definitely report it!
Bugs can be reported on [our GitHub issues page](https://github.com/jellyfin/jellyfin) or [on our Forums](https://forum.jellyfin.org).
You'll want to include two important pieces of information in your bug report, beyond the standard asks. First, ensure you include the "Build Version" as shown in the main dashboard page. This reports the exact unstable build you're using to help narrow down what might have caused the issue. This is doubly important if you see a new bug turn up in a future unstable build. Second, please make clear that you are running the unstable builds and not stable builds, as well as if this is an upgrade or fresh install, as that can be an important piece of information.
Once your bug is reported, please check back diligently to see if any additional information has been requested, and we hope to get it fixed soon.
Thanks, and happy watching!
@@ -0,0 +1,80 @@
---
title: Jellyfin 10.10.0
description: We are pleased to announce the latest stable release of Jellyfin, version 10.10.0!
authors: joshuaboniface
slug: jellyfin-release-10.10.0
tags: [release]
---
We are pleased to announce the latest stable release of Jellyfin, version 10.10.0!
This major release brings several new features, improvements, and bugfixes to improve your Jellyfin experience. With our faster release cadence between 10.9.0 and 10.10.0, this release should be far less daunting, so please read on for a quick peek at what's new and some important-to-know breaking changes!
You may upgrade your Jellyfin instances at any time now. For those who were running Unstable builds for testing, we thank you immensely, and you may now switch back to the Stable repository and forcibly reinstall/repull the latest version. As always, **ensure you [back up your Jellyfin data and configuration directories](/docs/general/administration/backup-and-restore) before upgrading**. With a major release, it's possible you will hit a bug and want to revert, and to do so, you will need to restore from a backup.
Happy watching!
\- Joshua
{/* truncate */}
## Breaking Changes
* Most clients should continue to work as-is without any issues or any forced upgrades, though this may change in the future. The sole exception is Jellyfin4Kodi, which currently has issues due to point 5 below, though a fix is hopefully forthcoming shortly.
* We have deprecated Raspberry Pi V4L2 hardware transcoding support, and are looking to deprecate 32-bit ARM support (i.e. `armv7` or `armhf`) in general for 10.10.0 and later, with a goal to remove 32-bit ARM support in 10.11.0. Older, slow ARM systems have always been tricky platforms for us: they're popular but extremely poor in performance, and this has caused a lot of people a lot of headaches. With the RPi5 entirely removing a hardware acceleration engine, and most ARM single-board computers now supporting ARM64, we are taking this action now to ensure it's widely known. If you are running Jellyfin on old ARM hardware, now is the time to start [looking at an upgrade](https://jellyfin.org/docs/general/administration/hardware-selection). See [PR #1148](https://github.com/jellyfin/jellyfin.org/pull/1148).
* We now use the system temporary storage engine (e.g. `/tmp` on Linux) for storing short-lived transient temporary files, to allow us to leverage temporary ramdisks and the like and avoid cluttering potentially slow storage. This may cause issues if you specifically depended on the previous behaviour. Note that this does not include transcoding temporary files. See [PR #12226](https://github.com/jellyfin/jellyfin/pull/12226).
* The server will now refuse to start if `ffmpeg` cannot be found, is an incorrect version, or does not function properly (missing extensions, etc.). With how critical `ffmpeg` is to Jellyfin, this has become very important to avoid mis-reported issues. This can be explicitly bypassed if needed. See [PR #12463](https://github.com/jellyfin/jellyfin/pull/12463).
* Network paths in libraries have been fully removed and will no longer work. This functionality has been deprecated for a long time, and most of it was removed in 10.9.0, but this removes the remainder. See [PR #12446](https://github.com/jellyfin/jellyfin/pull/12446). Third-party clients relying on this functionality should be able to re-implement it as required.
* Systems with Trickplay enabled may see a relatively long migration occurring during the upgrade. If Jellyfin seems to hang starting up after upgrading, please observe the logs and wait for the migration to complete. This helps enable the functionality below.
## Cool New Features
### Media Segments
The Jellyfin server now supports the management of Media Segments. This means that we store some additional information for certain time-spans on a video that clients can then use to provide additional actions. For example, when there is a Media Segment of the type intro, a client may display a button to skip that particular segment. For 10.10, we only provide the general structure to store those Media Segments, and you will still require a plugin to create them. We have created one plugin that does this, based on the Chapter names of a movie or Episode, which you can find in the Plugin catalogue, and others may be implemented in the future. The Web interface fully supports skipping segments; other client support is pending.
### Trickplay
We have significantly improved extraction by implementing optional keyframe extraction, which can boost image generating time significantly (around 100x, depending on configuration) at the cost of some frame accuracy, which should be fine for most users with longer trickplay frame durations. This should mean no more multi-day Trickplay jobs! Note that this **must be explicitly enabled** in the Trickplay settings.
### Playback/Transcoding
Many major enhancements to transcoding and playback, including support for software tonemapping of HDR10, HLG and DoVi, preliminary support for DoVi Profile 10, support for Dolby AC-4 audio, more stereo downmixing algorithms, QSV device selection, and more! Our FFmpeg is also now based off the upstream FFmpeg 7.0 release for additional features and improvements there.
### Metadata
It is now possible to select which plugins can provide lyrics to your music libraries, similar to how you can select the plugins providing metadata. This will provide more variety to Lyrics support.
Audio tag scanning has been significantly improved, and will thus hopefully be much more reliable and consistent.
Home videos should also now keep their rotation metadata.
### Web
We have added support for CBT and CB7 books, client-side rendering of PGS subtitles, and auto-scrolling lyrics as well as a lyrics editor interface.
## Full Changelogs
Full changelogs are available on the various release pages:
* [Server](https://github.com/jellyfin/jellyfin/releases/tag/v10.10.0)
* [Web](https://github.com/jellyfin/jellyfin-web/releases/tag/v10.10.0)
## The Next Version
Our faster release cadence has generally been received fairly positively within the team, though lack of structure has been a bit of a problem. So right now, we are outlining the development roadmap for 10.11.0. This may change as time goes on, but this should give everyone an idea of roughly when 10.11.0 is coming.
Target 10.11.z development window: November 2024 to March 2025
Target feature freeze: second week of April 2025
Target release date: end April 2025
A more detailed roadmap will be published closer to the feature freeze date.
## Final Thoughts
We want to thank everyone who contributed to the 10.10.0 release; Jellyfin wouldn't be what it is without your help. We're really proud of this project we've built as a community, and hope to continue to be the go-to FLOSS media system solution for a long time to come. Happy watching!
@@ -0,0 +1,63 @@
---
title: Warning for Unstable - EFCore refactoring is coming
description: If you are running unstable builds, please read this post carefully to avoid breaking your database!
authors: joshuaboniface
slug: efcore-refactoring-incoming
tags: [unstable, warning, efcore]
---
![Brace yourselves, EFCore refactoring is coming](./refactoring.jpeg)
**Unstable users: we are planning to merge our pending EFCore conversion of `library.db` in the next couple of weeks. It is imperative that all unstable users understand what is going on, what the plan is, and how to mitigate issues that will inevitably arise from this.** Stable (`10.y.z`) users require no action.
Unstable builds are currently paused for roughly 4 weeks post-release of 10.10.0, and during this time, we plan to merge these extensive database changes. There will be breakage - bugs, fixes, and database migrations - during this time. This is your fair warning to either (a) prepare yourself with [a good backup and recovery strategy](/docs/general/administration/backup-and-restore) and disable automatic upgrades; or (b) move off of unstable onto 10.10.0 stable until the dust settles (but, please don't, as we need your help to test!)
Please read on for a more detailed overview if you are interested.
\- Joshua
{/* truncate */}
## What is EFCore, and why are we migrating to it?
EFCore is the C#/.NET database handling framework, which simplifies database query handling in the Jellyfin codebase.
Our original database code was written by Emby in a time long before .NET Core existed, when Mono ruled the world in terms of cross-platform C# compatibility. As such, it handled the database poorly: SQLite queries embedded directly in the code, and a fairly horrific schema with no migration capabilities. This has caused us a lot of problems over the years as we try to change and improve the codebase and add new features, and as such, the team began migrating to EFCore quite a while ago.
We were able to move many of the databases quickly, mostly due to the diligent work of [@BarronPM](https://github.com/barronpm); those have been live for several major releases now. But the Library database has remained as it was, due to its massive complexity and exceptionally poor schema. This has caused a lot of problems, for instance very slow search, problems adding new media types (or deprecating old ones), and lots of complexity inside the codebase around handling "non-standard" (i.e. not Movies/TV Shows/Music Albums) media types, resulting in bugs.
Now, thanks to [@JPVenson](https://github.com/JPVenson), we finally have the library database EFCore implementation ready to go. But there is a big catch.
## There Will Be Bugs
Once we merge this massive change set, there will be bugs. This is certain. And these bugs may completely trash your library database. So first and foremost, it is incredibly important that everyone running the Unstable builds understands that this is coming and how to prepare yourself.
## What we will be focusing on
Our primary goal will be to ensure that stable-to-stable migrations between 10.10.x and 10.11.x will work without a hitch, as we want and need this transition to be as seamless as possible for the majority of users running stable builds when 10.11.0 drops.
But to do this, we need to both test the changes in unstable, and ensure that our migrations are valid for data coming from the 10.10.x stable.
The downside of this is, though, that we might not be able to cleanly implement unstable-to-unstable migrations in a way that will work properly. While we will try to do this, we cannot guarantee it.
## Our timeline
1. This blog post starts the process to provide the warning to all unstable users that this is coming. Note that as of posting, unstable builds are disabled due to the recent 10.10.0 release, and will remain off for a little while.
2. About 1-2 weeks after this blog post, we will merge the Library EFCore migration into our `master` branch and begin preliminary testing. If you want to help here, you will have to [build Jellyfin from source](/docs/general/installation/advanced/source), and the more people who can help here the better!
3. About 2 weeks after merging, assuming everything looks generally OK, we will **re-enable unstable builds for the general public**. At this point, all unstable builds will apply the initial migrations on startup. That will bring us to about 4 weeks (give or take a week) from the 10.10.0 release.
4. Over the following weeks, we will take bug reports and try to correct them. This is the possible sticking point: if it's not possible for us to implement a clean set of migrations, we may decide to only focus the migration on stable-to-unstable conversions, rather than unstable-to-unstable. If this happens, you may need to restore a previous version and apply the new migrations to it.
## What this actually means for you
First and foremost, if this is too much for you, this is your warning for the off-ramp. Switch away from unstable **now** before we restore the unstable builds in a few weeks.
Second, **ensure you have a robust backup strategy [based on our suggested backup process](/docs/general/administration/backup-and-restore)**. Take backups regularly, and, to help us test, try to also have a backup of your last stable release so you can run that through the migrations as well. Take backups **before** applying the next unstable build, every time.
Third, **ensure you disable automatic upgrades**. We generally recommend this anyways, but if you're still doing this, now is the time to stop.
Fourth, **if you run into trouble, please ensure you report the bug with a title containing `[EFCore Library]`**. This will help us find and fix the bugs.
Fifth and finally, **if you have a failing migration, restore an older database version first and try to re-run it**. If it still fails, try your oldest (ideally, 10.9.11 or 10.10.0 stable) backup as well. If _that_ one doesn't work, it's a new bug to report.
Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

+136
View File
@@ -0,0 +1,136 @@
---
title: Jellyfin for Android TV 0.18
authors:
- nielsvanvelzen
slug: androidtv-v0.18.0
tags: [release, android-tv]
---
Version 0.18 of our Jellyfin for Android TV app is ready! Exciting features like lyrics and media segments are now available, along with
significant improvements to subtitles and more.
{/* truncate */}
This release marks another milestone in our journey to delivering the best media app on Android TV. Jellyfin 10.10 or newer is required. A
complete list of changes, including their respective pull requests, can be found on
[GitHub](https://github.com/jellyfin/jellyfin-androidtv/releases/tag/v0.18.0). I've listed a subset of all changes below.
### Skipping intros, outros and more with media segments
Media segments are a new feature added in Jellyfin 10.10. A segment provides metadata for specific parts of a video or audio file. This can
be used to mark an intro in your episode or the credits of a movie. The Android TV app can now use those segments to skip parts. By default,
the app will ask to skip intros and outros, but you can fine-tune this to your liking within the app preferences. All media segment types
are supported: intro, outro, preview, recap and commercial with three actions to choose from:
- **Skip**
Immediately skips the playback forward to the end of the segment, or the next episode
- **Ask to skip**
Shows a popup that the segment can be skipped by pressing the OK button on your remote and disappears after 8 seconds or when pressing the
back button.
![Ask to skip button shown during video playback](./asktoskip.png)
- **Do nothing**
The segment will be ignored, with no skips or popups.
More actions and functionality related to media segments is already in the works for future releases, like a "mute" action that temporarily
silences audio.
### Revamped subtitles
This release completely redesigns the way subtitles are loaded and shown on screen, resolving a large number of issues reported over the
past few years.
Previously the app did not support embedded subtitles and forced the server to extract them from video files first. This is a resource-heavy
process and often causes subtitles to not show up or with a big delay. A workaround for this was to use the "Subtitle Extract" plugin that
will do this extraction ahead of time, this was cumbersome and is now no longer necessary.
Together with these loading changes, the app now reliably supports Presentation Graphic Stream (PGS) subtitles and positioning tags in the
SubRip Subtitle Format (SRT), a much requested feature!
To make these changes happen, the preferences for subtitles have also slightly changed. It is now possible to choose your own background and
outline colors.
### Sing along with lyrics
Not only did video playback improve, playing music has gotten some upgrades as well! The most exciting change here is support for lyrics.
Whenever your song has lyrics available (added by a plugin or on your file system), they will be shown in the app. This works especially
well when combined with our screensaver, which will show lyrics fullscreen.
![Screensaver showing lyrics for the playing song](./lyrics.png)
Currently, 2 types of lyrics are supported: timed lyrics, which will highlight the current line of the vocal track, and untimed lyrics,
which will automatically scroll based on the track duration.
In addition to the lyric changes, some bugs have been fixed where a music queue would never disappear when the last track ends and some text
elements did not update properly.
### Other changes
In addition to the previously mentioned changes there's a lot more to enjoy. The video player will no longer randomly show its controls and
they stay hidden when the video is loading for a smoother experience. An issue where sorting libraries by "last played" did not work for TV
shows was fixed. And finally, a lot of improvements under the hood were made to make the app faster, easier to maintain, and more stable
than ever.
There are as also two new experimental options for playback. The first one is related to decoding audio codecs, while normally the app will
automatically fall back to using a different decoding approach using FFmpeg, this might not always work. You can now enable the "Prefer
FFmpeg for audio playback" preference to force the fallback approach.
The second experimental option adds support for previews when scrubbing, once "Enable trickplay in video player" is checked you'll see image
previews above the progress bar while scrubbing through your videos! There are some issues and annoyances with the current implementation
which will be resolved before this feature will be enabled by default and marked non-experimental. Make sure the Trickplay feature is
enabled on your libraries for the previews to show up.
![Video scrubbing previews in the video player](./trickplay.png)
## Contributors
Jellyfin is completely developed by volunteers, and couldn't be made without their great skills and dedication. Consider donating if you
appreciate their work. A big shout-out to all contributors that made this release possible:
**Jellyfin Team**
- [@nielsvanvelzen](https://github.com/nielsvanvelzen) - Donate via [GitHub sponsors](https://github.com/sponsors/nielsvanvelzen)
**Other contributors**
- [@MichaelRUSF](https://github.com/MichaelRUSF)
- [@JagerSprinkles](https://github.com/JagerSprinkles)
- [@pascalwei](https://github.com/pascalwei)
- [@kabel2](https://github.com/kabel2)
- [@starsep](https://github.com/starsep)
- [@rickysixx](https://github.com/rickysixx)
- [@ericleb010](https://github.com/ericleb010)
- [@reacocard](https://github.com/reacocard)
And finally a big thank you to everyone who contributed translations, reported bugs, provided feedback and participated in beta testing!
### Helping out
If you have experience with Android TV development or with Kotlin and are interested in contributing yourself, feel free to dive into the
[source code](https://github.com/jellyfin/jellyfin-androidtv) and open a pull request. Alternatively, you can help with translating the app
into your own language on our [Weblate](https://translate.jellyfin.org/engage/jellyfin-android/) instance.
## Downloads
Update your app now to check out all these changes! The app stores will auto-update your Jellyfin app if you're already using the app. For
new users, you can find the app on the app store of your platform.
<a className='margin-right--md' href='https://play.google.com/store/apps/details?id=org.jellyfin.androidtv'>
<img width='153' alt='Jellyfin for Android TV on Google Play' src='/images/store-icons/google-play.png' />
</a>
<a className='margin-right--md' href='https://www.amazon.com/gp/product/B07TX7Z725'>
<img width='153' alt='Jellyfin for Fire TV at Amazon App Store' src='/images/store-icons/amazon.png' />
</a>
<a href='https://f-droid.org/en/packages/org.jellyfin.androidtv/'>
<img width='153' alt='Jellyfin for Android TV on F-Droid' src='/images/store-icons/fdroid.png' />
</a>
Direct downloads are available for sideloading at [repo.jellyfin.org](https://repo.jellyfin.org/releases/client/androidtv/)
or in the [GitHub release assets](https://github.com/jellyfin/jellyfin-androidtv/releases/latest).
You can also join our [beta program on Google Play](https://play.google.com/apps/testing/org.jellyfin.androidtv) and help test new versions
before they're released to the public. [Read more](../../2021/07-24-android-betas.mdx) about our beta program.
Binary file not shown.

After

Width:  |  Height:  |  Size: 586 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

+55
View File
@@ -0,0 +1,55 @@
---
title: EFCore refactoring is here
description: EFCore, Jellyfin and me.
authors: JPVenson
slug: efcore-refactoring
tags: [unstable, warning, efcore]
---
EFCore has landed in unstable, and this will have consequences.
We have finally reached our first milestone in cleaning up the legacy database access code. This means that all SQL builders that targeted SQLite directly have been removed from code. This marks the first step towards a completely new database design, but we now need to take a quick look ahead and see what's next.
Unstable builds will be temporarily turned off this week, skipping the 20250127 unstable to provide a full week of in-master testing, and will be re-enabled for the 20250203 unstable next week, so ensure you have backups ready this week if you run unstable builds.
Otherwise please read on to see what exactly that means and what the future brings.
\- JPVenson
{/* truncate */}
## What exactly have we done
[Joshuas blog post](../../2024/11-03-efcore-refactoring-incoming/index.mdx) in November 2024 outlined much of what we aimed to achieve, and I want to take this opportunity to address the feedback and questions we've received, clarifying a few key points.
The old code included many instances of direct access to the underlying SQLite database.
SQLite is a file-based database where Jellyfin stores most of its important data.
This has been an issue for 4 reasons.
1. The old code was very poorly written
2. The old code was very complex
3. The old code was explicitly written to support SQLite only and nothing else
4. The old code migration handling was manual and error-prone
Because of this, we have been unable to quickly and reliably extend the database to add new features or improve existing ones. The new code uses EntityFramework migrations, which is the industry standard for database migrations in the C# ecosystem.
## What haven't we done
While we are currently working on it, the current code does __not__ add support for alternative database providers on its own.
Adding support for other database providers will be a significant change beyond just the refactor, and when introduced, will likely remain highly experimental for quite some time.
Very importantly, we have not yet optimized the rest of Jellyfin to work with the new database access. That means it is possible that unstable builds may be significantly slower while we are rewriting the rest of the code to utilize the new structures.
The new architecture also allows for a proper way of backing up Jellyfin instances while they are running, something that was previously impossible to do reliably.
## The Future
Unstable builds have been active for some time, but we will be temporarily turning them off this week, skipping the 20240127 unstable to provide a full week of in-master testing as originally stated by Joshua. We will re-enable unstable builds for the 20240203 unstable week with these changes, so ensure you have backups ready this week if you run unstable builds.
The migration will aggregate the old `library.db` into the `jellyfin.db` file and then rename it to `library.db.old`, so the unstable builds will no longer be compatible with the previous versions.
To migrate, we explicitly __do not support versions older than 10.10.3__. This means that if you want to test the migrations, you must start with an up-to-date database from the 10.10.z release train or current unstable.
Thank you, and if you have questions, please don't hesitate to join our matrix channels for assistance.
\- JPVenson.
+91
View File
@@ -0,0 +1,91 @@
---
title: Jellyfin for iOS 1.6.0
authors:
- thornbill
slug: ios-v1.6.0
tags: [release, ios]
---
Jellyfin for iOS is back with the first release in nearly 3 years!
{/* truncate */}
Version 1.6.0 of the Jellyfin app for iOS marks a new milestone for the development of the app. A complete list of changes, including their
respective pull requests, can be found on [GitHub](https://github.com/jellyfin/jellyfin-expo/releases/tag/v1.6.0). An update on the
development of the app, a summary of included changes, and some future plans can be found below.
### Renewed development with more frequent releases
I'm sure a lot of people are curious why it has been so long since the last app release. There are a few reasons for this. First, we have
not released any breaking changes to Jellyfin that required an app update. Perhaps most significantly the toolkit we use to build the app
made some changes that essentially prevented my continued development of the app without access to a modern Mac. However, thanks to the
generosity of contributors to [Jellyfin's open collective](https://opencollective.com/jellyfin), I was able to expense the majority of the
cost to purchase a new Mac Mini for development. Finally, the build system provided by the toolkit we were using had been discontinued. We
have now replaced that build system with a fully automated GitHub Action workflow that builds and publishes the app to
[TestFlight](https://testflight.apple.com/join/jJP75akQ) on demand.
### Longstanding bugs squashed
This release features fixes for the following longstanding bugs:
- Improved video player UI by allowing the video to cover the entire screen and hiding the home screen indicator.
- Removed an incorrect check for (e)ac3 audio support.
- Fixed an issue that caused the app to display a blank screen sometimes when left open in the background.
- Added user device name entitlement so the app can report the correct device name on iOS 16+.
- Excluded unused features from the build so the app no longer requests access to permissions it doesn't need (like fitness data).
### What is next?
While the primary focus of the next couple releases will be to do some dependency maintenance and updates, you can also expect work to
continue on some exciting new features. Few people are probably aware that I started working on offline support
[3 years ago](https://github.com/jellyfin/jellyfin-expo/pull/366)! Unfortunately it
[wasn't quite ready](https://github.com/jellyfin/jellyfin-expo/issues/372) for this release, but my goal is to make it available as a
general alpha/beta feature later this year. I have some other ideas to address some well-known limitations of the app and a new contributor
has expressed interest in developing some new features also. You can track all new developments on the
[project roadmap](https://github.com/orgs/jellyfin/projects/40/views/4) on GitHub.
### Supported iOS versions
The Jellyfin app currently supports iOS versions as old as iOS 12. Over the next few releases, we will be updating our core dependencies
which will force us to increase our minimum supported version to iOS 15.1. If you are using a device that cannot be updated to a newer
iOS version, you will still be able to use the Jellyfin web interface but future app updates will be unavailable.
## Contributors
Jellyfin is completely developed by volunteers, and couldn't be made without their great skills and dedication. Consider donating if you
appreciate their work. A big shout-out to all contributors that made this release possible:
**Jellyfin Team**
- [@thornbill](https://github.com/thornbill) - Donate via [GitHub sponsors](https://github.com/sponsors/thornbill)
- [@anthonylavado](https://github.com/anthonylavado) - Donate via [GitHub sponsors](https://github.com/sponsors/anthonylavado)
- [@Bond-009](https://github.com/Bond-009) - Donate via [GitHub sponsors](https://github.com/sponsors/Bond-009)
- [@JPKribs](https://github.com/JPKribs)
**Other contributors**
- [@Drew-Daniels](https://github.com/Drew-Daniels)
- [@fidoriel](https://github.com/fidoriel)
- [@Cyberbeni](https://github.com/Cyberbeni)
And finally a big thank you to everyone who contributed translations, reported bugs, provided feedback and participated in beta testing!
### Helping out
If you have experience with React Native development and are interested in contributing yourself, feel free to dive into the
[source code](https://github.com/jellyfin/jellyfin-expo) and open a pull request. Likewise, if you have experience with
JavaScript/TypeScript and React, [jellyfin-web](https://github.com/jellyfin/jellyfin-web) is always looking for additional contributors.
Alternatively, you can help with translating the app into your own language on our
[Weblate](https://translate.jellyfin.org/engage/jellyfin-expo/) instance.
## Downloads
Update your app now to check out all these changes! The AppStore will auto-update your Jellyfin app if you're already using the app. For
new users, you can find the app on the Apple App Store.
<a href='https://apps.apple.com/us/app/jellyfin-mobile/id1480192618'>
<img width='153' alt='Download on the App Store' src='/images/store-icons/app-store.svg' />
</a>
You can also join our [TestFlight](https://testflight.apple.com/join/jJP75akQ) and help test new versions before they're released to the
public.
Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

+144
View File
@@ -0,0 +1,144 @@
---
title: Roku Version 3.0.0
description: You Wanted the Best, You Got the Best!!
authors: 1hitsong
slug: roku-300
tags: [release, roku]
---
You know the feeling when the assignment was to write a 500 word paper, but you have so much to cover that your first draft is 25,000 words?
...what? Just me?
That's exactly how I feel attempting to condense all the new features, bug fixes, refreshed UI components, and improvements found in Jellyfin for Roku 3.0.0 into a single blog post.
But I'll do my best, here goes.
\- 1hitsong
{/* truncate */}
### Trickplay Images
![Screenshot of trickplay images in the Jellyfin Roku channel](./trickplay.jpg)
When seeking through your videos, if you've enabled and generated trickplay images on your server, you will see a small still frame image from the video at that timestamp. This image allows you to easily find the exact time in the video you're looking for.
**Note:** Older Roku devices and lower powered Roku devices (such as Roku TVs) will likely require your trickplay tiles be a 5x5 grid and not the default 10x10 grid. [Click here](https://github.com/jellyfin/jellyfin-roku/issues/14) for more information and detailed instructions.
### Timed Lyrics
![Screenshot of a song playing and displaying lyrics timed with the audio track](./timedLyrics.jpg)
Support for timed lyrics has been added. If you have lrc files with timestamps, the music player will display the lyrics and move the highlight along automatically. Just in time for your next karaoke party!
### Media Segments
![Skip Intro button displayed over TV show introduction](./skipIntro.jpg)
Stop manually skipping intros and outros! Jellyfin on Roku now supports media segments. If you have media segments configured on your server, the video player will recognize the segments and take whatever action you set in the Roku settings. Auto-skip? Display a skip button? Nothing? You have the power to decide.
### Audio Mini Player
![Audio mini player on the bottom of the home screen](./audioMiniPlayer.jpg)
You can now play audio and navigate around the channel. Simply start playing audio and press the back button. The audio mini player will appear at the bottom of your screen and continue playing the audio queue.
To move your cursor into the audio mini player, press the replay button on your remote. You can then select the playback buttons to move back/forward, play/pause, or stop. You can also return to the full audio player screen by selecting the music note icon.
To move the cursor back out of the audio mini player, simply press the replay button again. Your cursor will then move back to the last item you had focused.
**Note:** The audio mini player will only appear if only audio media is in the queue. If any other type of media is in the queue it will not appear and pressing back will simply stop playback.
### My List - Your Own Personal \"Watch Later\" list
![Home screen showing the My List row](./myList.jpg)
Want to mark a video to watch later? Add it to your list. From the detail screen click on the add to My List button or using the new item option menu, move the cursor over an item on the home screen or in a library and press the \* button on your remote and choose add to My List.
There are two easy ways to view your list. On the home screen, scroll down to the My List row, or select the My List item from the my media row.
Currently, only video files are supported by My List.
### Item Option Menu
![Option menu displayed when you have an item focused and press the * button](./itemOptionMenu.jpg)
On Roku you can't right-click on an item to get an option menu, so we made one using the \* button.
With the cursor on an item, press \* on your remote to get the option menu. Depending on the context of the screen you are on, an assortment of functions will be presented to you.
Options such as add to My List, add to playlist, mark as played/unplayed, go to series/season, remove from playlist, and more.
### Audio/Subtitle Track Selection Updates
![Popup dialog showing user selecting subtitles prior to playing a movie](./selectSubtitles.jpg)
A much requested feature, you can now select your subtitle and audio tracks prior to playing a video. Simply click on the options button from the detail screen and make your selections.
### Remote Subtitle Management
![Popup dialog showing user searching for subtitles to download to their server](./remoteSubtitles.jpg)
Ever start watching a movie and realize you need subtitles, but find you don't have any loaded in Jellyfin?
Previously you would either have to just watch without them, or get on your server to download them.
Now you can click the manage subtitles button on the detail screen and search for subtitle files to download and use.
Simply choose your language and press search. A list of found subtitles will display and allow you to choose one to download. The selected subtitle file will download to your server and will be selectable from the subtitle selection functions.
**Note:** The manage subtitles button will only display for users who are allowed to edit subtitles.
### Audiobook Support
![Audio player playing Salem's Lot (Part 2) audiobook](./audioBook.jpg)
Audiobooks are books (though there's [discussion](https://github.com/jellyfin/jellyfin-meta/discussions/87) about changing that in Jellyfin), but not all books are audiobooks. Jellyfin on Roku now has basic audiobook support so you can listen to your collection.
### Force Transcoding Options
![Popup dialog showing Force Transcoding option](./forceTranscoding.jpg)
Sometimes you have media Roku believes it can directplay, but can't. In the past the only method to get it to play was to force low bitrate limits, or other weird hurdles to make it transcode.
Now you can click the options button on the detail screen and force transcoding on this one item.
Or, if you prefer, you can enable the new user setting to force transcoding for all playback. _TRANSCODE ALL THE THINGS!_
### Search Updates
![Search results showing songs and people](./searchUpdates.jpg)
Live TV programs, people, and playlists are now included in search results.
### Refreshed UI on many screens
![Redesigned TV episode screen](./refreshedUI.jpg)
As you navigate around the channel you'll see both major and minor UI changes. Some were necessary to support new features. Some were necessary to remove minor annoyances. ...and some were necessary to stop all of us yelling at our TVs. 😆
There are simply too many amazing things in this release to name them all! To read the full list of changes, please read the full [release notes](https://github.com/jellyfin/jellyfin-roku/releases/tag/3.0.0).
## 👥 Contributors
Jellyfin is developed by volunteer contributors, and we couldn't do without their great skills and dedication.
They don't get paid by any organizations, so consider donating if you appreciate their work.
A big shout-out to all contributors that made this release possible:
**Jellyfin Team**
- [@1hitsong](https://github.com/1hitsong) - Sponsor via [GitHub sponsors](https://github.com/sponsors/1hitsong)
- [@jimdogx](https://github.com/jimdogx)
**Other contributors**
- [@K-Money](https://github.com/K-Money)
- [@Insprill](https://github.com/Insprill)
## 💾 Downloads & Changelog
The complete list of changes for this release, including all merged pull requests, can be found on
[GitHub](https://github.com/jellyfin/jellyfin-roku/releases/tag/3.0.0).
Your installed Jellyfin channel should automatically update once available or you can install Jellyfin
from the [Roku Channel Store](https://channelstore.roku.com/en-ca/details/4d9e526a7d972d4decf98ea6a84000f7:c617f4902629cc0bd1e1411db1775cf3/jellyfin).
Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

+33
View File
@@ -0,0 +1,33 @@
---
title: Jellyfin for Xbox 0.9.0
authors:
- JPVenson
slug: xbox-v0.9.0
tags: [release, xbox, uwp]
---
Better late then never. The Xbox app for Jellyfin now has a new maintainer and its first release in 5 years.
\- JPVenson
{/* truncate */}
The Jellyfin app on Xbox has been unmaintained for quite a while.
While it was on lifesupport for the last couple of years, we were occasionally fixing bugs.
With the last release now 5 years old, and the continued interest in Jellyfin being available on Xbox overall, I decided to take over at least the superficial duties of keeping it operational and releasing when there are new features or bug fixes.
# Xbox 0.9.0 release
This new release has now been approved and is available as a new version on the Microsoft store for up-to-date Xbox consoles.
It contains a number of bug fixes, but the main change is the switch of the web browser engine the Xbox app is using, to a newer and more feature rich Chromium-based browser implementation instead of the old, legacy Edge one.
This allows us to expand support to formats such as HEVC/4K and HDR on supported devices, in future releases after further testing.
# What to expect
I will be actively managing pull requests and try my best with bug reports, though we are still very reliant on your help with new features and bugfixes.
If there are enough features and bug fixes done and merged, you can expect more releases in the future, though I will not give a definitive timeline for that.
\- JPVenson.
+20 -2
View File
@@ -48,12 +48,30 @@ Maxr1998:
nielsvanvelzen:
name: Niels van Velzen
title: Android Lead
url: https://github.com/nielsvanvelzen
page: true
title: Core Team, Android Lead
image_url: https://avatars.githubusercontent.com/u/2305178?v=4
socials:
github: nielsvanvelzen
mastodon: https://mastodon.social/@hetisniels
Shadowghost:
name: Tim Eisele
title: Server Team
url: https://github.com/Shadowghost
image_url: https://avatars.githubusercontent.com/u/3741446?v=4
JPVenson:
name: Jean-Pierre Bachmann
title: Server Team
url: https://github.com/JPVenson
image_url: https://avatars.githubusercontent.com/u/6794763?v=4
thornbill:
name: Bill Thornton
page: true
title: Core Team, Web Lead
image_url: https://avatars.githubusercontent.com/u/3450688?v=4
socials:
github: thornbill
mastodon: https://fosstodon.org/@thornbill
+11 -11
View File
@@ -21,15 +21,15 @@ Since December 2018, the project has grown immensely, through several speedbumps
### Core Team
The core team consists of those with merge permissions on the main Jellyfin repositories, and thus have the ultimate decision authority for contributions to the core Jellyfin server and web client.
The core team consists of those with merge permissions on the main Jellyfin repositories, and thus have the ultimate decision authority for contributions to the core Jellyfin server and web client. In addition, each member has various other roles and responsibilities as defined below.
| Person | Contact |
|---|---|
| Joshua Boniface (Project Leader) | [GitHub](https://github.com/joshuaboniface) [Matrix](https://matrix.to/#/@joshuaboniface:bonifacelabs.ca) [Email](mailto:joshua@boniface.me) |
| Anthony Lavado | [GitHub](https://github.com/anthonylavado) |
| Andrew Rabert | [GitHub](https://github.com/nvllsvm) |
| Bond-009 | [GitHub](https://github.com/Bond-009) |
| dkanada | [GitHub](https://github.com/dkanada) |
| Claus Vium | [GitHub](https://github.com/cvium) |
| Bill Thornton | [GitHub](https://github.com/thornbill) |
| Cody Robibero | [GitHub](https://github.com/crobibero) |
| Person | Contact | Role(s) |
|---|---|---|
| Joshua Boniface | [GitHub](https://github.com/joshuaboniface) [Matrix](https://matrix.to/#/@joshuaboniface:bonifacelabs.ca) [Email](mailto:joshua@boniface.me) | **Project Leader**, Packaging, Releases, Finance, Infrastructure |
| Anthony Lavado | [GitHub](https://github.com/anthonylavado) | Social Media, Outreach, Finance |
| Andrew Rabert | [GitHub](https://github.com/nvllsvm) | Finance |
| Bond-009 | [GitHub](https://github.com/Bond-009) | Server |
| Claus Vium | [GitHub](https://github.com/cvium) | Server |
| Bill Thornton | [GitHub](https://github.com/thornbill) | Web |
| Cody Robibero | [GitHub](https://github.com/crobibero) | Server, Plugins |
| Niels van Velzen | [GitHub](https://github.com/nielsvanvelzen) | Clients |
@@ -0,0 +1,74 @@
---
uid: backup-and-restore
title: Backup and Restore
---
# Backup and Restore
This guide documents how to both back up and then restore the data in your Jellyfin instance.
## Why Backing Up is Important
Backups are important in general for all digital data. There are myriad possible bugs and issues that can arise and cause data loss, especially when you upgrade major releases (for instance, from Jellyfin 10.9.x to Jellyfin 10.10.x).
In addition, Jellyfin does not have a downgrade mechanism. This is very important to understand; once your Jellyfin instance has been started with a new version, any pending migrations are immediately applied, and your Jellyfin data will no longer work with the old version. The **only** way to restore your active instance back to the old version is to restore a backup. Backups are thus critical if you want to test Unstable versions, or before upgradiing to the latest version. In fact, when testing Unstable, it is best to back up much more regularly, perhaps using a cron job or similar automatic mechanism, to ensure that your data can be recovered if you hit a major issue.
Backups may also come in handy if you hit a bug. For instance, if a bug in the new version causes corruption of some aspect of the Jellyfin data, restoring from a backup means you can quickly restore to good data and apply any fixes to avoid a repeat. Without a backup, you would be completely out of luck in this situation.
Finally, administrative mistakes, normal operation issues (e.g. filling up a disk), or general bit rot can cause corruption or issues that require a backup to be restored. It's always better to have one than not.
## Taking a Backup
1. Stop the running Jellyfin server. This is extremely important, as otherwise the database will be locked and might not be recoverable when restoring. Note that this will interrupt any playback.
* Any platform: Within the Jellyfin Dashboard, click "Shutdown". This should cleanly stop the process on all platforms, but if not, try one of the following.
* Docker: `docker stop jellyfin`
* Debian/Ubuntu packages: `sudo systemctl stop jellyfin` or `sudo service jellyfin stop`
* Windows Installer: Right-click the Tray app, and select "Quit"; or, in Process Manager, find the Jellyfin process and terminate it.
* MacOS Installer (.dmg): In Activity Monitor, find the Jellyfin process and terminate it.
* Portable Installs (regardless of platform): Stop the running `jellyfin` or `jellyfin.exe` program, however it was started.
2. Copy your data and configuration directories to a destination of your choice. What you name the copies is up to you; personally, I like to use dated and versioned directory names e.g. `jellyfin.2024-05-01_10.8.13`. Where these files are also depends on the platform; generally these follow the [XDG Directory Specification](https://specifications.freedesktop.org/basedir-spec/latest/) for platforms that support it. For more information see [the configuration documentation](/docs/general/administration/configuration/#server-paths).
**NOTE**: These are default locations; if you've changed your data or config paths, use those instead.
* Official Docker: Wherever your `/data` and `/config` volumes are sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`.
* LinuxServer.io Docker: Data and config are wherever your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`.
* Debian/Ubuntu packages: Data is in `/var/lib/jellyfin` and config is in `/etc/jellyfin`; these are defined in `/etc/default/jellyfin`.
* RPMFusion Fedora/CentOS packages: Data is in `/var/lib/jellyfin` and config is in `/etc/jellyfin`; these are defined in `/etc/sysconfig/jellyfin`.
* Windows Tray/Installer (.exe): Data and config is in `%PROGRAMDATA%\Jellyfin\Server` (`C:\ProgramData\Jellyfin\Server`) or `%LOCALAPPDATA%\Jellyfin` (`C:\Users\<Username>\AppData\Local\Jellyfin`).
* MacOS Installer (.dmg): Data is stored in one of these paths; back up whichever one(s) exist: `~/.config/jellyfin/`, `~/.local/share/jellyfin/`, `~/Library/Application Support/Jellyfin/`.
* Portable Installs:
* Linux: Data is stored in `~/.local/share/jellyfin` and config in `~/.local/share/jellyfin`.
* Windows: Data and config is in `C:\Users\<Username>\AppData\Local\Jellyfin`, using `%LOCALAPPDATA%`.
* MacOS: Data is stored in these paths; back up whichever one(s) exist: `~/.config/jellyfin/`, `~/.local/share/jellyfin/`, `~/Library/Application Support/Jellyfin/`.
As an example, on Debian, you can do this with these commands to make a copy of both directories into a single target directory:
```bash
TIMESTAMP=$(date +%Y%m%d%H%M%S)
VERSION=10.9.10
sudo mkdir -p /media/backups/jellyfin.${TIMESTAMP}_${VERSION} # Or change the path wherever in your system makes sense to you
sudo cp -a /var/lib/jellyfin /media/backups/jellyfin.${TIMESTAMP}_${VERSION}/data
sudo cp -a /etc/jellyfin /media/backups/jellyfin.${TIMESTAMP}_${VERSION}/config
```
3. Start up Jellyfin again, either after upgrading or on the current version. You now have a safe copy of your data in the path chosen in step 2.
## Restoring a Backup
This process assumes you followed the steps above to take the backup.
1. Stop the running Jellyfin server process.
2. Move your current data and configuration directories out of the way (e.g. by appending `.bak` to them). For example, `sudo mv /var/lib/jellyfin /var/lib/jellyfin.bak` and `sudo mv /etc/jellyfin /etc/jellyfin.bak`.
3. Copy - **do not move or rename** - your backup to the existing name. For example, `sudo cp -a /media/backups/jellyfin.2024-10-27_10.9.11/data /var/lib/jellyfin` and `sudo cp -a /media/backups/jellyfin.2024-10-27_10.9.11/config /etc/jellyfin`.
4. If required, downgrade Jellyfin to the same version as your backup now.
5. Start up Jellyfin again. It should start cleanly with the old data, assuming versions are correct. If you downgraded this may happen automatically.
## The Future
Long-term, we have plans to provide an official backup and restore plugin bundled with Jellyfin, however this requires the completion of our EFCore rewrite, which is currently slated for our next major release 10.11.0. Once that becomes available, this document will be updated to reflect the process using that plugin.
+24 -17
View File
@@ -27,9 +27,18 @@ This is the directory that will hold all Jellyfin data and is also used as a def
1. Command line option `--datadir`, if specified
2. Environment variable `JELLYFIN_DATA_DIR`, if specified
3. `<%APPDATA%>/jellyfin`, if running on Windows
4. `$XDG_DATA_HOME/jellyfin`, if `$XDG_DATA_HOME` exists
5. `$HOME/.local/share/jellyfin`
3. `<%ProgramData%>\Jellyfin\Server`, if launching from the Windows Tray app.
4. `<%LocalAppData%>\jellyfin`, if launching the Windows server directly.
5. `$XDG_DATA_HOME/jellyfin`, if `$XDG_DATA_HOME` exists
6. `$HOME/.local/share/jellyfin`
:::note
Windows users can also specify the data directory using a Windows Registry string key called `DataFolder` located at `Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Jellyfin\Server`
An additional string key called `InstallFolder` in `Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Jellyfin\Server` can also specify the install location.
:::
### Configuration Directory
@@ -75,7 +84,7 @@ This is the directory where the Jellyfin logs will be stored. It is set from the
## Main Configuration
The main server configuration is built upon the ASP .NET [configuration framework](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1), which provides a tiered approach to loading configuration. The base directory to locate the configuration files is set using the [configuration directory](#configuration-directory) setting. The configuration sources are as follows, with later sources having higher priority and overwriting the values in earlier sources.
The main server configuration is built upon the ASP .NET [configuration framework](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-8.0), which provides a tiered approach to loading configuration. The base directory to locate the configuration files is set using the [configuration directory](#configuration-directory) setting. The configuration sources are as follows, with later sources having higher priority and overwriting the values in earlier sources.
1. **Hard-coded default values**: These defaults are specified in the Jellyfin [source code](https://github.com/jellyfin/jellyfin/blob/master/Emby.Server.Implementations/ConfigurationOptions.cs) and cannot be changed.
2. **Default logging configuration file** (`logging.default.json`): This file should not be modified manually by users. It is reserved by the server to be overwritten with new settings on each new release.
@@ -87,25 +96,21 @@ The main server configuration is built upon the ASP .NET [configuration framewor
:::
4. **Environment variables**: The [documentation](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1#environment-variables) provided by Microsoft explains how to set these configuration options via environment variables. Jellyfin uses its own custom `JELLYFIN_` prefix for these variables. For example, to set a value for the `HttpListenerHost:DefaultRedirectPath` setting, you would set a value for the `JELLYFIN_HttpListenerHost__DefaultRedirectPath` environment variable.
4. **Environment variables**: The [documentation](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-8.0#non-prefixed-environment-variables) provided by Microsoft explains how to set these configuration options via environment variables. Jellyfin uses its own custom `JELLYFIN_` prefix for these variables. For example, to set a value for the `HttpListenerHost:DefaultRedirectPath` setting, you would set a value for the `JELLYFIN_HttpListenerHost__DefaultRedirectPath` environment variable.
5. **Command line options**: Certain command line options are loaded into the configuration system and have the highest priority. The following command line options are mapped to associated configuration options.
- `--nowebclient` sets the `hostwebclient` configuration setting to false
- `--plugin-manifest-url` sets a value for the `InstallationManager:PluginManifestUrl` configuration setting
### Main Configuration Options
This section lists all the configuration options available and explains their function.
| Key | Default Value | Description |
| --------------------------------------- | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `hostwebclient` | `True` | Set to `True` if the server should host the web client. |
| `HttpListenerHost:DefaultRedirectPath` | `"web/index.html"` if `hostwebclient` is true; `"swagger/index.html"` if `hostwebclient` is false | The default redirect path to use for requests where the URL base prefix is invalid or missing |
| `InstallationManager:PluginManifestUrl` | `"https://repo.jellyfin.org/releases/plugin/manifest.json"` | The URL for the plugin repository JSON manifest. |
| `FFmpeg:probesize` | `"1G"` | Value to set for the FFmpeg `probesize` format option. See the FFmpg [documentation](https://ffmpeg.org/ffmpeg-formats.html#Format-Options) for more details. |
| `FFmpeg:analyzeduration` | `"200M"` | The value to set for the FFmpeg `analyzeduration` format option. See the FFmpg [documentation](https://ffmpeg.org/ffmpeg-formats.html#Format-Options) for more details. |
| `playlists:allowDuplicates` | `True` | Whether playlists should allow duplicate items or automatically filter out duplicates. |
| `PublishedServerUrl` | Server Url based on primary IP address | The Server URL to publish in udp Auto Discovery response. |
| Key | Default Value | Description |
| ------------------------ | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `hostwebclient` | `True` | Set to `True` if the server should host the web client. |
| `FFmpeg:probesize` | `"1G"` | Value to set for the FFmpeg `probesize` format option. See the FFmpg [documentation](https://ffmpeg.org/ffmpeg-formats.html#Format-Options) for more details. |
| `FFmpeg:analyzeduration` | `"200M"` | The value to set for the FFmpeg `analyzeduration` format option. See the FFmpg [documentation](https://ffmpeg.org/ffmpeg-formats.html#Format-Options) for more details. |
| `PublishedServerUrl` | Server Url based on primary IP address | The Server URL to publish in udp Auto Discovery response. |
## Fonts
@@ -113,7 +118,7 @@ Jellyfin uses fonts to render text in many places.
### Server Side System Fonts
The system fonts installed on the server are used for burning in subtitles and rendering cover images. How to install them depends on the operating system.
The system fonts installed on the server are used for burning in subtitles and rendering cover images. How to install them depends on the operating system or if a container is being used.
### Client Side System Fonts
@@ -121,7 +126,9 @@ The system fonts installed on the client devices are used to display the text in
### Fallback Fonts
The `Fallback Fonts` option is currently used by the web client to render subtitles only. This can be set to a folder containing fonts for this purpose. These fonts are limited to a total size of 20MB. Lightweight formats optimized for web like woff2 are recommended. A tool to convert normal TrueType (`.ttf`) and OpenType (`.otf`) fonts to woff2 can be found [in their repo](https://github.com/google/woff2).
The `Fallback Fonts` installed on the server are loaded up by the web client to render ASS subtitles. They will be used if no other existing fonts (such as MKV attachments or client-side fonts) can be used to render certain glyphs, such as CJK characters, instead of displaying an empty "tofu" block.
This setting can be set to a folder on the server containing fonts for this purpose. These fonts are limited to a total size of 20 MB, since all of them will be always preloaded in the browser, regardless of whether they'll be needed or not. Lightweight formats optimized for web like woff2 are recommended. A tool to convert normal TrueType (`.ttf`) and OpenType (`.otf`) fonts to woff2 can be found [in their repo](https://github.com/google/woff2).
### Downloading Fonts
+123 -85
View File
@@ -9,55 +9,82 @@ This page covers what you need to know in order to select appropriate hardware f
## TL;DR
For a Jellyfin server, the following is recommended:
Below is a list of recommended specs to run Jellyfin. Even though Jellyfin will work on even lower end hardware, the following specs are recommended for a good experience.
### Normal Server
### Shared Items
- CPU (With dGPU): Intel Core i5-2300, AMD Ryzen 3 1200 or better. (Geekbench 6 Multicore 1500 or better). *CPU vendor will not have a meaningful impact on quality and/or speed of transcoding.*
- CPU (Without dGPU): Intel Pentium G4560, Intel Core i3-7100 or better. (Intel 7th gen or newer Pentium or better, excluding J and N series)
- RAM: 8GB or more
- Storage: 60GB SSD storage for Jellyfin files and transcoding cache.
- Graphics: Intel HD 6xx (7th gen integrated graphics) or newer, Nvidia GTX 16 / RTX 20 series or newer (excluding GTX 1650). Intel is recommended over Nvidia. AMD and Apple Silicon are not recommended.
Some component recommendations do not change regardless of the hardware configuration:
:::note Intel "Atom" CPUs
- Storage: 100GB SSD for your OS, Jellyfin files and transcoding cache.<sup>1</sup> Consider adding more on Windows 11, or if you have many large media files that need transcoding.
- Networking: Gigabit Ethernet Adapter or faster, WiFi or Powerline not recommended.
- Internet Connection: At least 20mbps upload bandwidth for remote access.<sup>2</sup>
Atom CPUs in this guide refer to any Intel Atom CPUs, as well as other low powered Intel CPUs such as J/M/N/Y series from other product lines. (eg. Pentium N5105, Pentium N6000, Core i3 N305). While these CPUs are branded as products from other product lines, they use the same microarchitecture as Intel's low powered chipsets and may be significantly less powerful and have less features than their names might otherwise suggest.
<sup>1</sup>Your largest media file times the max number of concurrent streams all your users will consume can be used as a rule of thumb for the transcoding file size. <br />
<sup>2</sup>If you have less than 100mbps of total upload bandwidth, a bandwidth limit of 70% of your upload speed for Jellyfin is recommended to avoid affecting normal internet usage. This option can be found in the dashboard.
### Hardware Encoder Quality
Different vendors have different hardware encoder implementations and produce different results. Usually, newer generations within the same vendor will provide better results. The following is a quick comparison on the quality between vendors on modern products.
Apple ≥ Intel ≥ Nvidia >>> AMD<sup>\*</sup>
<sup>\*</sup> This only represents the default Jellyfin settings. The quality may be different depending on your exact configuration.
### Server with Integrated Graphics
If you are not planning to use a dedicated graphics card, the following specs are recommended:
- CPU: Intel Core i5-11400, Intel Pentium Gold G7400, Intel N100, Apple M series or newer (excluding Intel J/M/N/Y series up to 11th gen)
- RAM: 8GB System RAM (Consider adding more on Windows 11)
- Graphics: Intel UHD 710, Apple M series or newer
AMD is **NOT** recommended if you plan to use integrated graphics for Jellyfin.
:::caution
Intel 7-10th gen CPUs have been removed from this list, since the toolkit for these generations has been deprecated by Intel. If you own 7-10th gen CPUs with integrated graphics, please continue to use them for Jellyfin, as they are still perfectly capable of performing the task. If you are making a purchase decision, please consider something else instead.
:::
:::note These are Recommended Specs
### Server with Dedicated Graphics
These specs are the **recommended** specs to run Jellyfin. They are not minimum requirements, and it is certainly possible to run Jellyfin on lower end hardware.
If you are planning to use a dedicated graphics card (including upgrading an old system with a dedicated GPU), the following specs are recommended:
- CPU: Intel Core i5-2300 AMD FX-8100 or better (Geekbench 6 Multicore 1500 or better), CPU Vendor / Performance will **NOT** affect hardware encode speed or quality
- RAM: 8GB (4GB should be enough for a server running Linux without a GUI)
- Graphics: Intel Arc A series or newer, Nvidia GTX16/RTX20 series or newer (Excluding GTX1650), **AMD is NOT recommended**.
Intel Drivers are much easier to install on Linux, with many distributions including them by default. If you do not need CUDA for other applications, it is highly recommended that you stick with Intel Graphics on Linux.
:::caution
Intel ARC B series cards require ReBar to be enabled. This means you must use it on a platform with Intel 10th gen, AMD Ryzen 3000 series or newer.
:::
:::caution Pre-built NAS Devices
### Servers without GPUs
Many pre-built NAS devices are underpowered. Please check your specs against the above recommendations for a good experience.
Not having a GPU is **NOT** recommended for Jellyfin, as video transcoding on the CPU is very performance demanding. HDR
to SDR tone-mapping can make the situation even worse. Depending on your configuration, you may end up in situations
where a Ryzen 9 5950X cannot handle even a single video stream. Please read [the section below for more details](/docs/general/administration/hardware-selection#software-hdr-to-sdr-tone-mapping)
:::
### Low Power Servers
:::tip Upgrading an Existing System
For users with expensive power or running servers on battery power:
Intel ARC GPUs are recommended when upgrading an existing system to be used as a Jellyfin server. In cases where Intel ARC is not feasible, Nvidia graphics is recommended. Please select an appropriate GPU according to the recommended specs above.
- Intel 12th gen or above N series platforms
- Apple M Series mac mini
- Rockchip RK3588 / RK3588S SBC (**Advanced Users Only**)
:::
### Potentially Problematic Hardware
:::tip Fully Utilizing Intel-based Macs
These hardware platforms might lead to a poor Jellyfin experience. Please be careful to avoid them when shopping for hardware.
It is recommended that Intel-based macs be used with Windows or Linux installed to host Jellyfin. Many hardware acceleration features aren't available on MacOS due to the custom [jellyfin-ffmpeg](https://github.com/jellyfin/jellyfin-ffmpeg) fork not being available.
:::
### Low Power Applications
For low power applications, Intel 12th gen or newer Atom CPUs with integrated graphics are recommended. It is also recommended that [Low Power Encoding](/docs/general/administration/hardware-acceleration/intel/#low-power-encoding) be setup.
:::caution SBCs (Single Board Computers)
Most SBCs use low powered chipsets, often with less than ideal driver support from the chipset vendors. They are generally too slow for a good experience and/or have broken hardware acceleration support. Please avoid using SBCs such as Raspberry Pis (Including newer Raspberry Pi 5 Models) to run Jellyfin.
:::
- Intel "Atom" CPUs: Intel J/M/N/Y series low power CPUs up to 11th gen use a different architecture than higher end parts, leading to subpar performance despite what their names might suggest. Please be careful about these parts when shopping for a system to run Jellyfin.
- Prebuilt NAS devices: The software environment on most Prebuilt NAS devices often causes 3rd party software to be hard to install and not work properly. They also often have low end processors that are too slow for a good Jellyfin experience (Intel Atom, Realtek ARM CPUs etc.).
- Most Single Board Computers (SBC): Most SBCs (Including Raspberry Pis and **especially the Pi 5**) are too slow to provide a good Jellyfin experience since they often lack proper support for hardware acceleration. If You really want to run Jellyfin on an SBC, please look at models based on the following platforms: Rockchip RK3588 / RK3588S, Intel Core, Intel 12th gen N series
- AMD Graphics: AMD Graphics have poor encoder quality and poor driver support. **This applies even on Linux**.
- Low end GPUs: Certain low end GPUs (eg. GT1030, RX6400) don't have hardware encoding available. These models can't be used for Jellyfin hardware acceleration.
## Detailed Guide
@@ -68,13 +95,13 @@ The CPU will be responsible for many tasks, notably:
- Transcoding Audio
- Decoding video in unsupported codecs
Audio codecs are very lightweight and most CPUs should be able to handle them without issues. Video in unsupported codecs are usually older formats that are easier to decode. Assuming hardware acceleration is properly configured, any modern CPU with 4 threads should be able to handle the workload.
Audio codecs are very lightweight and most CPUs should be able to handle them without issues (Ryzen 5950X FLAC -> AAC transcoding runs at ~110x real time). Please note that they will only use one core.
:::caution
Video in unsupported codecs are usually older formats that are easier to decode. Assuming hardware acceleration is properly configured, any modern CPU with 4 threads should be able to handle the workload.
Newer codecs can also require software decoding if there are no available hardware decoders. High bitrate HEVC content such as commonly found in 4k HDR can be very demanding even on modern CPUs. Please considering adding a modern GPU with 10bit HEVC decoding support. HDR to SDR tone-mapping is also currently not available without hardware acceleration.
However, newer codecs can also require software decoding if there are no available hardware decoders. HEVC, VP9 and AV1 can be **VERY** demanding even on modern CPUs if hardware acceleration isn't available. This is why a hardware platform capable of HEVC 10bit hardware decoding is strongly recommended.
:::
In our custom `jellyfin-ffmpeg` fork, the dav1d decoder is enabled, leading to faster software decoding compared to HEVC or VP9. However, it will still use significantly more resources compared to software decoding H.264 or older codecs. Since we have a more efficient AV1 software decoder, and AV1 media isn't common yet, you shouldn't worry about AV1 when shopping for hardware.
#### Integrated Graphics
@@ -84,60 +111,60 @@ Integrated graphics can be useful for transcoding video. Please refer to [the GP
[Resizable Bar (ReBAR)](https://www.intel.com/content/www/us/en/support/articles/000090831/graphics.html) is a PCI Express feature that optimizes access to PCIe devices. This feature requires support from both the platform and the device. Intel 10th gen or above and AMD Ryzen 3000 Series or above have support for this feature.
In BIOS settings of motherboards, it may also be called `Smart Access Memory` or `Clever Access Memory`
When using Intel ARC Graphics, Resizable BAR is recommended. Disabling it will result in a 10% reduction in transcoding performance. However, given how fast the media engine on Intel ARC is, this will not be a problem for the vast majority of users.
#### Software HDR to SDR Tone-mapping
If there is no GPU available, the CPU can also be used to tone-map HDR content to SDR. **This can be very demanding on
the CPU, therefore a GPU is ALWAYS recommended.** When using software tone-mapping, a software encoder will always be
used. Tone-mapping 4K 60fps Dolby Vision content to 4K 60fps H264 SDR requires a Ryzen 9 5950X for faster than real time
transcoding. If you would like to output in H265 or AV1, you may end up in situations where no current desktop CPUs have
enough performance.
### System Memory (RAM)
As a general rule of thumb, at least 8GB is recommended, though significantly smaller amounts may work.
As a general rule of thumb, at least 8GB is recommended for most configurations. For a Linux server running without a GUI, 4GB should be enough.
:::tip Integrated Graphics
When using Integrated graphics, the integrated graphics processer usually uses a part of system memory as video memory. It is recommended that a dual channel configuration be used and additional capacity be installed.
:::
It is recommended to add more memory on Windows 11 due to the OS being heavier.
### Graphics Cards (GPUs)
With modern systems, the media engines are usually located on the GPUs. Therefore, the available hardware acceleration options are determined by the choice of GPU.
Encoder Quality: Intel > Nvidia > AMD > Apple
Encoder Quality: Apple ≥ Intel Nvidia >>> AMD<sup>\*</sup>
Intel graphics is recommended over Nvidia graphics because of the quality. AMD or Apple Silicon are not recommended since they produce poor quality H.264 and H.265(HEVC) output.
<sup>\*</sup> This only represents the default Jellyfin settings. The quality may be different depending on your exact configuration.
:::note A Note on AMD AV1 Encoders
Intel is always recommended on non-apple hardware for the following reasons:
With AV1, AMD has significantly improved the quality of their encoders. However, Jellyfin currently (as of 10.8.10) does NOT support transcoding to AV1. Even after Jellyfin adds support for transcoding to AV1, transcoding to H.264 or H.265(HEVC) is still more likely due to AV1 being in the early stages of adoption.
- Intel provides a good quality encoder, slightly better than Nvidia and significantly better than AMD.
- Intel drivers and the compute environment is much easier to setup than both Nvidia and AMD
:::
AMD is not recommended because of poor quality H.264 and H.265(HEVC) output, as well as being hard to setup the compute environment. While AMD has significantly improved AV1 encoder quality, you are still more likely to transcode to H.264 or H.265 than to AV1 due to compatibility.
A list of common codecs can be found [here](/docs/general/clients/codec-support/)
A list of common codecs can be found in the [codec support documentation](/docs/general/clients/codec-support/).
The following is a list of codecs Jellyfin supports transocding to:
The following is a list of video codecs Jellyfin supports transcoding to:
- H.264 (Most common transcode target)
- H.265 (Limited supported by clients)
- H.265 (Limited support by clients)
- AV1 (New in 10.9, supported by most modern browsers)
:::note AV1 Support
Jellyfin currently (as of 10.8.10) does NOT support transcoding to AV1 as a target. However, this might change in the future. Source content in AV1 will transcode to other codecs normally if needed.
:::
For decoding support, the more codecs the better. However, there are only a few codecs that media is commonly available in, as listed above.
For decoding support, the more codecs the better. However, there are only a few codecs that media is commonly available in. The most important one to look for is HEVC 10bit decoding support, as it can be very demanding on the CPU to decode.
#### Intel Graphics
Please refer to [this table](https://en.wikipedia.org/wiki/Intel_Quick_Sync_Video#Hardware_decoding_and_encoding) for supported codecs.
:::caution F series CPUs
Intel CPUs with a model description that ends with F don't have integrated graphics. These are intended to be used with a dedicated graphics card. Please beware if you intend to use Intel integrated graphics.
Intel CPUs with a model description that ends with F don't have integrated graphics. These are intended to be used with a dedicated graphics card.
If you are planning to use Linux with Intel 12/13th Gen integrated graphics or ARC, these GPUs only work on Linux Kernel 6.2 or newer. Please check your distribution to make sure it has a supported Linux Kernel version. Please read [Known Intel limitations on Linux](/docs/general/post-install/transcoding/hardware-acceleration/known-issues#intel-on-linux) for more info.
:::
:::caution
:::note Intel 12th Gen, 13th Gen and ARC Support
If you are planning to use Linux with Intel 12/13th Gen integrated graphics or ARC, these GPUs only work on Linux Kernel 6.2 or newer. Please check your distribution to make sure it has a supported Linux Kernel version. It is also recommended that `jellyfin-ffmpeg6` be installed instead of the default `jellyfin-ffmpeg5` on these hardware platforms.
Intel 10th gen and older integrated graphics are losing support for QSV on Linux due to the SDK for these platforms being deprecated by Intel. If you own 7-10th gen CPUs with integrated graphics, please continue to use them for Jellyfin. If you are making a purchase decision, please choose a newer CPU if you plan on using Intel integrated graphics.
:::
@@ -145,54 +172,65 @@ If you are planning to use Linux with Intel 12/13th Gen integrated graphics or A
Please refer to [this table](https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new) for supported codecs.
:::caution Low End Cards
Certain low end cards (e.g. GT 1030) don't have encoding hardware. Please be careful when choosing a GPU.
:::
#### AMD Graphics
Please refer to [this article](https://en.wikipedia.org/wiki/Video_Coding_Engine) for supported codecs.
:::caution Low End Cards
AMD graphics is not recommended for Jellyfin, but the information is still provided for convenience. Please refer to [this article](https://en.wikipedia.org/wiki/Video_Coding_Engine) for supported codecs.
Certain low end cards (e.g. RX 6400, RX 6500) don't have encoding hardware. Please be careful when choosing a GPU.
:::
:::caution Integrated Graphics
Many AMD CPUs don't have integrated graphics. These are intended to be used with a dedicated graphics card.
For Ryzen 1000 ~ 5000 Series, desktop CPUs with a model description that ends with G have integrated graphics while other desktop CPUs do NOT. For Ryzen 7000 Series, desktop CPUs with a model description that ends with F do NOT have integrated graphics while others do.
Please check the product page of your CPU for more info.
:::
#### Apple Silicon
Supported codecs are listed below:
| Codec | M1, M2 Family | M3 Family |
| ----------- | ------------- | --------- |
| H.264 8bit | ✅ | ✅ |
| H.264 10bit | 🔶 | 🔶 |
| H.265 8bit | ✅ | ✅ |
| H.265 10bit | ✅ | ✅ |
| VP9 8bit | 🔶 | 🔶 |
| VP9 10bit | 🔶 | 🔶 |
| AV1 | ❌ | 🔶 |
| Codec | M1, M2 Family | M3 Family |
| ----------- | ------------- | -------------- |
| H.264 8bit | ✅ | ✅ |
| H.264 10bit | 🔶 | 🔶 |
| H.265 8bit | ✅ | ✅ |
| H.265 10bit | ✅ | ✅ |
| VP9 8bit | 🔶 | 🔶 |
| VP9 10bit | 🔶 | 🔶 |
| AV1 | ❌ | ❌<sup>1</sup> |
✅ = Encode + Decode, 🔶 = Decode Only, ❌ = Not Supported.
<sup>1</sup> Although the hardware does support AV1 decoding, [ffmpeg does not support it yet](https://trac.ffmpeg.org/ticket/10642).
:::caution
Many hardware acceleration features are not available on macOS for Jellyfin, as the custom [jellyfin-ffmpeg](https://github.com/jellyfin/jellyfin-ffmpeg) fork isn't available for macOS. No Apple Silicon media engine drivers exist for other operating systems currently. You will NOT be able to use hardware acceleration if you are running [Asahi Linux](https://asahilinux.org/).
No Apple Silicon media engine drivers currently exist for non-macOS operating systems. You will NOT be able to use hardware acceleration if you are running [Asahi Linux](https://asahilinux.org/).
:::
#### Rockchip VPU
Currently only the VPU on RK3588/3588S SoC is recommended. It can handle most common video codecs, including AV1 decode.
Supported codecs are listed below:
| Codec | RK3588/3588S |
| -------------- | ------------ |
| MPEG1/2/4 8bit | 🔶 |
| VC1 8bit | ❌ |
| H.264 8bit | ✅ |
| H.264 10bit | 🔶 |
| H.265 8bit | ✅ |
| H.265 10bit | 🔶 |
| VP8 8bit | 🔶 |
| VP9 8bit | 🔶 |
| VP9 10bit | 🔶 |
| AV1 | 🔶 |
✅ = Encode + Decode, 🔶 = Decode Only, ❌ = Not Supported.
### Storage
There are two general types of storage that can be used on a Jellyfin server. Media libraries and Jellyfin files require different performance characteristics.
-1
View File
@@ -72,7 +72,6 @@ docker run -d \
### Using docker-compose yaml
```yml
version: '3'
services:
jellyfin:
image: jellyfin/jellyfin
+2 -11
View File
@@ -18,27 +18,18 @@ To solve this, you have the following options:
- Enable the lock service.
- Use NFSv4 which has built-in lock support.
## Docker or VM's
## Docker or VMs
For storage, a moderate size library database can grow anywhere from 10 to 100 GB. The [transcoding](/docs/general/server/transcoding) folder needs roughly the same size as the original media if it's being transcoded at the same bitrate. A single 50GB Blu-Ray Remux by itself can take up to approximately 60GB or as little as 15GB, depending on the quality selected. If the transcoding folder is held on the same storage as the database, this must be taken into consideration.
For storage, a moderate size library database can grow anywhere from 10 to 100 GB. The [transcoding](/docs/general/post-install/transcoding) folder needs roughly the same size as the original media if it's being transcoded at the same bitrate. A single 50GB Blu-Ray Remux by itself can take up to approximately 60GB or as little as 15GB, depending on the quality selected. If the transcoding folder is held on the same storage as the database, this must be taken into consideration.
## Cloud
A popular choice for cloud storage has been the program [rclone](https://rclone.org/downloads/). It is supported on most Operating Systems. To facilitate combining local and cloud filesystems, rclone can be paired with another program such as [mergerfs](https://github.com/trapexit/mergerfs). For cloud storage, it is recommended to disable image extraction as this requires downloading the entire file to perform this task.
:::note
The image extractor can't be [turned off](https://github.com/jellyfin/jellyfin/issues/2355) in Jellyfin at the moment which is causing [performance issues](https://github.com/jellyfin/jellyfin/issues/2600).
:::
- animostiy22's [repo](https://github.com/animosity22/homescripts) about rclone and mergerfs.
### MergerFS
MergerFS isn't meant for everything, [see here](https://github.com/trapexit/mergerfs#what-should-mergerfs-not-be-used-for) for more.
- rclone recommended [config](https://forum.rclone.org/t/my-best-rclone-config-mount-for-plex/7441).
- animostiy22's [repo](https://github.com/animosity22/homescripts) about rclone and mergerfs.
To modify and examine your mergerfs mount, here's a quick [guide](https://zackreed.me/mergerfs-neat-tricks).
+46 -12
View File
@@ -21,26 +21,46 @@ If you created the file with a password, then you will have to enter that value
If you can access the server locally but not outside of your LAN, then you likely have an issue with the router configuration.
Check the port forwarding settings on your router to ensure the server is visible from outside your local network.
You can also enable the "Enable automatic port mapping" option on the **Networking** page of the server settings to have the server attempt to configure port forwarding on the router automatically if your router supports it.
If there are no logs at all relating to web traffic, even over a LAN connection, then the server hasn't been reached at all yet.
This would indicate either an incorrect address or an issue somewhere else on the network.
## Debug Logging
To enable much more verbose debug logging, it is currently required to manually edit a configuration file, since Jellyfin does not yet have an option to enable debug functionality within the frontend UI.
Debug logging can be very useful when troubleshooting issues. To enable debug logging, manually editing a configuration file is required as Jellyfin does not control this from the frontend UI.
To make this change, go to the [Jellyfin configuration directory](/docs/general/administration/configuration#configuration-directory) and find the `logging.json` file if it exists, or create the file if it does not. Debug logging is then enabled by changing the minimum logging level to debug as in the example below. If `logging.json` already exists and contains existing keys, the `"MinimumLevel"` key should be added to the `"Serilog"` object as seen in the example. If `logging.json` does not already exist, or if it is empty, a configuration containing only the following example structure will enable debug logging.
Logging options can be configured in the file `logging.json` in the [Jellyfin configuration directory](/docs/general/administration/configuration#configuration-directory). On some platforms, there is also `logging.default.json` which provides default values which can then be overridden by a custom `logging.json`.
:::caution
Enabling debug logging will create a **very** large amount of output; as an example, simply loading the homepage will generate over 4000 lines of logs with the debug configuration below. Leaving debug logging enabled on a productive Jellyfin instance for a long period of time is not recommended, and it should be enabled only during troubleshooting.
:::
:::note
If you are requested to provide extensive debug logs in an issue or during troubleshooting (e.g. more than just a few lines), please compress the resulting log files if possible as they will be very large otherwise.
:::
To enable debug logging, create the `logging.json` file and add the following contents to it:
```json
{
"Serilog": {
"MinimumLevel": "Debug"
"MinimumLevel": {
"Default": "Debug",
"Override": {
"": "Debug"
}
}
}
}
```
Debug messages appear in the log with the `DBG` tag prefixed to each line.
If a `logging.json` file already exists, edit the `Serilog` `MinimumLevel` section to match the above but do not change any other values in the file.
Debug messages will appear in the log with the `DBG` tag prefixed to each line, though some components will also log additional details at `INF` with this configuration.
:::note
@@ -48,12 +68,18 @@ If the `logging.json` file existed before the last server start, Jellyfin will a
:::
Once the need for verbose logging has passed, debug logging can be disabled by changing the `"MinimumLevel"` key in `logging.json` to `"Information"`, as in the example below, in order to restore the default logging level. It is not necessary to delete the `logging.json` configuration after debugging is complete.
To restore normal logging, you can remove the override `logging.json` (if you created a new file above) or restore the `logging.json` `Serilog` `MinimumLevel` section to its default values of:
```json
{
"Serilog": {
"MinimumLevel": "Information"
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
}
}
}
```
@@ -84,8 +110,8 @@ If you are running ArchLinux, run the following command instead:
echo fs.inotify.max_user_watches=524288 | sudo tee /etc/sysctl.d/40-max-user-watches.conf && sudo sysctl --system
```
Then paste it in your terminal and press on enter to run it. For Docker, this needs to be done on the host, not the container.
See [here](https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers) for more information.
Then paste it in your terminal and press Enter to run it. For Docker, this needs to be done on the host, not the container.
See the [Guard Listen README on increasing inotify watchers](https://github.com/guard/listen/blob/master/README.md#increasing-the-amount-of-inotify-watchers) for more information.
## Uninstalling Jellyfin on MacOS
@@ -143,7 +169,7 @@ Manual changes to the database can destroy your instance beyond repair. to preve
Before continuing, make sure that you have sqlite3 installed.
When sqlite3 is not installed, you can install it under Debian based systems with `apt install sqlite3`.
After that do the following commands/SQL query:
*You can find a list of default Paths [here](../configuration#configuration-directory)*
You can find a list of default paths in the [configuration directory documentation](/docs/general/administration/configuration#configuration-directory).
```bash
sqlite3 /PATH/TO/JELLYFIN/DB/jellyfin.db
@@ -158,14 +184,14 @@ SELECT Permissions.Value,Permissions.Kind,Users.Username FROM Permissions INNER
```
To just check permissions on your admin account, run the following query:
*Please change `AdminUsername` to the username of your admin account*
_Please change `AdminUsername` to the username of your admin account_
```sql
SELECT Value,Kind FROM Permissions WHERE UserId IN (SELECT Id FROM Users WHERE Username = 'AdminUsername');
```
<br />
The first row with an value of 1 or 0 shows if the permission is assigned or not. The second row displays the kind of permission. To get a summary for every permission you can look [here](https://github.com/jellyfin/jellyfin/blob/master/Jellyfin.Data/Enums/PermissionKind.cs)
The first row with an value of 1 or 0 shows if the permission is assigned or not. For a summary of each permission type, see the [PermissionKind enumeration in the Jellyfin source code](https://github.com/jellyfin/jellyfin/blob/master/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/PermissionKind.cs)
### Repair Permissions
@@ -182,3 +208,11 @@ UPDATE Permissions SET Value = 1 WHERE (Kind = 0 OR Kind = 3 OR Kind = 4 OR Kind
## Text Not Rendering Properly
Text may show up as boxes ☐☐☐☐☐☐ if fonts for the characters are not available. Installing fonts for the affected languages can solve the problem. For library cover images, please install system fonts on the server system. For subtitles, the source of fonts depends on the client. Please refer to [Fonts](/docs/general/administration/configuration#fonts) on where to install them.
## Not Showing Active Devices
If your active devices section in the dashboard is not showing progress of the content being played by any devices, this may be because your system clock is out of sync. To resolve this on systemd based Linux systems, you can run the following command to enable syncing with an online NTP server (which in turn will start and enable either the `chronyd` or `ntpd` service). Make sure to restart Jellyfin afterwards.
```bash
timedatectl set-ntp true
```
+46 -26
View File
@@ -13,16 +13,16 @@ The goal is to Direct Play all media. This means the container, video, audio and
[Test your browser's compatibility for any codec profile.](https://cconcolato.github.io/media-mime-support/)
| Sorted by efficency (excluding bit depth) | Chrome | Edge | Firefox | Safari | Android | Android TV | iOS | SwiftFin (iOS) | [Roku](https://developer.roku.com/docs/specs/media/streaming-specifications.md) | Kodi | [Desktop](/docs/general/clients/index.html#jellyfin-desktop) |
| ------------------------------------------------------------------------------------------------------------------ | -------------- | -------------- | ------- | -------------- | -------------- | -------------- | -------------- | -------------- | ------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------ |
| [MPEG-4 Part 2/SP](https://en.wikipedia.org/wiki/DivX) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
| [MPEG-4 Part 2/ASP](<https://en.wikipedia.org/wiki/MPEG-4_Part_2#Advanced_Simple_Profile_(ASP)>) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | | ✅ | ✅ |
| [H.264 8Bit](https://caniuse.com/#feat=mpeg4 'H264 Browser Support Reference') | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [H.264 10Bit](https://caniuse.com/#feat=mpeg4 'H264 Browser Support Reference') | ✅ | ✅ | ❌ | | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | ✅ |
| [H.265 8Bit](https://caniuse.com/#feat=hevc 'HEVC Browser Support Reference') | 🔶<sup>8</sup> | ✅<sup>7</sup> | ❌ | 🔶<sup>1</sup> | 🔶<sup>2</sup> | ✅<sup>5</sup> | 🔶<sup>1</sup> | ✅<sup>6</sup> | 🔶<sup>9</sup> | ✅ | ✅ |
| [H.265 10Bit](https://caniuse.com/#feat=hevc 'HEVC Browser Support Reference') | 🔶<sup>8</sup> | ✅<sup>7</sup> | ❌ | 🔶<sup>1</sup> | 🔶<sup>2</sup> | 🔶<sup>5</sup> | 🔶<sup>1</sup> | ✅<sup>6</sup> | 🔶<sup>9</sup> | ✅ | ✅ |
| [VP9](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#VP9 'V9 Browser Support Reference') | ✅ | ✅ | ✅ | | ✅<sup>3</sup> | 🔶<sup>3</sup> | ❌ | | ✅ | ✅ | ✅ |
| [AV1](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#AV1 'AV1 Browser Support Reference') | ✅ | ✅ | ✅ | | ✅ | 🔶<sup>4</sup> | ❌ | | ✅ | ✅ | ✅ |
| Sorted by efficiency (excluding bit depth) | Chrome | Edge | Firefox | Safari | Android | Android TV | iOS | SwiftFin (iOS) | [Roku](https://developer.roku.com/docs/specs/media/streaming-specifications.md) | Kodi | Jellyfin Media Player |
| ------------------------------------------------------------------------------------------------------------------ | -------------- | -------------- | ------- | --------------- | -------------- | -------------- | -------------- | --------------- | ------------------------------------------------------------------------------- | ---- | --------------------- |
| [MPEG-4 Part 2/SP](https://en.wikipedia.org/wiki/DivX) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
| [MPEG-4 Part 2/ASP](<https://en.wikipedia.org/wiki/MPEG-4_Part_2#Advanced_Simple_Profile_(ASP)>) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | | ✅ | ✅ |
| [H.264 8Bit](https://caniuse.com/#feat=mpeg4 'H264 Browser Support Reference') | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [H.264 10Bit](https://caniuse.com/#feat=mpeg4 'H264 Browser Support Reference') | ✅ | ✅ | ❌ | 🔶<sup>12</sup> | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | ✅ |
| [H.265 8Bit](https://caniuse.com/#feat=hevc 'HEVC Browser Support Reference') | 🔶<sup>8</sup> | ✅<sup>7</sup> | ❌ | 🔶<sup>1</sup> | 🔶<sup>2</sup> | ✅<sup>5</sup> | 🔶<sup>1</sup> | ✅<sup>6</sup> | 🔶<sup>9</sup> | ✅ | ✅ |
| [H.265 10Bit](https://caniuse.com/#feat=hevc 'HEVC Browser Support Reference') | 🔶<sup>8</sup> | ✅<sup>7</sup> | ❌ | 🔶<sup>1</sup> | 🔶<sup>2</sup> | 🔶<sup>5</sup> | 🔶<sup>1</sup> | ✅<sup>6</sup> | 🔶<sup>9</sup> | ✅ | ✅ |
| [VP9](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#VP9 'V9 Browser Support Reference') | ✅ | ✅ | ✅ | ✅<sup>10</sup> | ✅<sup>3</sup> | 🔶<sup>3</sup> | ❌ | ✅<sup>13</sup> | ✅ | ✅ | ✅ |
| [AV1](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#AV1 'AV1 Browser Support Reference') | ✅ | ✅ | ✅ | 🔶<sup>11</sup> | ✅ | 🔶<sup>4</sup> | ❌ | 🔶<sup>14</sup> | ✅ | ✅ | ✅ |
<sup>1</sup>HEVC is only supported in MP4, M4V, and MOV containers.
<br />
@@ -30,7 +30,7 @@ The goal is to Direct Play all media. This means the container, video, audio and
<br />
<sup>3</sup>May be (partially) dependent on Hardware support (can be compensated with CPU decoding on Android). Most new Android phones in the higher price range and many "4K" Android TV devices have VP9 hardware decoding support. Refer to you manufacturer for supported codecs.
<br />
<sup>4</sup>Needs atleast Android TV 10.
<sup>4</sup>Needs at least Android TV 10.
<br />
<sup>5</sup>As of <a href="https://github.com/jellyfin/jellyfin-androidtv/pull/671">version 0.12</a>, HEVC is enabled on all devices running Android 5.0+, but early generations of the Amazon Fire may not work yet. 10Bit may be supported depending on your device. Before Client 0.12, HEVC support was enabled on specific devices.
<br />
@@ -38,9 +38,20 @@ The goal is to Direct Play all media. This means the container, video, audio and
<br />
<sup>7</sup>HEVC decoding is only supported on Windows 10 with the HEVC Video Extension from the Microsoft <a href="https://www.microsoft.com/store/productId/9NMZLZ57R3T7">store</a>.
<br />
<sup>8</sup>Chromium 104 does support HEVC decoding when launched with <code>--enable-features=PlatformHEVCDecoderSupport</code> argument. For more informations please look at <a href="https://github.com/StaZhu/enable-chromium-hevc-hardware-decoding#readme">enable-chromium-hevc-hardware-decoding</a>.
<sup>8</sup>Chromium 107 does support HEVC decoding when HEVC hardware decoding is available.
<br />
<sup>9</sup>HEVC decoding is only supported on 4K devices.
<br />
<sup>10</sup>VP9 decoding on Safari requires at least Safari 14.
<br />
<sup>11</sup>AV1 decoding is only available on devices with A17 or M3 series chips or newer and requires at least Safari 17.
<br />
<sup>12</sup>Need to be manually enabled in Settings > Playback > Enable H.264 High 10 Profile. Playback on Apple Silicon Macs with macOS version < 14 and Intel Macs with all macOS versions may result in blank frames if this is enabled.
<br />
<sup>13</sup>VP9 is only availble with Swiftfin (VLCKit) player.
<br />
<sup>14</sup>AV1 is enabled by default for Swiftfin (VLCKit). AV1 is disabled by default but can be enabled for Native (AVKit) using Custom Device Profiles. Enabling AV1 may result in a poor experience for SOCs prior to A17.
<br />
[Format Cheatsheet:](https://en.wikipedia.org/wiki/MPEG-4#MPEG-4_Parts)
@@ -58,16 +69,17 @@ The goal is to Direct Play all media. This means the container, video, audio and
If the audio codec is unsupported or incompatible (such as playing a 5.1 channel stream on a stereo device), the audio codec must be transcoded. This is not nearly as intensive as video transcoding.
| | Chrome | Edge | Firefox | Safari | Android | Android TV | iOS | SwiftFin (iOS) | Roku | Kodi | Desktop |
| :-------------------------------------------------------------------------: | :------------: | :--: | :-----: | :------------: | :-----: | :--------: | :------------: | :------------: | :------------: | :--: | :-----: |
| FLAC | ✅ | ✅ | ✅ | | ✅ | ✅ | | ✅ | ✅ | ✅ | ✅ |
| MP3 | 🔶<sup>1</sup> | ✅ | 🔶 | | ✅ | ✅ | | ✅ | ✅ | ✅ | ✅ |
| AAC | ✅ | ✅ | ✅ | | ✅ | ✅ | | ✅ | ✅ | ✅ | ✅ |
| [AC3](https://www.loc.gov/preservation/digital/formats/fdd/fdd000209.shtml) | ✅ | ✅ | ❌ | | ✅ | ✅ | | ✅ | | ✅ | ✅ |
| [EAC3](https://en.wikipedia.org/wiki/Dolby_Digital_Plus)<sup>2</sup> | ✅ | ✅ | ✅ | | ✅ | ✅ | | ✅ | | ✅ | ✅ |
| VORBIS<sup>3</sup> | ✅ | ✅ | ✅ | | ✅ | ❌ | | ✅ | ✅ | ✅ | ✅ |
| DTS<sup>4</sup> | ❌ | ❌ | ❌ | | ✅ | ✅ | | ✅ | ✅<sup>6</sup> | ✅ | ✅ |
| OPUS | ✅ | ✅ | ✅ | 🔶<sup>5</sup> | ✅ | ✅ | 🔶<sup>5</sup> | ✅ | ✅ | ✅ | ✅ |
| Codec | Chrome | Edge | Firefox | Safari | Android | Android TV | iOS | SwiftFin (iOS) | Roku | Kodi | Desktop |
| :-------------------------------------------------------------------------: | :------------: | :--: | :-----: | :------------------: | :-----: | :--------: | :------------------: | :------------: | :------------: | :--: | :-----: |
| FLAC | ✅ | ✅ | ✅ | | ✅ | ✅ | | ✅ | ✅ | ✅ | ✅ |
| MP3 | 🔶<sup>1</sup> | ✅ | 🔶 | | ✅ | ✅ | | ✅ | ✅ | ✅ | ✅ |
| AAC | ✅ | ✅ | ✅ | | ✅ | ✅ | | ✅ | ✅ | ✅ | ✅ |
| [AC3](https://www.loc.gov/preservation/digital/formats/fdd/fdd000209.shtml) | ✅ | ✅ | ❌ | | ✅ | ✅ | | ✅ | | ✅ | ✅ |
| [EAC3](https://en.wikipedia.org/wiki/Dolby_Digital_Plus)<sup>2</sup> | ✅ | ✅ | ✅ | | ✅ | ✅ | | ✅ | | ✅ | ✅ |
| VORBIS<sup>3</sup> | ✅ | ✅ | ✅ | ✅<sup>8</sup> | ✅ | ❌ | ✅<sup>8</sup> | ✅ | ✅ | ✅ | ✅ |
| DTS<sup>4</sup> | ❌ | ❌ | ❌ | | ✅ | ✅ | | ✅ | ✅<sup>6</sup> | ✅ | ✅ |
| OPUS | ✅ | ✅ | ✅ | <sup>5, 7, 8</sup> | ✅ | ✅ | <sup>5, 7, 8</sup> | ✅ | ✅ | ✅ | ✅ |
| ALAC | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ | | | | ✅ |
[Format Cheatsheet:](https://en.wikipedia.org/wiki/Moving_Picture_Experts_Group#External_links)
@@ -87,6 +99,10 @@ If the audio codec is unsupported or incompatible (such as playing a 5.1 channel
<sup>5</sup>Safari only supports opus in <code>.caf</code> files
<br />
<sup>6</sup>Supported via passthrough on all devices. Native support for AC3 & E-AC3 on Roku TVs & Ultra.
<br />
<sup>7</sup>iOS 17 / macOS 14 and above supports stereo Opus in MP4 containers.
<br />
<sup>8</sup>iOS 18.4 / macOS 15.4 and above supports Vorbis and Opus in OGG containers.
ATSC Standard for [AC-3 and EAC-3](https://www.atsc.org/wp-content/uploads/2015/03/A52-201212-17.pdf).
@@ -96,7 +112,7 @@ Subtitles can be a subtle issue for transcoding. Containers have a limited numbe
Here is a [breakdown](https://www.afterdawn.com/guides/archive/subtitle_formats_explained.cfm) of common subtitle formats.
| | Format | TS | MP4 | MKV | AVI |
| Subtitle Format | Format | TS | MP4 | MKV | AVI |
| :--------------------------------------------------------------: | :------------: | :-: | :-: | :-: | :-: |
| [SubRip Text (SRT)](https://en.wikipedia.org/wiki/SubRip) | Text | ❌ | 🔶 | ✅ | 🔶 |
| [WebVTT (VTT)](https://en.wikipedia.org/wiki/WebVTT)<sup>1</sup> | Text | ❌ | ❌ | ✅ | 🔶 |
@@ -158,13 +174,13 @@ Text-based subtitle formats require fonts to render properly. Please refer to [F
If the container is unsupported, this will result in remuxing. The video and audio codec will remain intact but wrapped in a supported container. This is the least intensive process. Most video containers will be remuxed to use the HLS streaming protocol and TS containers. Remuxing shouldn't be a concern even for an RPi3.
| | Chrome | Edge | Firefox | Safari | Android | Android TV | Kodi | Roku |
| Container | Chrome | Edge | Firefox | Safari | Android | Android TV | Kodi | Roku |
| :-------------------------------------------------------------------: | :----: | :--: | :-----: | :----: | :-----: | :--------: | :--: | :--: |
| [MP4](https://en.wikipedia.org/wiki/MPEG-4_Part_14)<sup>1</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [MKV](https://en.wikipedia.org/wiki/Matroska)<sup>2, 3</sup> | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
| [WebM](https://en.wikipedia.org/wiki/WebM)<sup>3, 5</sup> | ✅ | ✅ | ✅ | | ✅ | ✅ | ✅ | ✅ |
| [WebM](https://en.wikipedia.org/wiki/WebM)<sup>3, 5, 6</sup> | ✅ | ✅ | ✅ | | ✅ | ✅ | ✅ | ✅ |
| [TS](https://en.wikipedia.org/wiki/MPEG_transport_stream)<sup>4</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [OGG](https://en.wikipedia.org/wiki/Ogg)<sup>5</sup> | ✅ | ✅ | ✅ | | ✅ | ✅ | ✅ | ✅ |
| [OGG](https://en.wikipedia.org/wiki/Ogg)<sup>5, 7</sup> | ✅ | ✅ | ✅ | | ✅ | ✅ | ✅ | ✅ |
<sup>1</sup>MP4 containers are one of the few containers that will not remux.
<br />
@@ -175,3 +191,7 @@ If the container is unsupported, this will result in remuxing. The video and aud
<sup>4</sup>TS is one of the primary containers for streaming for Jellyfin.
<br />
<sup>5</sup>WebM and OGG have limited codec support (by design), refer to <a href="https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers#WebM">this</a> for WebM and <a href="https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers#Ogg">this</a> for OGG.
<br />
<sup>6</sup>WebM on Safari requires at least Safari 14.
<br />
<sup>7</sup>OGG on Safari requires at least iOS 18.4 / macOS 15.4
+11 -6
View File
@@ -28,7 +28,7 @@ Some examples of hex color codes:
- Red: `#d00000`
- Transparent Black: `#00000058`
Go [here](https://htmlcolorcodes.com/color-picker) for a hex color chart to get a code for any given color.
Use the [HTML Color Picker](https://htmlcolorcodes.com/color-picker) to find the hex code for any given color.
If you are looking for a more standard and less specific color, typing the literal name of colors suits that purpose well. For example, to get the color "yellow" you can simply write "yellow", this will use a preset yellow color.
@@ -37,7 +37,7 @@ If you are looking for a more standard and less specific color, typing the liter
`aquamarine` Aquamarine <br />
`lightseagreen` Light Sea Green
Go [here](https://www.w3schools.com/colors/colors_names.asp) for a list of color names supported.
You can find a list of supported color names on the [W3Schools Color Names reference](https://www.w3schools.com/colors/colors_names.asp).
### Comments
@@ -87,7 +87,9 @@ This will affect the played/watched indicator. Replace the hex color with any va
```css
/* Make watched icon dark and transparent */
.indicator { background: #00000058 !important; }
.indicator {
background: #00000058 !important;
}
```
![Screenshot of watched indicators with a custom transparent color applied](/images/docs/custom-css-transparentwatched.png)
@@ -96,7 +98,9 @@ This will affect the played/watched indicator. Replace the hex color with any va
```css
/* Make count indicator icon dark and transparent */
.countIndicator {background: #00000058;}
.countIndicator {
background: #00000058;
}
```
### Display external links in mobile layout
@@ -386,11 +390,11 @@ The episode previews in season view are sized based on horizontal resolution. Th
This will drastically change the style of cast info into something very similar to how Plex approaches it. This override will lead to somewhat smaller thumbnails, and also works with all themes.
```css
/* Shrink and square (or round) cast thumnails */
/* Shrink and square (or round) cast thumbnails */
#castContent .card.overflowPortraitCard.personCard.card-hoverable.card-withuserdata {width: 4.2cm !important; font-size: 90% !important;}
#castContent .card.overflowPortraitCard.personCard.card-withuserdata {width: 4.2cm !important; font-size: 90% !important;}
/* Correct image aspect ratio behaviour, set border-radius to zero for square tiles */
/* Correct image aspect ratio behavior, set border-radius to zero for square tiles */
#castContent .cardContent-button.cardImageContainer.coveredImage.cardContent.cardContent-shadow.itemAction.lazy {background-size: cover; !important; border-radius: 2.5cm;}
#castContent .cardContent-button.cardImageContainer.coveredImage.defaultCardBackground.defaultCardBackground1.cardContent.cardContent-shadow.itemAction {background-size: cover; !important; border-radius: 2.5cm;}
#castContent .cardContent-button.cardImageContainer.coveredImage.defaultCardBackground.defaultCardBackground2.cardContent.cardContent-shadow.itemAction {background-size: cover; !important; border-radius: 2.5cm;}
@@ -796,3 +800,4 @@ Keep in mind that these posts may have been made under previous versions of Jell
- [Jellyfin Netflix Dark - The Best Netflix Dark Theme for Jellyfin Around!](https://github.com/DevilsDesigns/Jellyfin-Netflix-Dark)
- [Dark and Green - A Emby like night mode skin](https://github.com/mbcooper83/jellyfin-css-darkandgreen)
- [Hint of Green](https://github.com/looi-wh/HintOfGreenCSS)
- [Scyfin - A modern Jellyfin theme](https://github.com/loof2736/scyfin)
+15 -18
View File
@@ -30,6 +30,21 @@ Please verify it meets the requirements below and [submit a pull request](https:
:::
### Requirements for Inclusion in All Clients
Clients must meet the following guidelines for inclusion in the list of all clients:
- Must be aligned with the [Jellyfin Community Standards](/docs/general/community-standards).
- In particular, the client must **NOT** engage in, encourage, or facilitate piracy.
- The developer must be in good community standing in accordance to the Community Standards.
- Must adhere to the [Jellyfin Branding Guidelines](/docs/general/contributing/branding), including usage of the Jellyfin name, trademarks and icons.
- This includes usage of the Jellyfin name or `org.jellyfin` namespace that could hinder the ability to publish an official client to a store in the future.
- Must include first rate support for Jellyfin servers. (i.e. Support for Jellyfin should be a primary function or at the same level of integration of any other supported services.)
- Must **NOT** be specific to or intended to promote a specific hosted Jellyfin server instance.
- Must have clear licensing and be void of any known issues related to attribution, copyright, or license violations.
The final decision for inclusion is at the discretion of the Jellyfin Contributor Team following the decision-making guidelines in the [Jellyfin Constitution](https://github.com/jellyfin/jellyfin-meta/blob/master/policies-and-procedures/jellyfin-constitution.md).
### Requirements for Inclusion as a Recommended Client
- The client must be a first-party client (meaning published and maintained by the Jellyfin team with source freely licensed and available in the [Jellyfin GitHub organization](https://github.com/jellyfin)).
@@ -38,24 +53,6 @@ Please verify it meets the requirements below and [submit a pull request](https:
- The client must fill a significant void in the current first-party client offerings. Must be a high-quality client on a popular platform.
### Requirements for Inclusion in All Clients
- Any client meeting the following requirements:
- Must be aligned with the [Jellyfin Community Standards](/docs/general/community-standards).
- In particular the client must **NOT** engage in, encourage, or facilitate piracy.
- The developer must be in good community standing in accordance to the Community Standards.
- Must adhere to the [Jellyfin Branding Guidelines](/docs/general/contributing/branding) including usage of the Jellyfin name.
- This includes usage of the Jellyfin name or `org.jellyfin` namespace that could hinder the ability to publish an official client to a store in the future.
- Must include first rate support for Jellyfin servers. (i.e. Support for Jellyfin should be a primary function or at the same level of integration of any other supported services.)
- Must **NOT** be specific to or intended to promote a specific hosted Jellyfin server instance.
- Must have clear licensing and be void of any known issues related to attribution, copyright, or license violations.
:::info
The final decision for inclusion is at the discretion of the Jellyfin Contributor Team following the decision-making guidelines in the [Jellyfin Constitution](https://github.com/jellyfin/jellyfin-meta/blob/master/policies-and-procedures/jellyfin-constitution.md).
:::
## Supported Browsers
Our goal is to provide support for the two most recent versions of these browsers.
+185
View File
@@ -0,0 +1,185 @@
---
uid: jellyfin-vue
title: Jellyfin Vue
---
import Link from '@docusaurus/Link';
# Jellyfin Vue
[Jellyfin Vue](https://github.com/jellyfin/jellyfin-vue) is an experimental, alternative browser-based web client for Jellyfin written using Vue.js.
:::note
Jellyfin Vue is not planned or targeted to replace the main Jellyfin Web client, and is not feature-complete.
:::
Below are concise instructions to get your own instance of Jellyfin Vue up and running.
If you identify with at least one of the following options:
- Want to try it quickly for the first time
- Are not sure whether you want to deploy your own instance
- Don't need to go beyond user customization to change app-wide behaviour.
- Have a working HTTPS setup.
You're probably better using [our hosted instance](https://jf-vue.pages.dev).
More info at [Jellyfin Vue's repository](https://github.com/jellyfin/jellyfin-vue).
## Deployment
:::caution
Since Jellyfin Vue is just an interface for a Jellyfin server, all of these instructions assume that you already have a server up and running.
[Set it up now](../installation/index.mdx) if you haven't already.
:::
## RECOMMENDED: Using Docker
- In case you don't have Docker, follow [the official installation guide](https://docs.docker.com/engine/install) first.
Learning about [Compose](https://docs.docker.com/compose) is also recommended.
- Docker Compose is now shipped with Docker, so you don't need to install it. It's recommended that you uninstall
the old `docker-compose`.
- [`version` key is deprecated](https://docs.docker.com/reference/compose-file/version-and-name/#version-top-level-element-obsolete)
in Docker Compose, hence not included below.
We're going to use the following `docker-compose.yml` as a starting point:
```yaml
services:
jellyfin_vue:
container_name: jellyfin_vue
image: ghcr.io/jellyfin/jellyfin-vue:unstable
restart: always
ports:
- 8080:80
labels:
- 'com.centurylinklabs.watchtower.enable=true'
watchtower:
container_name: watchtower
image: ghcr.io/containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
TZ: Europe/Madrid
WATCHTOWER_CLEANUP: 1
WATCHTOWER_INCLUDE_RESTARTING: 1
WATCHTOWER_POLL_INTERVAL: 60
WATCHTOWER_LABEL_ENABLE: 1
# Needed so watchtower doesn't restart-loop when updating itself
restart: on-failure
```
<Link id="why-updates-needed"/>
:::success
Getting things up and running is as easy as doing `docker compose up -d` with your terminal
located where the `docker-compose.yml` file is.
:::
With this compose file:
- Jellyfin Vue will be accessible on `8080` port of the machine that's running the containers
- Watchtower takes care of updating the container to the latest commit available on the [repository](https://github.com/jellyfin/jellyfin-vue).
This is a good idea because:
- As of now, stable releases don't exist and there have only been prereleases that don't necessarily meet a quality criteria, but
[major development milestones](https://jellyfin.org/posts/vue-vue3/).
- Only the latest `unstable` image is supported.
After accessing the instance in your browser of choice, you'll be prompted to add a server. You can use your own server or our demo
instance, located at `https://demo.jellyfin.org/stable`
:::note
The server address you need to type is relative to the device you're accessing Jellyfin Vue. For instance,
if your Jellyfin Server is located at 192.168.0.10 and you have deployed Jellyfin Vue to that same server,
and your client is 192.168.0.20, the address you need to input is `http://192.168.0.10`, not
`http://127.0.0.1` or `http://localhost`.
You can learn more about how the connection to your server works
[in Jellyfin's Vue repository privacy disclaimer](https://github.com/jellyfin/jellyfin-vue#privacy-disclaimer-)
:::
### Using environment variables
This is an example of how environment variables are set in the container by adding the
following keys to the `jellyfin_vue` definition in [the above `docker-compose.yml`](#recommended-using-docker):
```yaml
environment:
HISTORY_ROUTER_MODE: 1
```
See the [complete reference of environment variables available](https://github.com/jellyfin/jellyfin-vue/wiki/Configuration)
to further customize Jellyfin Vue to your liking at Jellyfin Vue's wiki.
### Using your own webserver
Since Jellyfin Vue is an SPA web application, you can use any web server to serve it:
Apache, nginx (the one used in Jellyfin's Vue docker image), Traefik, etc...
If you already have a [reverse proxy](/docs/general/post-install/networking/index.md) set up, do you want to do more complex stuff
that it's out of the scope of this documentation like serving at a subpath, in another subdomain, etc...,
you might want to have Jellyfin Vue served by your own webserver instead of the nginx instance shipped with
the Docker image.
To achieve that, in the `jellyfin_vue` service definition of the [`docker-compose.yml` shown above](#recommended-using-docker):
- Remove the `ports` key.
- Add the following keys, **replacing** `_path_` **with the folder** where your web server expects Jellyfin Vue's assets:
```yaml
network_mode: none
volumes:
- _𝘱𝘢𝘵𝘩_:/dest
# This makes the container do nothing and sleep forever,
# frontend will be copied to _𝘱𝘢𝘵𝘩_ and will be served by your web server
command: /bin/sh -c 'rm -rf /dest/* && cp -r . /dest && sleep infinity'
```
This approach:
- Keeps the client always updated in a hassle-free way, as explained [above](#recommended-using-docker).
- In case you use [environment variables](#using-environment-variables),
they will still be applied.
## Manually
:::caution
Make sure you understand [the implications](#why-updates-needed) before using these methods first.
None of them are supported by Jellyfin Vue.
:::
### `docker run`
In case you don't want to use Docker Compose or automated updates, but still use Docker, this command is enough:
```bash
docker run -d -p 8080:80 ghcr.io/jellyfin/jellyfin-vue:unstable
```
### From source / build output
:::info
This might not be necessary if you just want to test a Pull Request.
Check [these instructions instead](../testing/web/index.md)
:::
:::danger
By default, never trust any assets given by anyone outside the official channels if you can't inspect the source code first.
They might compromise your system or track your activity!
:::
Since Jellyfin Vue is a web application, using it it's a matter of setting up your own web server
and pointing it to Jellyfin Vue's assets. You can get them:
- By building your own version from our source. The repository's [wiki](https://github.com/jellyfin/jellyfin-vue/wiki)
has instructions for setting up the development environment.
- By getting them from [GitHub's Actions artifacts](https://github.com/jellyfin/jellyfin-vue/actions).
- Although those artifacts are built in our repository's CI/CD,
**some runs are sourced from Pull Requests created by external contributors that might not be good actors!**
- All artifacts generated by GitHub Actions are [built with provenances](https://github.com/jellyfin/jellyfin-vue/attestations).
- Our official Docker image is built from GitHub Actions and all the process is transparent and can be audited.
## Other documentation
- The rest of the documentation about Jellyfin Vue can be found on it's [wiki](https://github.com/jellyfin/jellyfin-vue/wiki).
- You can check [GitHub Packages (GHCR)](https://github.com/jellyfin/jellyfin-vue/pkgs/container/jellyfin-vue) (recommended)
or [DockerHub](https://hub.docker.com/r/jellyfin/jellyfin-vue) for all the tagged Docker images.
+15 -2
View File
@@ -20,7 +20,7 @@ The installation method for the repository varies depending on what kind of devi
#### General Use Devices (PCs and Tablets)
1. Download the repository installer found [here](https://kodi.jellyfin.org/repository.jellyfin.kodi.zip).
1. Download the repository installer from the [Jellyfin Kodi repository ZIP file](https://kodi.jellyfin.org/repository.jellyfin.kodi.zip).
- It will be saved as `repository.jellyfin.kodi.zip`
2. Install the Jellyfin repository.
- Open Kodi, go to the settings menu, and navigate to "Add-on Browser"
@@ -91,10 +91,23 @@ To use Add-on mode, simply choose "Add-on" at the dialog and proceed to [Library
#### Native Mode
:::caution
Do not use Native mode! Use Addon-mode instead.
Jellyfin 10.10 no longer provides the shared network folder via the API, and as such native mode does not get the required information to function.
:::
Native mode accesses your media files directly from the filesystem, bypassing the Jellyfin server during playback. Native mode needs more setup and configuration, but it can, on rare occasions, lead to better performance where network bandwidth is a limitation. It requires your media to be available to the device Kodi is running on over either NFS or Samba, and therefore should only be used on a LAN or over a VPN connection.
To use Native mode, first set up your libraries in Jellyfin with a remote path.
:::caution
Starting from Jellyfin 10.9 it is no longer possible to set the shared network folder.
:::
1. In the Jellyfin server, navigate to the Libraries section of the admin dashboard.
- Select an existing library (or create a new one)
- Select the media folder
@@ -166,7 +179,7 @@ JellyCon behaves more like a standard Kodi streaming add-on. Media is accessed p
### Configuring Home
Many Kodi skins allow for customizing of the home menu with custom nodes and widgets. However, all of these use slightly different layouts and terminology. Rather than a step-by-step guide, this section serves as an barebones introduction to customizing a skin.
Many Kodi skins allow for customizing of the home menu with custom nodes and widgets. However, all of these use slightly different layouts and terminology. Rather than a step-by-step guide, this section serves as a barebones introduction to customizing a skin.
#### Examples
+1 -1
View File
@@ -9,7 +9,7 @@ title: Jellyfin Web Configuration
The Jellyfin Web default interface can be configured using the `config.json` file in the webroot. Where this is and how to edit it depends on the installation method.
We recommend obtaining the [stable](https://github.com/jellyfin/jellyfin-web/blob/release-10.8.z/src/config.json) or the [unstable](https://github.com/jellyfin/jellyfin-web/blob/master/src/config.json) default version of the file to pre-populate your configuration directory before starting Jellyfin for the first time; unlike most other components of this directory, it will not be created automatically.
We recommend obtaining the [stable](https://github.com/jellyfin/jellyfin-web/blob/release-10.10.z/src/config.json) or the [unstable](https://github.com/jellyfin/jellyfin-web/blob/master/src/config.json) default version of the file to pre-populate your configuration directory before starting Jellyfin for the first time; unlike most other components of this directory, it will not be created automatically.
### Debian/Ubuntu/Fedora/CentOS Packages
@@ -0,0 +1 @@
label: Community Standards
+67
View File
@@ -0,0 +1,67 @@
---
uid: community-standards-chat-rules
title: Chat Room Rules
---
# Jellyfin Chat Room Rules
Version 2.0
## Basics
1. You **shall** abide by our [Community Standards](/docs/general/community-standards) at all times.
2. You **shall not** do any of the following things:
- Antagonize, flame, insult, demean, abuse, or harass other users or those outside of the community.
- Dox or otherwise share others' private information, even if it is available publicly.
- Post offensive, sexual, or otherwise inappropriate content - keep it "Safe For Work" in all channels.
- Discuss media acquisition or related tools, regardless of its legality. Where your media comes from or how to get it is none of our or our community's business.
- Spam the chat rooms in any way, including but not limited to Telegram short links and Self advertisement.
- Post verbatim replies from "AI" Chat systems (e.g. ChatGPT) as answers.
- Engage in the discussion of media acquisition or related tools, regardless of its legality. Please note that this is different from what is allowed on the [forum](https://forum.jellyfin.org).
3. Your username and profile fields **shall** be appropriate with respect to our above standards and **shall not** contain swearing, slurs, piracy, or attempts to impersonate others.
4. You **shall** ensure you are posting in the correct channel before making a post. Do **NOT** post the same question in multiple channels.
5. Please write in English if at all possible, as English is the working language of the Jellyfin project. If you cannot, please write in your native language (with or without attempted English) and ask for a translation if required.
6. If you are using Jellyfin for commercial purposes or within a business setting, please review our [Commercial Support Policy](/docs/general/community-standards/commercial-support).
7. Considering that the chat rooms are more likely to see users less experienced with tech, there are additional rules about technical misinformation. Please see the [Technical Misinformation Rules](#technical-misinformation-rules) below.
8. There are cases where the rules don't cover. Please act in good faith under all circumstances. Moderation will be done **at the team's discretion** when not covered by the rules.
## Chat Rooms Specifics
1. This chat lives primarily on Matrix, and is bridged to Discord and IRC. Because of this, you will see the following:
- On Discord, you will see many people, including most of our team members, with "APP" next to their names. Most of these are humans, not bots. Our actual bots are called `Jeff (Bot)` and `jeffbridges`.
- On Matrix, you will see many accounts with the IDs `@jfdiscord_<some numbers>:im.jellyfin.org`. These are bridged users from Discord.
- On Discord and Matrix, you will see messages sent from `jeffbridges`. These are users from IRC.
- On IRC, you will see messages sent from `jeffbridges`. These are users from other platforms.
2. In rare cases, your first message from Discord to the chat may be dropped by the Matrix bridge. Please send a general "Hello" message in #offtopic before posting your questions to #troubleshooting, or else we may miss it.
3. Do NOT directly message team members or fellow users or send them friend requests unless you have been asked to do so. Please ask all questions in the wider community channels instead. If you wish to contact the team privately, please refer to the [Contact and Punishments](#contact-and-punishments) section
## Technical Misinformation Rules
Since the chat rooms are much more likely to see users less experienced with tech, there are additional rules about technical misinformation specific to the chat rooms.
1. Definition of Technical Misinformation: Information about technology that can be objectively proven wrong.
2. You will generally **NOT** face punishment for simply saying something wrong occasionally. This rule is reserved for users who repeatedly demonstrate their unwillingness / inability to do basic research and / or take corrections from the community.
3. You may **NOT** spread information that may violate the ToS (Terms of Service) of other services (eg. Hosting Jellyfin behind Cloudflare). When the ToS is unclear, you should assume that it is against the ToS.
4. Discussion of topics related to technical misinformation should be limited to #offtopic only.
## Contact and Punishments
1. If you see something against the rules, or something that makes you feel unsafe, let our staff know. We want this server to be a welcoming space for all users of Jellyfin.
2. If you wish to contact moderators privately, please send an E-mail to us containing all the relevant info on your matter. Contact info can be found on the [contact page](/contact).
3. Violation of these rules may result in the following punishments: an informal warning, a formal warning or a ban. If a formal warning has been issued, the next violation will result in a ban. See [Community Standards: Dispute Resolution and Moderation](/docs/general/community-standards/#dispute-resolution-and-moderation) for more info.
@@ -0,0 +1,22 @@
---
uid: community-standards-commercial-support
title: Commercial Support Policy
---
# Commercial Support Policy
Jellyfin is an explicitly anti-commercial project; that is to say that we:
- Are volunteer- and best-effort-only.
- Will not commercialize the software ourselves.
- Do not provide payment for development.
- Do not support bug bounties or other such systems of paid support.
- Collect donations purely to cover infrastructure and other incidental costs.
Because of this policy, many within the project have mixed feelings about supporting commercial instances of Jellyfin. For example, a streaming service built on it, or a large deployment for business use.
Thus, while Jellyfin is a GNU GPL-licensed project which does not prevent or preclude commercial uses, please be aware that some members of our community do not look kindly on this and, as is their choice under our volunteer-only policy, may not be willing to provide support for commercial implementations. Not everyone feels this way, and such discussions are allowed here (subject to all other rules), but we want to ensure this is explicitly stated to avoid any misunderstandings or misaligned expectations.
In short, if you are expecting support for the commercialization of Jellyfin, please do so respectfully and with the mutual understanding that this is not something everyone might wish to endorse, and no member of the team nor forum community is under any obligation to assist if they do not want to.
Note that this policy is strictly in regards to **legitimate** business uses of Jellyfin. [Running pirate media instances is covered by our Server Policy.](/docs/general/community-standards/servers)
@@ -1,5 +1,5 @@
---
uid: community-standards
uid: community-standards-index
title: Community Standards
---
@@ -25,6 +25,8 @@ At all times when interacting with the Jellyfin community via any method (Matrix
- **Do not engage in, encourage, facilitate or discuss piracy in any Jellyfin communities.** Jellyfin is a media server system for your own media collection; how you obtain media is not our concern and is not to be discussed in our communities in any form. **Do not ask about where or how to obtain media**, **do not ask about, sell, trade, or otherwise facilitate access to other users' servers** or **discuss any piracy related topics. This includes discussing technologies commonly used for piracy and personal philosophies about it**, in our communities. Please also refrain from discussing any topic that is closely related to piracy or accompanying topics and technology.
- **Do not suggest, encourage, or discuss configurations that may violate the Terms of Service (TOS) of any other platforms.** Jellyfin can interface with multiple external services, both internally (e.g. Metadata providers) and by user configuration, each of which has its own requirements and TOS to protect itself. We do not want Jellyfin or its community to develop a reputation for facilitating circumvention or breaking of other services' TOSes or be seen as a problematic member of the wider community. The exact nature of these violations is subject to interpretation on a case-by-case basis based on the service in question and the discussion, and this rule is designed to bring attention to the issue. As a concrete example, the Cloudflare Terms Of Service forbid video streaming behind a normal Cloudflare tunnel; thus, suggesting a user run their instance in this way is a violation of this rule.
- **English is the primary working language of Jellyfin, but large portions of the community are not native English speakers**. Be patient when language issues arise, and do not mistake incomplete language knowledge for ignorance or worse. If you are having trouble communicating an idea in English, please post in your native language and ask for help translating, and someone is likely to understand.
- Jellyfin is created exclusively by volunteers, as set out in our Mission Statement. Since they are freely giving their time and effort, **no volunteer contributor owes anything whatsoever to any other contributor, any user, or the project itself**. Contributors are free to come and go as they please, to work on and give attention to what they deem interesting or important, and to respond or not respond to anything they wish. **Do not badger volunteers** in any way about any topic.
@@ -53,5 +55,6 @@ Questions or comments regarding these standards should be forwarded to the [Proj
This document represents official Jellyfin project policy. Any changes to this document require a changelog entry here and approval by a Project Leader.
- 2020-09-14, Joshua Boniface: Initial version of the community standards document. Based *very* loosely on several CoCs including the Contributor Covenant, and various Forum rules I've read and written over the years.
- 2020-09-14, Joshua Boniface: Initial version of the community standards document. Based _very_ loosely on several CoCs including the Contributor Covenant, and various Forum rules I've read and written over the years.
- 2022-09-03, Joshua Boniface: Update header and footer sections; reduce redundant wording; make rules clearer.
- 2024-08-12, JPVenson: Added section about respecting the TOS of other services
@@ -0,0 +1,28 @@
---
uid: community-standards-servers
title: Server Policy
---
# Server Policy
Jellyfin is a free and open source project that provides the **tools to run your own server** for hosting your media, and clients to connect to one of those servers.
The Jellyfin Project itself, and members of the Jellyfin team, **do not provide servers for you to use**, with the sole exception of [our demo server for evaluation and testing](https://demo.jellyfin.org/stable).
**If you are using or paying someone for "Jellyfin" i.e. access to a specific server:**
* **It is not us. We do not run that server.** Do not contact us, privately or publicly, for help with connecting, resetting your password, etc. We cannot help you because we do not run the server. Contact whoever you are paying. If you do not know who that is, we cannot help you.
* **This is almost unequivocally piracy of some sort.** Do not discuss it with us [as per our community standards](/docs/general/community-standards).
Requests for support/help with other people's servers will be ignored.
## If You Run A Jellyfin Server
If you run a Jellyfin server instance for other people, ensure that your users are aware that **you** are their contact for help and support, not us as a project. We are not your server's "customer support" team. **You are not "Jellyfin"**. Do not insinuate to your users that your server is run by us or that we are the same people.
The best way to avoid problems here is to use the "Branding" -> "Login disclaimer" field in the server "General" settings. In this field, give your users a help link, contact form, or something that directs them to **you**, so they know who to contact when they need help with the server.
We will link your users to this page if they contact us for help with specific issues on **your** server. If you are charging people for pirate access to a Jellyfin server and violate these guidelines, and we become aware, we reserve the right to report you to your hosting provider for piracy and ban you and your users from our support channels. This is [a violation of our community standards](/docs/general/community-standards) and will not be tolerated.
You have been warned.
+7 -1
View File
@@ -30,6 +30,12 @@ Specific examples include:
## Icons and Other Assets
:::warning
Jellyfin is currently rebranding, as such these guidelines (including the logo) are outdated. Join our [#jellyfin-ui-ux](https://matrix.to/#/#jellyfin-ui-ux:matrix.org) chat on Matrix for any questions.
:::
All iconography and other resources can be found in the [jellyfin-ux](https://github.com/jellyfin/jellyfin-ux) repository.
- Icons
@@ -58,4 +64,4 @@ The design for the logo uses a gradient for the infill, and if the non-transpare
### Fonts
The banner uses the [Quicksand](https://fonts.google.com/specimen/Quicksand) font.
The banner uses the [Plus Jakarta Sans](https://fonts.google.com/specimen/Plus+Jakarta+Sans) font.
+11 -7
View File
@@ -12,7 +12,7 @@ This page details how our repositories are organized, how to get started editing
There are many projects within the [organization](https://github.com/jellyfin) to browse through for contributions.
Summarized here are the two biggest ones, one for backend devs and another for frontend devs.
- [Jellyfin Server](https://github.com/jellyfin/jellyfin): The server portion, built using .NET 7 and C#.
- [Jellyfin Server](https://github.com/jellyfin/jellyfin): The server portion, built using .NET 9 and C#.
- [Jellyfin Web](https://github.com/jellyfin/jellyfin-web): The main client application built for browsers, but also used in some of our other clients that are just wrappers.
Note that each of the repositories also has its own documentation on how to get started with that project, generally found in the repository README. You can also view the organization [source tree](/docs/general/contributing/source-tree) to see how some of the bigger projects are structured.
@@ -187,13 +187,17 @@ Run each command on a separate line. The container we'll test in is named `jftes
```sh
docker exec -ti jftest bash
apt-get update && apt-get install git gnupg wget apt-transport-https curl autoconf g++ make libpng-dev gifsicle automake libtool make gcc musl-dev nasm
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.asc.gpg && mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/
wget -q https://packages.microsoft.com/config/debian/10/prod.list && mv prod.list /etc/apt/sources.list.d/microsoft-prod.list
apt-get update && apt-get install dotnet-sdk-7.0 npm
apt-get update && apt-get install -y git gnupg curl autoconf g++ make libpng-dev gifsicle automake libtool gcc musl-dev nasm ca-certificates
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
curl -LO https://packages.microsoft.com/config/debian/12/prod.list && mv prod.list /etc/apt/sources.list.d/microsoft-prod.list
apt-get update && apt-get install -y dotnet-sdk-8.0
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
apt-get update && apt-get install -y nodejs
cd /opt && git clone https://github.com/jellyfin/jellyfin.git && git clone https://github.com/jellyfin/jellyfin-web.git
cd jellyfin/ && DOTNET_CLI_TELEMETRY_OPTOUT=1 && DOTNET_CLI_HOME="/tmp/" dotnet publish --disable-parallel Jellyfin.Server --configuration Debug --output="/jellyfin" --self-contained --runtime linux-x64
cd /opt/jellyfin-web && npm install && cp -r /opt/jellyfin-web/dist /jellyfin/jellyfin-web
cd jellyfin/ && DOTNET_CLI_TELEMETRY_OPTOUT=1 && DOTNET_CLI_HOME="/tmp/" dotnet publish Jellyfin.Server --configuration Debug --output="/jellyfin" --self-contained --runtime linux-x64
cd /opt/jellyfin-web && npm install && npm run build:development && cp -r /opt/jellyfin-web/dist /jellyfin/jellyfin-web
apt-get remove -y gnupg curl && apt-get clean -y autoclean && apt-get autoremove -y
kill -15 $(pidof jellyfin)
```
+3 -3
View File
@@ -10,7 +10,7 @@ Jellyfin is a maze of clients, plugins, and other useful projects. These source
## [Jellyfin Server](https://github.com/jellyfin/jellyfin)
1. .ci: `Azure Pipelines Build definitions`
2. DvdLib: `DVD Anaylzer`
2. DvdLib: `DVD Analyzer`
3. Emby.Dlna: `DLNA support for the server`
- Profiles: `DLNA Profiles for clients`
4. Emby.Drawing: `image processor managing the image encoder and image cache paths`
@@ -25,7 +25,7 @@ Jellyfin is a maze of clients, plugins, and other useful projects. These source
- MediaInfoHelper.cs: `logic for the stream builder that determines method of playback such as Direct Play or Transcoding`
10. Jellyfin.Data: `models used in the Entity Framework Core Database schema`
11. Jellyfin.Drawing.Skia: `image manipulation like resizing images, making image collages`
12. Jellyfin.Networking: `managing network interaces and settings`
12. Jellyfin.Networking: `managing network interfaces and settings`
13. Jellyfin.Server.Implementations: `like Emby.Server.Implementations, implementations using the EF Core Database`
14. Jellyfin.Server: `main server project that starts the whole server`
15. MediaBrowser.Common: `common methods used throughout the server`
@@ -37,7 +37,7 @@ Jellyfin is a maze of clients, plugins, and other useful projects. These source
21. MediaBrowser.XbmcMetadata: `metadata provider and saver for local .nfo files`
22. RSSDP: [RSSDP library](https://github.com/Yortw/RSSDP)`, including custom changes, for the Simple Service Discovery (SSDP) protocol`
23. apiclient: `files used for generating the axios API client`
24. deployment: `files used while building Jellyfin for different plattforms`
24. deployment: `files used while building Jellyfin for different platforms`
25. tests: `multiple Unit Test projects testing Jellyfin functionality`
26. Dockerfile.* `Dockerfiles defining the Jellyfin Docker image`
+2 -2
View File
@@ -1,7 +1,7 @@
---
uid: faq
title: FAQ
sidebar_position: 2
sidebar_position: 1
---
# Frequently Asked Questions
@@ -33,7 +33,7 @@ This normally comes down to one of the following issues:
1. [File permissions](https://wikipedia.org/wiki/File-system_permissions) are not properly configured on your media.
2. Your media does not follow the organizational requirements for Jellyfin's scanner to properly identify media. (Valid organization schemes can be found in the documentation for [Movies](/docs/general/server/media/movies), [Shows](/docs/general/server/media/shows), [Music](/docs/general/server/media/music), and others.)
If it's not one of these, please consider asking for help as it might be a bug.
If it's not one of these, please consider asking for help as it might be a bug.
## How can I contribute to this project?
+1 -1
View File
@@ -1,7 +1,7 @@
---
uid: getting-help
title: Getting Help
sidebar_position: 1
sidebar_position: 0
---
# Getting Help
+1 -1
View File
@@ -1,2 +1,2 @@
label: 'Installation'
position: 3
position: 2
@@ -0,0 +1,2 @@
label: 'Advanced Installation'
position: 6
@@ -0,0 +1,139 @@
---
uid: installation-advanced-community
title: Community Maintained Packages
description: Community maintained packages.
sidebar_position: 1
---
# Community Maintained Packages
These packages are maintained by community packagers independent of Jellyfin for distributions not officially supported by Jellyfin. We can't always support problems with community-maintained packages. If you encounter trouble with them, please contact their maintainers first. If you're not sure, we recommend using [container images](/docs/general/installation/container) on these systems instead.
## Alpine Linux
Jellyfin can be found in the `community` repository as
[`jellyfin`](https://pkgs.alpinelinux.org/package/edge/community/x86_64/jellyfin) and
[`jellyfin-web`](https://pkgs.alpinelinux.org/package/edge/community/x86_64/jellyfin-web).
To enable the web UI after installing `jellyfin-web`, make sure to remove the `--nowebclient` option from
`/etc/conf.d/jellyfin`.
## Arch Linux
The `Extra` repository contains builds for both [`jellyfin-server`](https://archlinux.org/packages/?name=jellyfin-server) and [`jellyfin-web`](https://archlinux.org/packages/?name=jellyfin-web).
`jellyfin-server` includes a hard dependency on [`jellyfin-ffmpeg`](https://archlinux.org/packages/?name=jellyfin-ffmpeg).
Both packages, server and web, can also be built from source at the tip of the master branch using [`jellyfin-git`](https://aur.archlinux.org/packages/jellyfin-git/).
The AUR also offers each separately at [`jellyfin-server-git`](https://aur.archlinux.org/packages/jellyfin-server-git/) and [`jellyfin-web-git`](https://aur.archlinux.org/packages/jellyfin-web-git/).
## Fedora, CentOS and other RPM distributions
Builds in RPM package format are provided by RPM Fusion. Official packages are no longer provided starting with 10.9.
### RPM Fusion
1. `rpmfusion` must be enabled first
```sh
sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
```
2. Install the `jellyfin` package, which will automatically install `jellyfin-server`, `jellyfin-web` and `jellyfin-firewalld`
```sh
sudo dnf install jellyfin
```
3. Enable and start the Jellyfin service:
```sh
sudo systemctl enable --now jellyfin
```
### Manual installation via the .rpm packages
1. You will need to enable `rpmfusion`, as `ffmpeg` is a dependency of the `jellyfin` server package
```sh
sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
```
:::note
You do not need to manually install `ffmpeg`; it will be installed by the Jellyfin server package as a dependency.
:::
2. Install the Jellyfin server
```sh
sudo dnf install <link to server `.rpm` file URL>
```
3. Install the Jellyfin web interface
```sh
sudo dnf install <link to web `.rpm` file URL>
```
4. Enable and start the Jellyfin service:
```sh
sudo systemctl enable --now jellyfin
```
5. Allow Jellyfin through the firewall:
```sh
sudo firewall-cmd --permanent --add-service=jellyfin
```
:::note
This will open the following ports:
- `8096 TCP`, used by default for HTTP traffic; you can change this in the dashboard
- `8920 TCP`, used by default for HTTPS traffic; you can change this in the dashboard
- `1900 UDP`, used for service auto-discovery; this is not configurable
- `7359 UDP`, used for auto-discovery; this is not configurable
:::
6. Reload the firewall to apply the new rules:
```sh
sudo firewall-cmd --reload
```
7. Go to `localhost:8096` or `ip-address-of-jellyfin-server:8096` to finish setup in the web UI.
## Gentoo
The Gentoo ebuild repository includes the Jellyfin package which can be installed like other software:
```sh
emerge www-apps/jellyfin
```
## NixOS
NixOS has a [module for Jellyfin](https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/services/misc/jellyfin.nix),
it can be enabled as follows:
```nix
{
services.jellyfin.enable = true;
}
```
For more information, refer to the [NixOS wiki](https://wiki.nixos.org/wiki/Jellyfin).
## Flatpak
The Jellyfin Server package is available on [Flathub](https://flathub.org/apps/org.jellyfin.JellyfinServer).
This package is provided for convenience only, and may be deprecated at any time. It is not recommended as [Flatpak themselves don't recommend the use of Flatpak for server applications](https://flatpak.org/faq/#Can_Flatpak_be_used_on_servers_too_). Please use [container images](/docs/general/installation/container) instead.
## FreeBSD
A [Third-party Jellyfin build for FreeBSD](https://github.com/Thefrank/jellyfin-server-freebsd) is available. This is not supported by Jellyfin. Please report any issues to them. Issues reported to Jellyfin about this package will be closed without further investigation.
@@ -0,0 +1,392 @@
---
uid: installation-advanced-manual
title: Manual Installation
description: Install Jellyfin Manually.
sidebar_position: 3
---
<!-- markdownlint-disable MD036 no-emphasis-as-heading -->
## Portable Windows Package
### Portable Windows Install
1. Download and extract the latest version.
2. Create a folder `jellyfin` at your preferred install location.
3. Copy the extracted folder into the `jellyfin` folder and rename it to `system`.
4. Create `jellyfin.bat` within your `jellyfin` folder containing:
- To use the default library/data location at `%localappdata%`:
```cmd
<--Your install path-->\jellyfin\system\jellyfin.exe
```
- To use a custom library/data location (Path after the -d parameter):
```cmd
<--Your install path-->\jellyfin\system\jellyfin.exe -d <--Your install path-->\jellyfin\data
```
- To use a custom library/data location (Path after the -d parameter) and disable the auto-start of the webapp:
```cmd
<--Your install path-->\jellyfin\system\jellyfin.exe -d <--Your install path-->\jellyfin\data -noautorunwebapp
```
5. Run
```cmd
jellyfin.bat
```
6. Open your browser at `http://<--Server-IP-->:8096`.
### Portable Windows Update
1. Stop Jellyfin
2. Rename the Jellyfin `system` folder to `system-bak`
3. Download and extract the latest Jellyfin version
4. Copy the extracted folder into the `jellyfin` folder and rename it to `system`
5. Run `jellyfin.bat` to start the server again
### Portable Windows Rollback
1. Stop Jellyfin.
2. Delete the `system` folder.
3. Rename `system-bak` to `system`.
4. Run `jellyfin.bat` to start the server again.
## Portable macOS package
### Installing the Portable macOS Version
1. Download the latest version of Jellyfin.
2. Extract it into the Applications folder.
3. Open Terminal and type `cd` followed with a space then drag the jellyfin folder into the terminal.
4. Type `xattr -rd com.apple.quarantine .` to remove the quarantine flag.
5. Type `codesign -fs - --deep jellyfin` to create an ad-hoc signature for the server.
6. Type `./jellyfin` to run jellyfin.
7. Open your browser at [http://localhost:8096](http://localhost:8096).
Closing the terminal window will end Jellyfin. Running Jellyfin in screen or tmux can prevent this from happening.
### Updating the Portable macOS Version
1. Download the latest version.
2. Stop the currently running server either via the dashboard or using `CTRL+C` in the terminal window.
3. Extract the latest version into Applications
4. Open Terminal and type `cd` followed with a space then drag the jellyfin folder into the terminal.
5. Type `xattr -rd com.apple.quarantine .` to remove the quarantine flag.
6. Type `codesign -fs - --deep jellyfin` to create an ad-hoc signature for the server.
7. Type `./jellyfin` to run jellyfin.
8. Open your browser at [http://localhost:8096](http://localhost:8096)
### Uninstalling the Portable macOS Version
1. Stop the currently running server either via the dashboard or using `CTRL+C` in the terminal window.
2. Move `/Application/jellyfin-version` folder to the Trash. Replace version with the actual version number you are trying to delete.
3. Delete the folder `~/.config/jellyfin/`
4. Delete the folder `~/.local/share/jellyfin/`
### Using FFmpeg with the Portable macOS Version
The portable version doesn't come with FFmpeg by default. There are a few options for installing FFmpeg:
- download jellyfin-ffmpeg from the [Jellyfin repo](https://repo.jellyfin.org/?path=/ffmpeg/macos) (recommended)
- use the package manager homebrew by typing `brew install ffmpeg` into your Terminal ([here's how to install homebrew if you don't have it already](https://treehouse.github.io/installation-guides/mac/homebrew)
- download the most recent [static build](https://evermeet.cx/ffmpeg/get/zip) (compiled by a third party see [evermeet.cx](https://evermeet.cx/ffmpeg/) for options and information) (Apple Silicon builds are not available from this source)
- compile from source available from the official [website](https://ffmpeg.org/download.html)
Once downloaded, remove the quarantine flag for the `ffmpeg` and `ffprobe`.
Ensure that both `ffmpeg` and `ffprobe` are located at the same path, then execute the following command:
```shell
cd /path/to/ffmpeg/folder
xattr -rd com.apple.quarantine .
```
## Portable Linux install
Generic `amd64`, `arm64`, and `armhf` Linux builds in TAR archive format are available [in the main download repository](https://repo.jellyfin.org/?path=/server/).
### Base Installation Process
Create a directory in `/opt` for jellyfin and its files, and enter that directory.
```sh
sudo mkdir /opt/jellyfin
cd /opt/jellyfin
```
Download the latest generic Linux build for your architecture.
The rest of these instructions assume version 10.8.13 is being installed (i.e. `jellyfin_10.8.13_amd64.tar.gz`).
Download the generic build, then extract the archive:
```sh
sudo wget https://repo.jellyfin.org/?path=/server/linux/stable/combined/jellyfin_10.8.13_amd64.tar.gz
sudo tar xvzf jellyfin_10.8.13_amd64.tar.gz
```
Create a symbolic link to the Jellyfin 10.8.13 directory.
This allows an upgrade by repeating the above steps and enabling it by simply re-creating the symbolic link to the new version.
```sh
sudo ln -s jellyfin_10.8.13 jellyfin
```
Create four sub-directories for Jellyfin data.
```sh
sudo mkdir data cache config log
```
### `FFmpeg` Installation
If you are not running a Debian derivative, install `ffmpeg` through your OS's package manager, and skip this section.
:::caution
Not being able to use `jellyfin-ffmpeg` will most likely break hardware acceleration and tonemapping.
:::
If you are running Debian or a derivative, you should [download](https://repo.jellyfin.org/?path=/ffmpeg/debian/) and install an `ffmpeg` `.deb` package built specifically for Jellyfin.
If you run into any dependency errors, run this and it will install them and `jellyfin-ffmpeg`.
```sh
sudo apt install -f
```
### Running Jellyfin
Due to the number of command line options that must be passed on to the Jellyfin binary, it is easiest to create a small script to run Jellyfin.
```sh
sudoedit jellyfin.sh
```
Then paste the following commands and modify as needed.
```sh
#!/bin/bash
JELLYFINDIR="/opt/jellyfin"
FFMPEGDIR="/usr/share/jellyfin-ffmpeg"
$JELLYFINDIR/jellyfin/jellyfin \
-d $JELLYFINDIR/data \
-C $JELLYFINDIR/cache \
-c $JELLYFINDIR/config \
-l $JELLYFINDIR/log \
--ffmpeg $FFMPEGDIR/ffmpeg
```
Assuming you desire Jellyfin to run as a non-root user, `chmod` all files and directories to your normal login user and group.
Also make the startup script above executable.
```sh
sudo chown -R user:group *
sudo chmod u+x jellyfin.sh
```
Finally, you can run it.
You will see lots of log information when run, this is normal.
Setup is as usual in the web browser.
```sh
./jellyfin.sh
```
#### Starting Jellyfin on boot (optional)
Create a `systemd` unit file.
```sh
cd /etc/systemd/system
sudo nano jellyfin.service
```
Then paste the following contents, replacing `youruser` with your username.
```ini
[Unit]
Description=Jellyfin
After=network.target
[Service]
Type=simple
User=youruser
Restart=always
ExecStart=/opt/jellyfin/jellyfin.sh
[Install]
WantedBy=multi-user.target
```
Apply the correct permissions to the file, enable the service to start on boot, then start it.
```sh
sudo chmod 644 jellyfin.service
sudo systemctl daemon-reload
sudo systemctl enable jellyfin.service
sudo systemctl start jellyfin.service
```
## Portable .NET DLL
Platform-agnostic .NET Core DLL builds in TAR archive format are available from the [portable downloads section](/downloads/dotnet).
These builds use the binary `jellyfin.dll` and must be loaded with `dotnet`.
## Debian (using extrepo)
extrepo is only supported on Debian currently. The advantage of extrepo is that it is packaged in Debian. So you dont have to execute the `curl | sudo bash` combo from the previous Automatic section. The risk with that command is that it relies on the security of the webserver. extrepo avoids this by having the Jellyfin repo information including the GPG key in its [extrepo-data](https://salsa.debian.org/extrepo-team/extrepo-data/-/blob/master/repos/debian/jellyfin.yaml?ref_type=heads). extrepo-data is verified with GPG by the extrepo tool. So there is a chain of trust from Debian all the way to the Jellyfin repo information.
```sh
sudo apt install extrepo
sudo extrepo enable jellyfin
```
Now you can continue at step 5. of the [Repository (Manual) section](#official-linux-repository-manual).
## Official Linux Repository (Manual)
If you would prefer to install everything manually, the full steps are as follows:
1. Install `curl` and `gnupg` if you haven't already:
```sh
sudo apt install curl gnupg
```
2. On Ubuntu (and derivatives) only, enable the Universe repository to obtain all the FFmpeg dependencies:
```sh
sudo add-apt-repository universe
```
:::note
If the above command fails you will need to install the following package `software-properties-common`.
This can be achieved with the following command `sudo apt-get install software-properties-common`
:::
On Debian, you can also enable the `non-free` components of your base repositories for additional FFmpeg dependencies, but this is optional.
3. Download the GPG signing key (signed by the Jellyfin Team) and install it:
```sh
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/jellyfin.gpg
```
4. Add a repository configuration at `/etc/apt/sources.list.d/jellyfin.sources`:
```sh
export VERSION_OS="$( awk -F'=' '/^ID=/{ print $NF }' /etc/os-release )"
export VERSION_CODENAME="$( awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release )"
export DPKG_ARCHITECTURE="$( dpkg --print-architecture )"
cat <<EOF | sudo tee /etc/apt/sources.list.d/jellyfin.sources
Types: deb
URIs: https://repo.jellyfin.org/${VERSION_OS}
Suites: ${VERSION_CODENAME}
Components: main
Architectures: ${DPKG_ARCHITECTURE}
Signed-By: /etc/apt/keyrings/jellyfin.gpg
EOF
```
:::note
The supported values for the above variables are:
- `${VERSION_OS}`: One of `debian` or `ubuntu`; if it is not, use the closest one for your distribution.
- `${VERSION_CODENAME}`: One of our supported [Debian](https://github.com/jellyfin/jellyfin-repo-helper-scripts/blob/master/install-debuntu.sh#L7) or [Ubuntu](https://github.com/jellyfin/jellyfin-repo-helper-scripts/blob/master/install-debuntu.sh#L8) release codenames. These can change as new releases come out and old releases are dropped, so check the script to be sure yours is supported.
- `${DPKG_ARCHITECTURE}`: One of our [supported architectures](https://github.com/jellyfin/jellyfin-repo-helper-scripts/blob/master/install-debuntu.sh#L6). Microsoft does not provide a .NET for 32-bit x86 Linux systems, and hence Jellyfin is **not** supported on the `i386` architecture.
:::
5. Update your APT repositories:
```sh
sudo apt update
```
6. Install the Jellyfin metapackage, which will automatically fetch the various sub-packages:
```sh
sudo apt install jellyfin
```
:::note
If you want to be explicit, instead of the metapackage, you can install the sub-packages individually:
```sh
sudo apt install jellyfin-server jellyfin-web
```
The `jellyfin-server` package will automatically select the right `jellyfin-ffmpeg` package for you as well.
:::
7. Manage the Jellyfin system service:
```sh
sudo systemctl {action} jellyfin
sudo service jellyfin {action}
```
## `.deb` Packages (Very Manual)
Raw `.deb` packages, including old versions, source packages, and `dpkg` meta files, are available [in the main download repository](https://repo.jellyfin.org/?path=/server/).
:::note
The repository is the preferred way to obtain Jellyfin on Debian and Ubuntu systems, as this ensures you get automatic updates and that all dependencies are properly resolved. Use these steps only if you really know what you're doing.
:::
1. On Ubuntu (and derivatives) only, enable the Universe repository to obtain all the FFmpeg dependencies:
```sh
sudo add-apt-repository universe
```
:::note
If the above command fails you will need to install the following package `software-properties-common`.
This can be achieved with the following command `sudo apt-get install software-properties-common`
:::
On Debian, you can also enable the `non-free` components of your base repositories for additional FFmpeg dependencies, but this is optional.
2. Download the desired `jellyfin-server`, `jellyfin-web`, and `jellyfin-ffmpeg` `.deb` packages from the repository; `jellyfin` is a metapackage and is not required.
3. Install the downloaded `.deb` packages:
```sh
sudo dpkg -i jellyfin_*.deb jellyfin-ffmpeg_*.deb
```
:::note
This step may throw errors; continue to the next step to resolve them.
:::
4. Use `apt` to install any missing dependencies:
```sh
sudo apt -f install
```
5. Manage the Jellyfin system service:
```sh
sudo systemctl {action} jellyfin
sudo service jellyfin {action}
```
@@ -1,8 +1,8 @@
---
uid: installation-source
uid: installation-advanced-source
title: Building from source
description: Compile and run Jellyfin yourself.
sidebar_position: 6
sidebar_position: 4
---
<!-- markdownlint-disable MD029 ol-prefix -->
@@ -16,8 +16,8 @@ All package builds begin with these two steps:
1. Clone the repository.
```sh
git clone https://github.com/jellyfin/jellyfin.git
cd jellyfin
git clone https://github.com/jellyfin/jellyfin-packaging.git
cd jellyfin-packaging
```
2. Initialize the submodules.
@@ -31,15 +31,23 @@ All package builds begin with these two steps:
1. Build the container image using Docker or Podman.
```sh
docker build -t $USERNAME/jellyfin .
docker build -t $USERNAME/jellyfin --file docker/Dockerfile .
```
or
```sh
podman build -t $USERNAME/jellyfin .
podman build -t $USERNAME/jellyfin --file docker/Dockerfile .
```
or use provided Python build script:
```sh
./build.py auto docker
```
Replace "auto" with your own Jellyfin version tag if you want to.
2. Run Jellyfin in a new container using Docker or Podman from the built container image.
```sh
@@ -72,7 +80,7 @@ This will very likely be split out into a separate repository at some point in t
## Windows
3. Install dotnet SDK 7.0 from [Microsoft's Website](https://dotnet.microsoft.com/en-us/download/dotnet/7.0) and [install Git for Windows](https://gitforwindows.org/).
3. Install dotnet SDK 8.0 from [Microsoft's Website](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) and [install Git for Windows](https://gitforwindows.org/).
You must be on Powershell 3 or higher.
4. From Powershell set the execution policy to unrestricted.
@@ -0,0 +1,34 @@
---
uid: installation-synology
title: Synology
description: Install on Synology NAS.
sidebar_position: 2
---
For [Synology](https://www.synology.com/en-us/dsm), Jellyfin is installed using Docker.
![Docker image add from url](/images/docs/install-synology-1.png)
![add from url window](/images/docs/install-synology-2.png)
![choose tag window](/images/docs/install-synology-3.png)
Create the container.
![create container general settings](/images/docs/install-synology-4.png)
![create container advance settings](/images/docs/install-synology-5.png)
Use Advanced Settings to add mount points to your media and config.
![add mounts window](/images/docs/install-synology-6.png)
![advance settings showing mount added](/images/docs/install-synology-7.png)
Host Mode is required for HdHR and DLNA. Use bridge mode if running multiple instances.
![advance settings network tab](/images/docs/install-synology-8.png)
![create container summary](/images/docs/install-synology-9.png)
Browse to `http://SERVER_IP:8096` to access the web client.
@@ -0,0 +1,542 @@
---
uid: installation-truenas
title: TrueNAS SCALE
description: Install on TrueNAS SCALE.
sidebar_position: 4
---
Jellyfin can be installed on iX-systems' [TrueNAS SCALE](https://www.truenas.com/truenas-scale/).
This document is written for TrueNAS SCALE v24.10.0 (Electric Eel) or higher.
Consider reviewing the [TrueNAS Apps documentation](https://www.truenas.com/docs/truenasapps/) if you have not previously configured applications on your system.
- Note: TrueNAS CORE and TrueNAS SCALE are different. Jellyfin is not supported on TrueNAS CORE.
## Introduction and Preparation
TrueNAS SCALE lets you run apps using Docker.
There are two supported methods of installing Jellyfin on your TrueNAS SCALE server:
1. Custom App
2. Community 3rd Party App provided by ix-systems
Both methods use the official Jellyfin-provided Docker image.
This document will cover both install methods.
You can configure environment variables at any time after deploying the application.
It is recommend to set the TrueNAS SCALE App system to a storage pool comprised of SSDs.
---
### Datasets & Jellyfin
The official Jellyfin Docker image internally creates the following necessary directories:
1. cache
2. config
3. cache/transcodes
If you use the community app, you can allow SCALE to create datasets for the directories Jellyfin requires automatically during app installation.
You can also choose to create a static **transcodes** dataset or use temporary storage on the disk or in memory (system RAM) for transcoding.
- Note that using RAM for transcodes can be a bad idea as transcodes can take up a lot of space. If there isn't enough memory available in RAM for a transcode, the transcode will fail. It is recommended that you place the transcode directory on a drive with a decent amount of free space to avoid this issue. Consider using an SSD instead of an HDD to avoid possible slowdowns.
You can also [create your own custom datasets](https://www.truenas.com/docs/scale/scaletutorials/storage/datasets/datasetsscale/) to use in the **Storage Configuration** section as `host paths` during installation.
You can organize datasets as one parent with two child datasets, for example `/mnt/tank/jellyfin/config`, `/mnt/tank/jellyfin/cache`, and so on.
With Docker, you can organize these in any way as long as you mount them under the correct name to the Docker container.
It is recommended to set Jellyfin's config directory to an accessible dataset.
This will make it easy to [backup/restore your server](/docs/general/administration/backup-and-restore).
It is also recommended to use datasets located on an SSD Storage Pool for Jellyfin's configuration and cache data.
---
### Users & Permissions
You can set the user and group that will run your container when setting up Jellyfin.
If you want to run the application with a user or group other than the default apps (568) user and group, [create them](https://www.truenas.com/docs/scale/scaletutorials/credentials/managelocalusersscale/) now.
Make sure your datasets have appropriate [permissions set](https://www.truenas.com/docs/scale/scaletutorials/datasets/permissionsscale/) to allow the Jellyfin container user to access your datasets.
---
## Installing as a Custom App
### Using YAML
Go to SCALE's Apps section.
![Custom App Button](/images/docs/install-truenas-1.png)
Click on the **Discover Apps** button on the top-right of the page.
It will bring you to the community app store.
![YAML Button](/images/docs/install-truenas-2.png)
There, click on the 3-dot menu on the top-right and then on **Install via YAML**.
- Note that you can also install a custom app using SCALE's guided app launcher GUI. Refer to the steps on [installing the community app](#installing-with-the-scale-community-app) since the layout is largely the same.
- If you go this route, your final Jellyfin container will only be editable through this GUI. If you want access to the Compose YAML editor afterwards, you need to launch your container with the YAML option.
- You will need to pull Jellyfin's image onto your SCALE server depending on the setting you choose on the guided GUI.
- For the **Repository** field, simply enter `jellyfin/jellyfin`. You then specify what **Tag** (version) you want to pull from the Docker Hub.
- See [this for more info on container images on SCALE](#managing-container-images)
A tab will open from the right side of the page where you launch your custom app using a Docker Compose file.
### Compose YAML File
![Custom App Install Page](/images/docs/install-truenas-3.png)
Here, give the custom app a name and write/paste the lines for your compose file.
See here for [documentation on using Docker Compose with Jellyfin](/docs/general/installation/container#using-docker-compose).
Alternatively, here's a basic compose file where you should edit the volumes to use on your system, then copy & paste it into the editor to launch Jellyfin:
```yml
services:
jellyfin:
container_name: jellyfin
image: ghcr.io/jellyfin/jellyfin:latest
user: '568:568'
# group_add:
# - '107'
# devices:
# - /dev/dri/renderD128:/dev/dri/renderD128
# - /dev/dri/card0:/dev/dri/card0
environment:
- TZ=America/Los_Angeles
network_mode: bridge
ports:
- 8096:8096/tcp
# cpus: '8' # optional
# mem_limit: 16G # optional
restart: unless-stopped
volumes:
- /mnt/path/to/config:/config:rw
- /mnt/path/to/cache:/cache:rw
# rw = read & write
# ro = read only
```
- Remember to add your media datasets as extra volumes on your compose file so that the container can access them.
- The user & group you set are only to run the container. They are not used to create a Jellyfin account.
- Make sure your spacing is correct for each option. Compose files use spacing to parse the options correctly.
- You can determine the time zone identifier for you region [on Wikipedia](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).
- Note that lines with `#` in front indicate a comment. They will not apply until you remove it.
- Uncomment the `group_add` and `devices` options if you have a GPU and want to use [hardware acceleration](/docs/general/post-install/transcoding/hardware-acceleration/).
- If you have an NVIDIA GPU, [please read this](#nvidia-gpus-on-scale-v2410).
- Unless you set the container to run as root, you need to add the render group ID to the container with `group_add`.
- In case the render group's ID is not `107` on all SCALE servers by default, go to your system shell and run the following command to get your render group's ID: `cat /etc/group | grep render`
- Jellyfin's auto discovery ports should also be configured if possible.
- [See more info here](/docs/general/post-install/networking/#static-ports)
<details>
<summary>Docker Compose Options</summary>
<table>
<thead>
<tr>
<th>Option</th>
<th>Usage</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>container_name</td>
<td>`"jellyfin"`</td>
<td>The name of your Docker container.</td>
</tr>
<tr>
<td>image</td>
<td>`ghcr.io/jellyfin/jellyfin:latest`</td>
<td>The Docker image to use for the container.</td>
</tr>
<tr>
<td>user</td>
<td>`'UID:GID'`</td>
<td>The `user:group` IDs of the user that will run the container.</td>
</tr>
<tr>
<td>group_add</td>
<td>`GID`</td>
<td>ID of additional group to add.</td>
</tr>
<tr>
<td>devices</td>
<td>`<host-path>:<container-path>`</td>
<td>Devices (ex. GPU) to pass into the container.</td>
</tr>
<tr>
<td>environment</td>
<td>`TZ=<timezone-name>`</td>
<td>Environment variables that affect the container. You can set variables here such as `TZ` for declaring a time zone. See more [**environment configs here**](/docs/general/administration/configuration/).</td>
</tr>
<tr>
<td>network_mode</td>
<td>`bridge`, `host`</td>
<td>Network mode to use for the container. If set to `host`, remove your forwarded ports.</td>
</tr>
<tr>
<td>ports</td>
<td>`host-port:container-port`</td>
<td>Forward the host port to the container port. Refer to the TrueNAS [**default port list**](https://www.truenas.com/docs/references/defaultports/) for a list of assigned port numbers.</td>
</tr>
<tr>
<td>cpus</td>
<td>`'#'`</td>
<td>Assign # amount of CPU threads to the container. You can't assign more threads than there exists on the installed CPU.</td>
</tr>
<tr>
<td>mem_limit</td>
<td>`#G`</td>
<td>Limit memory usage by the container. Can also specify different units: `K=KB`, `M=MB`, `G=GB`</td>
</tr>
<tr>
<td>restart</td>
<td>`no`, `always`, `failure`, `unless-stopped`</td>
<td>Declare how to handle automatic container restarts.</td>
</tr>
<tr>
<td>volumes</td>
<td>`/mnt/tank/jellyfin/my-config-dataset:/config:rw`</td>
<td>Host mount paths on the host system onto the container</td>
</tr>
</tbody>
</table>
</details>
![App Page](/images/docs/install-truenas-4.png)
Once installed, you'll be taken back to the main application screen.
Here, you can see the status of your Jellyfin container, as well as edit the existing compose file you used to launch it to add more to the container.
- TrueNAS SCALE's YAML interface will re-arrange and remove any comments on your YAML file.
Once the status icon of your Jellyfin container turns to the green **Running** icon on the UI, your Jellyfin server is up and running.
You can now reach your Jellyfin server by going to a web browser on your local network and using your SCALE server's IP address along the port number you set for Jellyfin (default HTTP port is 8096).
If you used the previous example compose file and your server's IP address is `192.168.1.10`, you would use this URL on a browser: `http://192.168.1.10:8096`
![Jellyfin Web Portal](/images/docs/install-truenas-18.png)
Once you navigate to your server on a web browser, you're now in your Jellyfin server.
Proceed with the first-time setup wizard to setup your Jellyfin server.
You can also [refer to the Jellyfin docs for further assistance](/docs/).
### Adding the Jellyfin Logo to Custom Apps
When you install a custom app on SCALE, it will have a generic SCALE icon instead of the app's official logo.
You can add Jellyfin's logo back by doing the following:
1. Go to the system shell
2. Switch to root access with the following command (to gain access to the Docker App folder): `sudo -i`
3. Navigate to the location app config location. The directory should be under the name you gave the Jellyfin container when editing the YAML file: `cd /mnt/.ix-apps/app_configs/jellyfin/`
4. Open the **metadata.yaml** file with VIM to edit it: `vim metadata.yaml`
5. Enter **Insert Mode** by typing `i`, then go to the end of `host_mounts: []` and hit the `ENTER` key to make a new line.
6. Add enough (two) spaces to get the text cursor in-line with the metadata options. Write or paste this new line there: `icon: https://media.sys.truenas.net/apps/jellyfin/icons/icon.svg`
7. Press `ESC` to exit **Insert Mode**, then type `:wq` and hit `ENTER` to save & quit.
- Notes:
- You can paste to the SCALE Shell using `SHIFT + INSERT`
- You can force quit without saving in vim by hitting `ESC`, then typing `:q!`
The file should now look like this:
```yml
custom_app: true
human_version: 1.0.0_custom
metadata:
app_version: custom
capabilities: []
description: This is a custom app where user can use his/her own docker compose
file for deploying services
home: ''
host_mounts: []
icon: https://media.sys.truenas.net/apps/jellyfin/icons/icon.svg
maintainers: []
name: custom-app
run_as_context: []
sources: []
title: Custom App
train: stable
version: 1.0.0
migrated: false
notes: null
portals: {}
version: 1.0.0
```
After this, just go to the custom app in the **Apps page**.
Open the **Edit** option in **Application Info**, then click on **Save** at the bottom.
This will update the custom app's icon with Jellyfin's logo.
---
## Installing with the SCALE Community App
To install the **Jellyfin** application, go to **Apps**, click **Discover Apps**, either begin typing Jellyfin into the search field or scroll down to locate the **Jellyfin** application widget.
You might need to click "Refresh Catalog" if no Jellyfin app is showing in the results.
![Jellyfin App Widget](/images/docs/install-truenas-8.png)
Click on the widget to open the **Jellyfin** application details screen.
![Jellyfin App Details Screen](/images/docs/install-truenas-9.png)
Click **Install** to open the Jellyfin application configuration screen.
Application configuration settings are presented in several sections, each explained below.
To find specific fields, click in the **Search Input Fields** search field, scroll down to a particular section or click on the section heading on the navigation area in the upper-right corner.
![Install Jellyfin Screen](/images/docs/install-truenas-10.png)
### Application Name Settings
Accept the default value or enter a name in the **Application Name** field.
In most cases, use the default name, but if adding a second deployment of the application you must change this name.
Accept the default version number in **Version**.
When a new version becomes available, the application has an update badge.
The **Installed Applications** screen shows the option to update applications.
### Jellyfin Configuration Settings
You can accept the defaults in the **Jellyfin Configuration** settings, or enter the settings you want to use.
You can enter a **Published Server URL** for use in UDP autodiscovery, or leave it blank.
If needed, click **Add** to define **Additional Environment Variables**, see [Configuration](/docs/general/administration/configuration/) for options.
### User and Group Settings
You can accept the default value of 568 (apps) in **User ID** and **Group ID** or define your own.
![User and Group Settings](/images/docs/install-truenas-11.png)
This user and group is used for running the Jellyfin container only and cannot be used to log in to the Jellyfin web interface.
Create an admin user in the Jellyfin initial setup wizard to access the UI.
### Networking Settings
Select **Host Network** under **Network Configuration** if using [DLNA](/docs/general/post-install/networking/dlna/), to bind network configuration to the host network settings.
Otherwise, leave **Host Network** unselected.
![Networking](/images/docs/install-truenas-12.png)
You can accept the default port number in **WebUI Port**, which is **30013**.
You can change this to port **8096**.
Most Jellyfin clients have built-in scanning features that look for port **8096** by default.
Refer to the TrueNAS [default port list](https://www.truenas.com/docs/references/defaultports/) for a list of assigned port numbers.
### Storage Settings
Jellyfin requires three app storage datasets for:
1. Jellyfin Config Storage
2. Jellyfin Cache Storage
3. Jellyfin Transcodes Storage
Solid state storage is recommended for config, cache, and transcode storage.
Do not use datasets located on spinning disks where your media storage/libraries are found for these datasets to avoid slowdowns.
You can install Jellyfin using the default setting **ixVolume (dataset created automatically by the system)** or use the host path option with datasets [created before installing the app](#datasets--jellyfin).
![Configure Storage ixVolumes](/images/docs/install-truenas-13.png)
Select **Host Path (Path that already exists on the system)** to browse to and select the datasets.
![Configure Storage Host Paths](/images/docs/install-truenas-14.png)
For **Jellyfin Transcodes Storage**, in **Type**, select:
- **Host Path (Path that already exists on the system)** to use an existing dataset created on the system
- **ixVolume (dataset created automatically by the system)** to let SCALE create the dataset
- **Temporary (Temporary directory created on the disk)** to use a temporary storage directory created somewhere on the storage pool you set for the Apps system
- **tmpfs (Temporary directory created on the RAM)** to use a temporary storage directory created on the system RAM
It is recommended to link the transcode directory to a location with decent amount of available storage.
Transcodes can take up a lot of space depending on the type of content that is being transcoded.
If there's not enough storage here, you will run into playback issues when a transcode doesn't have space to continue being written out.
#### Mounting Additional Storage
Click **Add** next to **Additional Storage** to add the media library storage path(s) on your system.
![Additional Storage](/images/docs/install-truenas-15.png)
Select **Host Path (Path that already exists on the system)** or **SMB/CIFS Share (Mounts a volume to a SMB share)** in **Type**.
You can select **iXvolume (Dataset created automatically by the system)** to create a new library dataset, but this is not recommended.
Mounting an SMB share allows data synchronization between the share and the app.
The SMB share mount does not include ACL protections at this time. Permissions are currently limited to the permissions of the user that mounted the share.
Alternate data streams (metadata), finder colors tags, previews, resource forks, and MacOS metadata are stripped from the share along with filesystem permissions, but this functionality is undergoing active development and implementation planned for a future TrueNAS SCALE release.
- Note that if you want to take advantage of Jellyfin's built-in feature of **real-time media scanning**, you need to mount your media directly with a **Host Path** as SMB connections do not support this feature.
For all types, enter a **Mount Path** to be used within the Jellyfin container.
- For example, the local **Host Path** /mnt/tank/video/movies could be assigned the **Mount Path** /media/movies.
- With this example, you would browse to `/media/movies` in Jellyfin to see the contents of `/mnt/tank/video/movies` on your SCALE server.
<details>
<summary>Additional Storage Fields</summary>
<table>
<thead>
<tr>
<th>Type</th>
<th>Field</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>All</td>
<td>Mount Path</td>
<td>The virtual path to mount the storage within the container.</td>
</tr>
<tr>
<td>Host Path</td>
<td>Host Path</td>
<td>The local path to an existing dataset on the System.</td>
</tr>
<tr>
<td>ixVolume</td>
<td>Dataset Name</td>
<td>The name for the dataset the system creates.</td>
</tr>
<tr>
<td>SMB Share</td>
<td>Server</td>
<td>The server for the SMB share.</td>
</tr>
<tr>
<td>SMB Share</td>
<td>Share</td>
<td>The name of the share.</td>
</tr>
<tr>
<td>SMB Share</td>
<td>Domain (Optional)</td>
<td>The domain for the SMB share.</td>
</tr>
<tr>
<td>SMB Share</td>
<td>Username</td>
<td>The user name used to access the SMB share.</td>
</tr>
<tr>
<td>SMB Share</td>
<td>Password</td>
<td>The password for the SMB share user.</td>
</tr>
<tr>
<td>SMB Share</td>
<td>Size (in Gi)</td>
<td>The quota size for the share volume. You can edit the size after deploying the application if you need to increase the storage volume capacity for the share.</td>
</tr>
</tbody>
</table>
</details>
### Resource Configuration Settings
![Resource Limits](/images/docs/install-truenas-16.png)
You can customize limits on the CPU and memory allocated to the container Jellyfin will reside in.
- **CPUs** expects a value in **number of threads** to assign as a max CPU thread limit.
- You should set this option to the number of threads your CPU contains.
- [Refer here for reasonable CPU limits based on your SCALE server's CPU](/docs/general/administration/hardware-selection#cpu)
- **Memory (in MB)** expects a value in **megabytes**.
- The default is **4096** which means the container will be limited to 4GB of RAM usage.
- To calculate a value in gigabytes, use this formula where **X** is a number in MB: `X * 1024`
- [Refer here for sensible RAM limits for your Jellyfin server](/docs/general/administration/hardware-selection#system-memory-ram)
- The max limit you can assign to either limit depends on your SCALE server's specs.
For the GPU Configuration, check the **Passthrough available (non-NVIDIA) GPUs** option if you need to pass a GPU device for hardware acceleration use with Jellyfin.
- If you have an NVIDIA GPU, [please read this](#nvidia-gpus-on-scale-v2410).
### Finalizing Install
Click **Install**.
A container launches with root privileges to apply the correct permissions to the Jellyfin directories.
Afterward, the Jellyfin container runs as a non-root user (default: 568).
Configured storage directory ownership is changed if the parent directory does not match the configured user.
The system opens the **Installed Applications** screen with the Jellyfin app in the **Deploying** state.
When the installation completes, it changes to **Running**.
![App Page](/images/docs/install-truenas-17.png)
Click the **Web UI** button on the **Application Info** widget to open the Jellyfin web initial setup wizard to set up your admin account and begin administering libraries.
![Jellyfin Web Portal](/images/docs/install-truenas-18.png)
### Editing the Jellyfin Application
Go to the **Installed Applications** screen and select Jellyfin from the list of installed applications.
Click **Edit** on the **Application Info** widget to open the **Edit Jellyfin** screen.
The settings on the edit screen are the same as on the install screen.
- You cannot edit **Storage Configuration** paths after the initial app install **_if they have been automatically created by the system (ixVolume)_**.
- You can still modify existing **Host Paths** storage mounts and paths.
Click **Update** to save changes.
TrueNAS automatically updates, recreates, and redeploys the Jellyfin container with the updated environment variables.
---
## Volume Mount Info & Real-Time Jellyfin Logs
You can access Jellyfin's real-time logs by going to the **Workloads** widget and clicking on the logs icon on the bottom-right.
![Volume Mount Info Location](/images/docs/install-truenas-5.png)
If you didn't specify an external location to mount your config & cache directories, they will be automatically created somewhere on your system.
To see the current location of these (and other mounts to the container), click the folder icon on the bottom-right as well in the **Workloads** widget.
![Volume Mount Info Opened](/images/docs/install-truenas-6.png)
Once opened, you will see a list of all mounts and their paths.
You can use this info to navigate to them on your system shell.
Note that you will need root (sudo) access to reach Docker-related directories on SCALE.
## Managing Container Images
![App Settings Config Dropdown](/images/docs/install-truenas-7.png)
If you want to see the exact images installed on your TrueNAS SCALE server, go to the main Apps page, then click on the `Configuration` button.
On the dropdown menu, click on **Manage Container Images**.
You will be brought to a new page where you will see a list of all installed Docker images.
You can also pull new images to use in the future.
![Pull Image GUI](/images/docs/install-truenas-19.png)
You can choose to pull from Jellyfin's [Docker Hub](https://hub.docker.com/r/jellyfin/jellyfin) or [GitHub Container Registry](https://github.com/jellyfin/jellyfin/pkgs/container/jellyfin).
- To pull from Docker Hub, use: `jellyfin/jellyin`
- To pull from from GHCR, use: `ghcr.io/jellyfin/jellyfin`
- [You can check this blog post for more info about GHCR:](/posts/jellyfin-release-10.9.0#key-release-notesbreaking-changes)
- "Docker users: We now offer GitHub Container Registry (GHCR) as an alternative container registry in addition to Docker Hub. You can pull images from the new registry via URIs like `ghcr.io/jellyfin/jellyfin:latest`. Don't worry, we have no plans to drop Docker Hub as a container registry, but we feel providing both gives users more choice and flexibility."
- Also check out [this forum post](https://forum.jellyfin.org/t-new-jellyfin-server-web-release-10-9-6?pid=25895#pid25895) about how Docker image tags can be used.
If you have a container using any of your images, SCALE should notify you of an available update to the image through its GUI provided you used the **latest** tag, or one of the other tags that doesn't point to a single release.
## NVIDIA GPUs on SCALE (v24.10+)
- For users with an NVIDIA GPU, [read the v24.10 Electric Eel release notes regarding your GPU:](https://www.truenas.com/docs/scale/24.10/gettingstarted/scalereleasenotes/#upgrade-notes)
- `"Starting in 24.10, TrueNAS does not include a default NVIDIA GPU driver and instead provides a simple NVIDIA driver download option in the web interface. This allows for driver updates between TrueNAS release versions."`
- `"Users can enable driver installation from the Installed applications screen. Click Configure > Settings and select Install NVIDIA Drivers. This option is only available for users with a compatible NVIDIA GPU and no drivers installed or for users who have previously enabled the setting."`
+47 -39
View File
@@ -2,28 +2,41 @@
uid: installation-container
title: Container
description: Install as a container using Docker, Podman and others.
sidebar_position: 1
sidebar_position: 4
---
<!-- markdownlint-disable MD036 no-emphasis-as-heading -->
## Container images
Official container image: `jellyfin/jellyfin` <a href="https://hub.docker.com/r/jellyfin/jellyfin"><img alt="Docker Pull Count" src="https://img.shields.io/docker/pulls/jellyfin/jellyfin.svg" /></a>.
Official container image: `jellyfin/jellyfin` <a href="https://hub.docker.com/r/jellyfin/jellyfin"><img alt="jellyfin Docker Pull Count" src="https://img.shields.io/docker/pulls/jellyfin/jellyfin.svg" /></a>.
LinuxServer.io image: `linuxserver/jellyfin` <a href="https://hub.docker.com/r/linuxserver/jellyfin"><img alt="Docker Pull Count" src="https://img.shields.io/docker/pulls/linuxserver/jellyfin.svg" /></a>.
LinuxServer.io image: `linuxserver/jellyfin` <a href="https://hub.docker.com/r/linuxserver/jellyfin"><img alt="linuxserver jellyfin Docker Pull Count" src="https://img.shields.io/docker/pulls/linuxserver/jellyfin.svg" /></a>.
hotio image: `hotio/jellyfin` <a href="https://hub.docker.com/r/hotio/jellyfin"><img alt="Docker Pull Count" src="https://img.shields.io/docker/pulls/hotio/jellyfin.svg" /></a>.
hotio image: `hotio/jellyfin` <a href="https://hub.docker.com/r/hotio/jellyfin"><img alt="hotio jellyfin Docker Pull Count" src="https://img.shields.io/docker/pulls/hotio/jellyfin.svg" /></a>.
Jellyfin distributes [official container images on Docker Hub](https://hub.docker.com/r/jellyfin/jellyfin/) for multiple architectures.
These images are based on Debian and [built directly from the Jellyfin source code](https://github.com/jellyfin/jellyfin/blob/master/Dockerfile).
These images are based on Debian and [built directly from the Jellyfin source code](https://github.com/jellyfin/jellyfin-packaging/blob/master/docker/Dockerfile).
Additionally the [LinuxServer.io](https://www.linuxserver.io/) ([Dockerfile](https://github.com/linuxserver/docker-jellyfin/blob/master/Dockerfile)) project and [hotio](https://github.com/hotio) ([Dockerfile](https://github.com/hotio/jellyfin/blob/release/linux-amd64.Dockerfile)) distribute images based on Ubuntu and the official Jellyfin Ubuntu binary packages.
Additionally, there are several third parties providing unofficial container images, including the [LinuxServer.io](https://www.linuxserver.io/) ([Dockerfile](https://github.com/linuxserver/docker-jellyfin/blob/master/Dockerfile)) project and [hotio](https://github.com/hotio) ([Dockerfile](https://github.com/hotio/jellyfin/blob/release/linux-amd64.Dockerfile)), which offer images based on Ubuntu and the official Jellyfin Ubuntu binary packages.
## Docker
[Docker](https://www.docker.com/) allows you to run containers on Linux, Windows and MacOS.
:::warning
If you wish to use Windows or macOS, please install Jellyfin natively instead. [Windows](/docs/general/installation/windows) [macOS](/docs/general/installation/macos).
While it is possible to run Jellyfin in Docker on a Windows or macOS host, it is NOT supported. Some features are known to be broken when running in Docker on platforms other than Linux, Notably:
- Hardware Accelerated Transcoding
- [Scanning on macOS in Docker](https://github.com/jellyfin/jellyfin/issues/13093)
You WILL NOT receive any support for running Jellyfin in Docker on platforms other than Linux.
:::
The basic steps to create and run a Jellyfin container using Docker are as follows.
1. Follow the [official installation guide to install Docker](https://docs.docker.com/engine/install).
@@ -83,12 +96,23 @@ Multiple media libraries can be bind mounted if needed:
...etc
```
Custom [server-side system fonts](/docs/general/administration/configuration/#server-side-system-fonts) directory can be optionally bind mounted in order to use these fonts during transcoding with subtitle burn-in:
```sh
--mount type=bind,source=/path/to/fonts,target=/usr/local/share/fonts/custom,readonly
```
A directory of [fallback fonts](/docs/general/administration/configuration/#fallback-fonts) can be mounted as well. In this case, you will have to set the directory of fallback fonts to `/fallback_fonts` in Jellyfin server settings panel:
```sh
--mount type=bind,source=/path/to/fallback/fonts,target=/fallback_fonts,readonly
```
### Using Docker Compose
Create a `docker-compose.yml` file with the following contents. Add in the UID and GID that you would like to run jellyfin as in the user line below, or remove the user line to use the default (root).
```yml
version: '3.5'
services:
jellyfin:
image: jellyfin/jellyfin
@@ -98,15 +122,25 @@ services:
volumes:
- /path/to/config:/config
- /path/to/cache:/cache
- /path/to/media:/media
- /path/to/media2:/media2:ro
- type: bind
source: /path/to/media
target: /media
- type: bind
source: /path/to/media2
target: /media2
read_only: true
# Optional - extra fonts to be used during transcoding with subtitle burn-in
- type: bind
source: /path/to/fonts
target: /usr/local/share/fonts/custom
read_only: true
restart: 'unless-stopped'
# Optional - alternative address used for autodiscovery
environment:
- JELLYFIN_PublishedServerUrl=http://example.com
# Optional - may be necessary for docker healthcheck to pass if running in host network mode
extra_hosts:
- "host.docker.internal:host-gateway"
- 'host.docker.internal:host-gateway'
```
Then while in the same folder as the `docker-compose.yml` run:
@@ -231,9 +265,9 @@ As always it is recommended to run the container rootless. Therefore we want to
### With hardware acceleration
To use hardware acceleration, you need to allow the container to access the render device. If you are using container-selinux-2.226 or later, you have to set the `container_use_dri_device` flag in selinux or the container will not be able to use it:
To use hardware acceleration, you need to allow the container to access the render device. If you are using container-selinux-2.226 or later, you have to set the `container_use_dri_devices` flag in selinux or the container will not be able to use it:
`sudo setsebool -P container_use_dri_device 1`
`sudo setsebool -P container_use_dri_devices 1`
On older versions of container-selinux, you have to disable the selinux confinement for the container by adding `--security-opt label=disable` to the podman command.
@@ -262,7 +296,7 @@ Finally, you need to set the `--device` flag for the container to use the render
--volume jellyfin-config:/config:Z \
--mount type=bind,source=/path/to/media,destination=/media,ro=true,relabel=private \
docker.io/jellyfin/jellyfin:latest
```
```
#### systemd
@@ -289,29 +323,3 @@ SuccessExitStatus=0 143
# Start by default on boot
WantedBy=default.target
```
## TrueNAS SCALE / TrueCharts
Jellyfin is available as a [TrueNAS SCALE](https://www.truenas.org/) App inside the [TrueCharts](https://www.truecharts.org/) App Catalog with direct integration into the GUI, no CLI needed. Direct support is available on the [TrueCharts Discord](https://discord.gg/tVsPTHWTtr) and the source code is available on [GitHub](https://github.com/truecharts/charts).
1. Install the TrueCharts Catalog to TrueNAS SCALE, see [website](https://truecharts.org/manual/SCALE/guides/getting-started/#adding-truecharts) for more info.
1. Go to Apps page from the top level SCALE menu
2. Select Manage Catalogs tab on the Apps page
3. Click Add Catalog
4. After reading the iXsystems notice, click Continue and enter the required information:
Name: truecharts
Repository: `https://github.com/truecharts/catalog`
Preferred Trains: `enterprise` and `stable`
Branch: main
5. Click Save and allow SCALE to refresh its catalog with TrueCharts (this may take a few minutes)
2. Click `Available Applications` and search for `Jellyfin`
3. Click `Install`, which will take you to the GUI Wizard and you'll be able to fill out the necessary info
- Server URL to publish in UDP Auto Discovery response.
- Networking, Ingress (Reverse Proxy), Security Options
- Adding Storage (for media folders) is also a standalone guide available in the [TrueCharts documentation](https://truecharts.org/manual/SCALE/guides/add-storage/). For Jellyfin the recommendation is to add storage as `Additional App Storage`
4. Click Save and once it's up and running you'll be able to click Open to access `Jellyfin`.
+9 -3
View File
@@ -16,6 +16,12 @@ Even though there are builds available online for these platforms, they are unof
For info on selecting hardware for a Jellyfin server, please refer to the [Hardware Selection Guide](/docs/general/administration/hardware-selection)
import DocCardList from '@theme/DocCardList';
<DocCardList />
- [Windows](/docs/general/installation/windows)
- [macOS](/docs/general/installation/macos)
- [Debian / Ubuntu](/docs/general/installation/linux#debian--ubuntu-and-derivatives)
- [Other Linux Distributions](/docs/general/installation/linux#other-distributions)
- [Docker / Kubernetes / Podman](/docs/general/installation/container)
- [Synology](/docs/general/installation/advanced/synology)
- [TrueNAS SCALE](/docs/general/installation/advanced/truenas)
- [Generic Linux](/docs/general/installation/advanced/manual#portable-linux-install)
- [Building from source](/docs/general/installation/advanced/source).
+7 -400
View File
@@ -1,123 +1,13 @@
---
uid: installation-linux
title: Linux
description: Install on Linux.
sidebar_position: 2
description: Installing on Linux.
sidebar_position: 3
---
## Alpine Linux
## Debian / Ubuntu and derivatives
Jellyfin can be found in the `community` repository as
[`jellyfin`](https://pkgs.alpinelinux.org/package/edge/community/x86_64/jellyfin) and
[`jellyfin-web`](https://pkgs.alpinelinux.org/package/edge/community/x86_64/jellyfin-web).
To enable the web UI after installing `jellyfin-web`, make sure to remove the `--nowebclient` option from
`/etc/conf.d/jellyfin`.
## Arch Linux
The `Extra` repository contains builds for both [`jellyfin-server`](https://archlinux.org/packages/?name=jellyfin-server) and [`jellyfin-web`](https://archlinux.org/packages/?name=jellyfin-web).
`jellyfin-server` includes a hard dependency on [`jellyfin-ffmpeg`](https://archlinux.org/packages/?name=jellyfin-ffmpeg).
Both packages, server and web, can also be built from source at the tip of the master branch using [`jellyfin-git`](https://aur.archlinux.org/packages/jellyfin-git/).
The AUR also offers each separately at [`jellyfin-server-git`](https://aur.archlinux.org/packages/jellyfin-server-git/) and [`jellyfin-web-git`](https://aur.archlinux.org/packages/jellyfin-web-git/).
## Fedora
Fedora builds in RPM package format are available [in the main download repository](https://repo.jellyfin.org/releases/server/). We do not yet have an official Fedora repository, but one is planned for the future.
However [`rpmfusion`](https://rpmfusion.org/) provides both `jellyfin-server` and `jellyfin-web` for Fedora version `38` and above.
### RPM Fusion
1. `rpmfusion` must be enabled first
```sh
sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
```
2. Install the `jellyfin` package, which will automatically install `jellyfin-server`, `jellyfin-web` and `jellyfin-firewalld`
```sh
sudo dnf install jellyfin
```
3. Enable and start the Jellyfin service:
```sh
sudo systemctl enable --now jellyfin
```
### Manual installation via the .rpm packages
1. You will need to enable `rpmfusion`, as `ffmpeg` is a dependency of the `jellyfin` server package
```sh
sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
```
:::note
You do not need to manually install `ffmpeg`; it will be installed by the Jellyfin server package as a dependency.
:::
2. Install the Jellyfin server
```sh
sudo dnf install <link to server `.rpm` file URL>
```
3. Install the Jellyfin web interface
```sh
sudo dnf install <link to web `.rpm` file URL>
```
4. Enable and start the Jellyfin service:
```sh
sudo systemctl enable --now jellyfin
```
5. Allow Jellyfin through the firewall:
```sh
sudo firewall-cmd --permanent --add-service=jellyfin
```
:::note
This will open the following ports:
* `8096 TCP`, used by default for HTTP traffic; you can change this in the dashboard
* `8920 TCP`, used by default for HTTPS traffic; you can change this in the dashboard
* `1900 UDP`, used for service auto-discovery; this is not configurable
* `7359 UDP`, used for auto-discovery; this is not configurable
:::
6. Go to `localhost:8096` or `ip-address-of-jellyfin-server:8096` to finish setup in the web UI
## CentOS
CentOS/RHEL 7 builds in RPM package format are available [in the main download repository](https://repo.jellyfin.org/releases/server/). We do not yet have an official CentOS/RHEL repository, but one is planned for the future.
The default CentOS/RHEL repositories don't provide FFmpeg, which the RPM requires.
You will need to add a third-party repository which provide FFmpeg, such as [RPM Fusion's Free repository](https://rpmfusion.org/Configuration).
You can also build [Jellyfin's version](https://github.com/jellyfin/jellyfin-ffmpeg) on your own.
This includes gathering the dependencies and compiling and installing them.
Instructions can be found at [the FFmpeg wiki](https://trac.ffmpeg.org/wiki/CompilationGuide/Centos).
The general process should follow the above Fedora instructions.
## Debuntu (Debian, Ubuntu, and derivatives using `apt`)
The Jellyfin team provides 3rd-party Debian and Ubuntu repositories, to help ensure your Jellyfin install is always kept up-to-date.
### Repository (Automatic)
To simplify deployment and help automate this for as many users as possible, we provide a BASH script to handle repo installation as well as installing Jellyfin.
To simplify deployment and help automate this for as many users as possible, we provide a BASH script to handle repo installation as well as installing Jellyfin on Debian / Ubuntu and derivatives.
All you need to do is run this command on your system (requires `curl`, or subsitute `curl` with `wget -O-`):
```sh
@@ -143,293 +33,10 @@ sudo bash install-debuntu.sh
:::note
The script tries to handle as many common derivatives as possible, including, at least, Linux Mint (Ubuntu and Debian editions), Raspbian/Raspberry Pi OS, and KDE Neon. We welcome PRs [to the script](https://github.com/jellyfin/jellyfin-metapackages/blob/master/install-debuntu.sh#L52) for any other common derivatives, or you can use the steps below instead.
The script tries to handle as many common derivatives as possible, including, at least, Linux Mint (Ubuntu and Debian editions), Raspbian/Raspberry Pi OS, and KDE Neon. We welcome PRs [to the script](https://github.com/jellyfin/jellyfin-repo-helper-scripts/blob/master/install-debuntu.sh) for any other common derivatives.
:::
### Repository (Manual)
## Other Distributions
If you would prefer to install everything manually, the full steps are as follows:
1. Install `curl` and `gnupg` if you haven't already:
```sh
sudo apt install curl gnupg
```
2. On Ubuntu (and derivatives) only, enable the Universe repository to obtain all the FFmpeg dependencies:
```sh
sudo add-apt-repository universe
```
:::note
If the above command fails you will need to install the following package `software-properties-common`.
This can be achieved with the following command `sudo apt-get install software-properties-common`
:::
On Debian, you can also enable the `non-free` components of your base repositories for additional FFmpeg dependencies, but this is optional.
3. Download the GPG signing key (signed by the Jellyfin Team) and install it:
```sh
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/jellyfin.gpg
```
4. Add a repository configuration at `/etc/apt/sources.list.d/jellyfin.sources`:
```sh
export VERSION_OS="$( awk -F'=' '/^ID=/{ print $NF }' /etc/os-release )"
export VERSION_CODENAME="$( awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release )"
export DPKG_ARCHITECTURE="$( dpkg --print-architecture )"
cat <<EOF | sudo tee /etc/apt/sources.list.d/jellyfin.sources
Types: deb
URIs: https://repo.jellyfin.org/${VERSION_OS}
Suites: ${VERSION_CODENAME}
Components: main
Architectures: ${DPKG_ARCHITECTURE}
Signed-By: /etc/apt/keyrings/jellyfin.gpg
EOF
```
:::note
The supported values for the above variables are:
* `${VERSION_OS}`: One of `debian` or `ubuntu`; if it is not, use the closest one for your distribution.
* `${VERSION_CODENAME}`: One of our supported [Debian](https://github.com/jellyfin/jellyfin-metapackages/blob/master/install-debuntu.sh#L7) or [Ubuntu](https://github.com/jellyfin/jellyfin-metapackages/blob/master/install-debuntu.sh#L8) release codenames. These can change as new releases come out and old releases are dropped, so check the script to be sure yours is supported.
* `${DPKG_ARCHITECTURE}`: One of our [supported architectures](https://github.com/jellyfin/jellyfin-metapackages/blob/master/install-debuntu.sh#L6). Microsoft does not provide a .NET for 32-bit x86 Linux systems, and hence Jellyfin is **not** supported on the `i386` architecture.
:::
5. Update your APT repositories:
```sh
sudo apt update
```
6. Install the Jellyfin metapackage, which will automatically fetch the various sub-packages:
```sh
sudo apt install jellyfin
```
:::note
If you want to be explicit, instead of the metapackage, you can install the sub-packages individually:
```sh
sudo apt install jellyfin-server jellyfin-web
```
The `jellyfin-server` package will automatically select the right `jellyfin-ffmpeg` package for you as well.
:::
7. Manage the Jellyfin system service:
```sh
sudo systemctl {action} jellyfin
sudo service jellyfin {action}
```
### `.deb` Packages (Very Manual)
Raw `.deb` packages, including old versions, source packages, and `dpkg` meta files, are available [in the main download repository](https://repo.jellyfin.org/releases/server/).
:::note
The repository is the preferred way to obtain Jellyfin on Debian and Ubuntu systems, as this ensures you get automatic updates and that all dependencies are properly resolved. Use these steps only if you really know what you're doing.
:::
1. On Ubuntu (and derivatives) only, enable the Universe repository to obtain all the FFmpeg dependencies:
```sh
sudo add-apt-repository universe
```
:::note
If the above command fails you will need to install the following package `software-properties-common`.
This can be achieved with the following command `sudo apt-get install software-properties-common`
:::
On Debian, you can also enable the `non-free` components of your base repositories for additional FFmpeg dependencies, but this is optional.
2. Download the desired `jellyfin-server`, `jellyfin-web`, and `jellyfin-ffmpeg` `.deb` packages from the repository; `jellyfin` is a metapackage and is not required.
3. Install the downloaded `.deb` packages:
```sh
sudo dpkg -i jellyfin_*.deb jellyfin-ffmpeg_*.deb
```
:::note
This step may throw errors; continue to the next step to resolve them.
:::
4. Use `apt` to install any missing dependencies:
```sh
sudo apt -f install
```
5. Manage the Jellyfin system service:
```sh
sudo systemctl {action} jellyfin
sudo service jellyfin {action}
```
## Gentoo
The Gentoo ebuild repository includes the Jellyfin package which can be installed like other software:
```sh
emerge www-apps/jellyfin
```
## Linux (generic amd64)
Generic `amd64`, `arm64`, and `armhf` Linux builds in TAR archive format are available [in the main download repository](https://repo.jellyfin.org/releases/server/).
### Base Installation Process
Create a directory in `/opt` for jellyfin and its files, and enter that directory.
```sh
sudo mkdir /opt/jellyfin
cd /opt/jellyfin
```
Download the latest generic Linux build for your architecture.
The rest of these instructions assume version 10.8.13 is being installed (i.e. `jellyfin_10.8.13_amd64.tar.gz`).
Download the generic build, then extract the archive:
```sh
sudo wget https://repo.jellyfin.org/releases/server/linux/stable/combined/jellyfin_10.8.13_amd64.tar.gz
sudo tar xvzf jellyfin_10.8.13_amd64.tar.gz
```
Create a symbolic link to the Jellyfin 10.8.13 directory.
This allows an upgrade by repeating the above steps and enabling it by simply re-creating the symbolic link to the new version.
```sh
sudo ln -s jellyfin_10.8.13 jellyfin
```
Create four sub-directories for Jellyfin data.
```sh
sudo mkdir data cache config log
```
### `FFmpeg` Installation
If you are not running a Debian derivative, install `ffmpeg` through your OS's package manager, and skip this section.
:::caution
Not being able to use `jellyfin-ffmpeg` will most likely break hardware acceleration and tonemapping.
:::
If you are running Debian or a derivative, you should [download](https://repo.jellyfin.org/releases/server/debian/versions/jellyfin-ffmpeg/) and install a `ffmpeg` release built specifically for Jellyfin.
Be sure to download the latest release that matches your OS (`5.1.3-2` for Debian Bookworm assumed below).
```sh
sudo wget https://repo.jellyfin.org/releases/server/debian/versions/jellyfin-ffmpeg/5.1.3-2/jellyfin-ffmpeg5_5.1.3-2-bookworm_amd64.deb
sudo dpkg --install jellyfin-ffmpeg5_5.1.3-2-bookworm_amd64.deb
```
If you run into any dependency errors, run this and it will install them and `jellyfin-ffmpeg`.
```sh
sudo apt install -f
```
### Running Jellyfin
Due to the number of command line options that must be passed on to the Jellyfin binary, it is easiest to create a small script to run Jellyfin.
```sh
sudo nano jellyfin.sh
```
Then paste the following commands and modify as needed.
```sh
#!/bin/bash
JELLYFINDIR="/opt/jellyfin"
FFMPEGDIR="/usr/share/jellyfin-ffmpeg"
$JELLYFINDIR/jellyfin/jellyfin \
-d $JELLYFINDIR/data \
-C $JELLYFINDIR/cache \
-c $JELLYFINDIR/config \
-l $JELLYFINDIR/log \
--ffmpeg $FFMPEGDIR/ffmpeg
```
Assuming you desire Jellyfin to run as a non-root user, `chmod` all files and directories to your normal login user and group.
Also make the startup script above executable.
```sh
sudo chown -R user:group *
sudo chmod u+x jellyfin.sh
```
Finally you can run it.
You will see lots of log information when run, this is normal.
Setup is as usual in the web browser.
```sh
./jellyfin.sh
```
#### Starting Jellyfin on boot (optional)
Create a `systemd` unit file.
```sh
cd /etc/systemd/system
sudo nano jellyfin.service
```
Then paste the following contents, replacing `youruser` with your username.
```ini
[Unit]
Description=Jellyfin
After=network.target
[Service]
Type=simple
User=youruser
Restart=always
ExecStart=/opt/jellyfin/jellyfin.sh
[Install]
WantedBy=multi-user.target
```
Apply the correct permissions to the file, enable the service to start on boot, then start it.
```sh
sudo chmod 644 jellyfin.service
sudo systemctl daemon-reload
sudo systemctl enable jellyfin.service
sudo systemctl start jellyfin.service
```
## Portable DLL
Platform-agnostic .NET Core DLL builds in TAR archive format are available [here](/downloads#portable).
These builds use the binary `jellyfin.dll` and must be loaded with `dotnet`.
For other distributions, [containers](/docs/general/installation/container) are the recommended way to install Jellyfin. There are also [community-maintained packages](/docs/general/installation/advanced/community) provided by 3rd parties if you would like to use them instead.
+9 -66
View File
@@ -1,82 +1,25 @@
---
uid: installation-macos
title: MacOS
description: Install on MacOS.
sidebar_position: 5
title: macOS
description: Installing on macOS.
sidebar_position: 2
---
<!-- markdownlint-disable MD036 no-emphasis-as-heading -->
## Installing on macOS
# Install on MacOS
macOS Application packages and builds in TAR archive format are available [here](/downloads/macos).
:::note
Jellyfin requires macOS 10.15 or newer to run.
:::
**Install**
1. Download the latest version.
1. Download the latest version DMG image from [the downloads page](/downloads/macos). For Apple Silicon Macs below macOS 14, please update to a newer version of macOS or download the x86 release.
2. Drag the `.app` package into the Applications folder.
3. Start the application.
4. Click the icon in the menu bar and select "Launch Web UI".
4. Click the icon in the menu bar and select "Launch".
**Upgrade**
## Updating on macOS
1. Download the latest version.
1. Download the latest version DMG image from [the downloads page](/downloads/macos).
2. Stop the currently running server either via the dashboard or using the menu bar icon.
3. Drag the new `.app` package into the Applications folder and click yes to replace the files.
4. Start the application.
**Uninstall**
## Uninstalling on macOS
1. Stop the currently running server either via the dashboard or using the application icon.
2. Move the `.app` package to the trash.
**Deleting Configuration**
This will delete all settings and user information. This applies for the .app package and the portable version.
1. Delete the folder `~/.config/jellyfin/`
2. Delete the folder `~/.local/share/jellyfin/`
**Portable Version**
1. Install the `.NET Runtime` and `ASP.NET Core Runtime` version 6.0. This can also be accomplished by installing the `.NET SDK` which includes both of these runtimes. Links to the official download page can be found [here](https://dotnet.microsoft.com/en-us/download/dotnet/6.0). Ensure you add the installation directory to your `PATH` variable.
2. Download the latest version of Jellyfin.
3. Extract it into the Applications folder.
4. Open Terminal and type `cd` followed with a space then drag the jellyfin folder into the terminal.
5. Type `dotnet jellyfin.dll` to run jellyfin.
6. Open your browser at [http://localhost:8096](http://localhost:8096).
Closing the terminal window will end Jellyfin. Running Jellyfin in screen or tmux can prevent this from happening.
**Upgrading the Portable Version**
1. Download the latest version.
1. Stop the currently running server either via the dashboard or using `CTRL+C` in the terminal window.
1. Extract the latest version into Applications
1. Open Terminal and type `cd` followed with a space then drag the jellyfin folder into the terminal.
1. Type `./jellyfin` to run jellyfin.
1. Open your browser at [http://localhost:8096](http://localhost:8096)
**Uninstalling the Portable Version**
1. Stop the currently running server either via the dashboard or using `CTRL+C` in the terminal window.
1. Move `/Application/jellyfin-version` folder to the Trash. Replace version with the actual version number you are trying to delete.
**Using FFmpeg with the Portable Version**
The portable version doesn't come with FFmpeg by default, so to install FFmpeg you have three options.
- use the package manager homebrew by typing `brew install ffmpeg` into your Terminal ([here's how to install homebrew if you don't have it already](https://treehouse.github.io/installation-guides/mac/homebrew)
- download the most recent static build from [this link](https://evermeet.cx/ffmpeg/get/zip) (compiled by a third party see [this page](https://evermeet.cx/ffmpeg/) for options and information), or
- compile from source available from the official [website](https://ffmpeg.org/download.html)
More detailed download options, documentation, and signatures can be found.
If using static build, extract it to the `/Applications/` folder.
Navigate to the Playback tab in the Dashboard and set the path to FFmpeg under FFmpeg Path.
+9 -77
View File
@@ -1,97 +1,29 @@
---
uid: installation-windows
title: Windows
description: Install on Windows.
sidebar_position: 3
description: Installing on Windows.
sidebar_position: 1
---
<!-- markdownlint-disable MD036 no-emphasis-as-heading -->
Windows installers and builds in ZIP archive format are available [here](/downloads/windows).
## Installing on Windows
:::caution
If you installed a version prior to 10.4.0 using a PowerShell script, you will need to manually remove the service using the command `nssm remove Jellyfin` and uninstall the server by remove all the files manually.
Also one might need to move the data files to the correct location, or point the installer at the old location.
:::
:::caution
The Basic Install is the recommended way to run the Jellyfin Server.
Using the Advanced/Service mode may experience FFmpeg hardware acceleration issues and is only for advanced users.
:::
## Install using installer
**Install**
1. Download the latest version.
1. Download the latest version installer from [the downloads page](/downloads/windows).
2. Run the installer.
3. (Optional) When installing as a service (not recommended), pick the service account type.
4. If everything was completed successfully, Jellyfin is now running.
5. Open your browser at [http://your_local_IP_address:8096](http://your_local_IP_address:8096) to finish setting up Jellyfin.
**Update**
## Updating on Windows
1. Download the latest version.
2. Close or Stop Jellyfin if it is running.
1. Download the latest version installer from [the downloads page](/downloads/windows).
2. Close or Stop Jellyfin from the tray app if it is running.
3. Run the installer.
4. If everything was completed successfully, the new version is installed.
**Uninstall**
## Uninstalling on Windows
1. Go to `Add or remove programs` in Windows.
1. Go to [Add or remove programs](https://support.microsoft.com/en-us/windows/uninstall-or-remove-apps-and-programs-in-windows-4b55f974-2cc6-2d2b-d092-5905080eaf98) in Windows settings.
2. Search for Jellyfin.
3. Click Uninstall.
## Install manually (portable)
**Install**
1. Download and extract the latest version.
2. Create a folder `jellyfin` at your preferred install location.
3. Copy the extracted folder into the `jellyfin` folder and rename it to `system`.
4. Create `jellyfin.bat` within your `jellyfin` folder containing:
- To use the default library/data location at `%localappdata%`:
```cmd
<--Your install path-->\jellyfin\system\jellyfin.exe
```
- To use a custom library/data location (Path after the -d parameter):
```cmd
<--Your install path-->\jellyfin\system\jellyfin.exe -d <--Your install path-->\jellyfin\data
```
- To use a custom library/data location (Path after the -d parameter) and disable the auto-start of the webapp:
```cmd
<--Your install path-->\jellyfin\system\jellyfin.exe -d <--Your install path-->\jellyfin\data -noautorunwebapp
```
5. Run
```cmd
jellyfin.bat
```
6. Open your browser at `http://<--Server-IP-->:8096`.
**Update**
1. Stop Jellyfin
2. Rename the Jellyfin `system` folder to `system-bak`
3. Download and extract the latest Jellyfin version
4. Copy the extracted folder into the `jellyfin` folder and rename it to `system`
5. Run `jellyfin.bat` to start the server again
**Rollback**
1. Stop Jellyfin.
2. Delete the `system` folder.
3. Rename `system-bak` to `system`.
4. Run `jellyfin.bat` to start the server again.
-1
View File
@@ -1 +0,0 @@
position: 5
-37
View File
@@ -1,37 +0,0 @@
---
uid: network-dlna
title: DLNA
---
## DLNA
DLNA is based on uPnP.
DLNA will send a broadcast signal from Jellyfin.
This broadcast is limited to Jellyfin's current subnet.
If you are using docker, the network should use Host Mode, otherwise the broadcast signal will only be sent in the bridged network inside of docker.
If DLNA fails to bind properly, the message `[ERR] Failed to bind to port 1900: "Address already in use". DLNA will be unavailable` should appear in the logs.
Setting `Alive message interval (seconds)` to 30 seconds also appears to help discovery for some clients.
If a base URL is set, try removing it and restarting the server.
### DLNA Logging
Use these entries in `logging.default.json` to turn on DLNA debug logs.
```json
{
"Serilog": {
"MinimumLevel": {
"Default": "Warning",
"Override": {
"Microsoft": "Warning",
"System": "Warning",
"Emby.Dlna": "Debug",
"Emby.Dlna.Eventing": "Debug"
}
}
}
}
```
-88
View File
@@ -1,88 +0,0 @@
---
uid: network-fail2ban
title: fail2ban
---
## Fail2ban
[Fail2ban](https://github.com/fail2ban/fail2ban) is an intrusion prevention software framework that protects computer servers from brute-force attacks.
Fail2ban operates by monitoring log files (e.g. /var/log/auth.log, /var/log/apache/access.log, etc.) for selected entries and running scripts based on their content.
Jellyfin produces logs that can be monitored by Fail2ban to prevent brute-force attacks on your machine.
### Requirements
- Jellyfin remotely accessible
- Fail2ban installed and running
- Knowing where the logs for Jellyfin are stored: by default `/var/log/jellyfin/` for desktop and `/config/log/` for docker containers.
### Step one: create the jail
You need to create a jail for Fail2ban. If you're on Ubuntu and use nano as editor, run:
```bash
sudo nano /etc/fail2ban/jail.d/jellyfin.local
```
Add this to the new file, replacing `/path_to_logs` with the path to the log files above, e.g. `/var/log/jellyfin/`:
```bash
[jellyfin]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = jellyfin
maxretry = 3
bantime = 86400
findtime = 43200
logpath = /path_to_logs/jellyfin*.log
```
Save and exit nano.
Note:
1. If Jellyfin is running in a docker container, add the following to the `jellyfin.local` file:
```bash
action = iptables-allports[name=jellyfin, chain=DOCKER-USER]
```
2. If you're running Jellyfin on a non-standard port, then change the port from `80,443` to the relevant port say `8096,8920`
### Step two: create the filter
The filter contains a set of rules which Fail2ban will use to identify a failed authentication attempt. Create the filter by running:
```bash
sudo nano /etc/fail2ban/filter.d/jellyfin.conf
```
Paste:
```bash
[Definition]
failregex = ^.*Authentication request for .* has been denied \(IP: "<ADDR>"\)\.
```
Save and exit, then reload Fail2ban:
```bash
sudo systemctl restart fail2ban
```
Check fail2ban is running:
```bash
sudo systemctl status fail2ban
```
### Step three: test
Assuming you've at least one failed authentication attempt, you can test this new jail with `fail2ban-regex`:
```bash
sudo fail2ban-regex /path_to_logs/*.log /etc/fail2ban/filter.d/jellyfin.conf --print-all-matched
```
-122
View File
@@ -1,122 +0,0 @@
---
uid: network-reverse-proxy-iis
title: IIS
---
## IIS
"[Internet Information Services](https://www.iis.net) is an extensible web server software created by Microsoft for use with the Windows NT family. IIS supports HTTP, HTTP/2, HTTPS, FTP, FTPS, SMTP and NNTP. It has been an integral part of the Windows NT family since Windows NT 4.0" - [Wikipedia](https://en.wikipedia.org/wiki/Internet_Information_Services)
## Requirements
IIS with default selections + Application Development->WebSocket Protocol (minimal)
[URL Rewrite 2.1](https://www.iis.net/downloads/microsoft/url-rewrite)
[Application Request Routing 3.0](https://www.iis.net/downloads/microsoft/application-request-routing)
## Configure
```powershell
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/proxy" -name "enabled" -value "True"
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/proxy/cache" -name "enabled" -value "False"
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/proxy" -name "httpVersion" -value "Http11"
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/proxy" -name "preserveHostHeader" -value "True"
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/rewrite/allowedServerVariables" -name "." -value @{name='HTTP_X_FORWARDED_PROTOCOL'}
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/rewrite/allowedServerVariables" -name "." -value @{name='HTTP_X_FORWARDED_PROTO'}
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/rewrite/allowedServerVariables" -name "." -value @{name='HTTP_X_REAL_IP'}
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/rewrite/allowedServerVariables" -name "." -value @{name='HTTP_X_FORWARDED_HOST'}
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/rewrite/allowedServerVariables" -name "." -value @{name='HTTP_X_FORWARDED_PORT'}
```
## web.config
```config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<clear />
<rule name="Redirect to https" enabled="false" stopProcessing="true">
<match url=".*" negate="false" />
<conditions logicalGrouping="MatchAny" trackAllCaptures="false">
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Found" />
</rule><!-- These rules add X-Forwarded-Protocol -->
<rule name="ForwardedHttps">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTPS}" pattern="On" />
</conditions>
<serverVariables>
<set name="HTTP_X_FORWARDED_PROTOCOL" value="https" />
<set name="HTTP_X_FORWARDED_PROTO" value="https" />
</serverVariables>
</rule>
<rule name="ForwardedHttp">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTPS}" pattern="Off" />
</conditions>
<serverVariables>
<set name="HTTP_X_FORWARDED_PROTOCOL" value="http" />
<set name="HTTP_X_FORWARDED_PROTO" value="http" />
</serverVariables>
</rule><!-- prevent JF back button bug + redirect / to /web/ -->
<rule name="Redirect" stopProcessing="true">
<match url="^(web)?$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="Redirect" url="web/" redirectType="Found" />
</rule><!-- Rewrite web/ to web/index.html, similar trick used on nginx, makes urls much cleaner -->
<rule name="web">
<match url="^web/$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="Rewrite" url="web/index.html" />
</rule><!-- proxy to Jellyfin -->
<rule name="Proxy">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="/{R:0}" pattern=".well-known" negate="true" />
</conditions>
<serverVariables>
<set name="HTTP_X_REAL_IP" value="{REMOTE_ADDR}" />
<set name="HTTP_X_FORWARDED_HOST" value="{HTTP_HOST}" />
<set name="HTTP_X_FORWARDED_PORT" value="{SERVER_PORT}" />
</serverVariables>
<action type="Rewrite" url="http://localhost:8096/{R:0}" logRewrittenUrl="true" />
</rule>
</rules>
<outboundRules><!-- Add Cache -->
<rule name="Add Cache" preCondition="images" enabled="true" patternSyntax="ECMAScript">
<match serverVariable="RESPONSE_Cache_Control" pattern="(.*)" />
<action type="Rewrite" value="max-age=604800" />
</rule>
<preConditions><!-- Pre-Condition for images -->
<preCondition name="images" logicalGrouping="MatchAny">
<add input="{REQUEST_URI}" pattern="Items/.+/Images/.*" />
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^image/.+" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
<caching enabled="false" enableKernelCache="false" />
<httpProtocol>
<customHeaders>
<clear />
<add name="X-XSS-Protection" value="0" />
<add name="X-Content-Type-Options" value="nosniff" />
<add name="Cache-Control" value="no-cache" />
<add name="X-Frame-Options" value="SAMEORIGIN" />
<add name="X-Robots-Tag" value="noindex, nofollow" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
```
## SSL
[CertifytheWeb](https://certifytheweb.com/); a very easy to use UI for getting certificates
-152
View File
@@ -1,152 +0,0 @@
---
uid: network-index
title: Networking
---
# Networking
This section describes how to get basic connectivity to a Jellyfin server, and also some more advanced networking scenarios.
## Connectivity
Many clients will automatically discover servers running on the same LAN and display them on login. If you are outside the network when you connect you can type in the complete IP address or domain name in the server field with the correct port to continue to the login page. You can find the default ports below to access the web frontend.
HTTP and HTTPS are the primary means of connecting to the server. If using a self-signed certificate for HTTPS, some clients may not work such as Chromecast or Roku.
:::caution
In order for Chromecast to work on a non-public routable connection, 8.8.8.8 must be blocked on the Chromecast's Gateway. Blocking 8.8.8.8 on your router is the easiest solution to this problem.
:::
### Port Bindings
This document aims to provide an administrator with knowledge on what ports Jellyfin binds to and what purpose they serve.
#### Static Ports
- 8096/tcp is used by default for HTTP traffic. You can change this in the dashboard.
- 8920/tcp is used by default for HTTPS traffic. You can change this in the dashboard.
- 1900/udp is used for service auto-discovery. This is not configurable.
- 7359/udp is also used for auto-discovery. This is not configurable.
**HTTP Traffic:** 8096
The web frontend can be accessed here for debugging SSL certificate issues on your local network. You can modify this setting from the **Networking** page in the settings.
**HTTPS Traffic:** 8920
This setting can also be modified from the **Networking** page to use a different port.
**Service Discovery:** 1900
Since client auto-discover would break if this option were configurable, you cannot change this in the settings at this time. DLNA also uses this port and is required to be in the local subnet.
**Client Discovery:** 7359 UDP
Allows clients to discover Jellyfin on the local network. A broadcast message to this port with `Who is JellyfinServer?` will get a JSON response that includes the server address, ID, and name.
#### Dynamic Ports
Live TV devices will often use a random UDP port for HDHomeRun devices. The server will select an unused port on startup to connect to these tuner devices.
### Monitoring Endpoints
See [monitoring](/docs/general/networking/monitoring) for details on the monitoring endpoints that Jellyfin provides.
## Self-Signed Certificate
[See here for more information.](https://www.sslshopper.com/article-most-common-openssl-commands.html)
Create a private key.
```sh
openssl req -x509 -newkey rsa:4096 -keyout ./privkey.pem -out cert.pem -days 365 -nodes -subj '/CN=jellyfin.lan'
```
Omit `-nodes` to set a password interactively.
Remove `-days 365` to make it 'permanent'.
Add `-subj '/CN=localhost'` to make it not ask interactive questions about content of certificate.
The above command creates `./privkey.pem` which will require one more step before use in Jellyfin.
```sh
openssl pkcs12 -export -out jellyfin.pfx -inkey privkey.pem -in /usr/local/etc/letsencrypt/live/domain.org/cert.pem -passout pass:
```
## Running Jellyfin Behind a Reverse Proxy
It's possible to run Jellyfin behind another server acting as a reverse proxy. With a reverse proxy setup, this server handles all network traffic and proxies it back to Jellyfin. This provides the benefits of using DNS names and not having to remember port numbers, as well as easier integration and management of SSL certificates.
In cases when you would like to not use host networking with docker, you may use the gateway ip as a known proxy to fix ip resolution for clients logging in.
:::caution
In order for a reverse proxy to have the maximum benefit, you should have a publicly routable IP address and a domain with DNS set up correctly.
These examples assume you want to run Jellyfin under a sub-domain (e.g. jellyfin.example.com), but are easily adapted for the root domain if desired.
:::
:::caution
Be careful when logging requests with your reverse proxy. Jellyfin sometimes sends authentication information as part of the URL (e.g `api_key` parameter), so logging the full request path can expose secrets to your logfile.
We recommend that you either protect your logfiles or do not log full request URLs or censor sensitive data from the logfile.
The nginx documentation below includes an example how to censor sensitive information from a logfile.
:::
Some popular options for reverse proxy systems are [Apache](https://httpd.apache.org), [Caddy](https://caddyserver.com), [Haproxy](https://www.haproxy.com), [Nginx](https://www.nginx.com) and [Traefik](https://traefik.io).
- [Apache](/docs/general/networking/apache)
- [Caddy](/docs/general/networking/caddy)
- [HAProxy](/docs/general/networking/haproxy)
- [Nginx](/docs/general/networking/nginx)
- [Traefik](/docs/general/networking/traefik)
While not a reverse proxy, Let's Encrypt can be used independently or with a reverse proxy to provide SSL certificates.
- [Let's Encrypt](/docs/general/networking/letsencrypt)
When following this guide, be sure to replace the following variables with your information.
- `DOMAIN_NAME`: Your public domain name to access Jellyfin on (e.g. jellyfin.example.com)
- `example.com`: The domain name Jellyfin services will run under (e.g. example.com)
- `SERVER_IP_ADDRESS`: The IP address of your Jellyfin server (if the reverse proxy is on the same server use 127.0.0.1)
In addition, the examples are configured for use with Let's Encrypt certificates. If you have a certificate from another source, change the SSL configuration from `/etc/letsencrypt/DOMAIN_NAME/` to the location of your certificate and key.
Ports 80 and 443 (pointing to the proxy server) need to be opened on your router and firewall.
### Known Proxies
Add the IP address/hostname of your reverse proxy to the `Known Proxies` (under Admin Dashboard -> Networking). This is a comma separated list of IP addresses/hostnames of known proxies used when connecting to your Jellyfin instance and is required to make proper use of X-Forwarded-For headers. Requires a server restart after saving.
### Base URL
Running Jellyfin with a path (e.g. `https://example.com/jellyfin`) is supported by the Android and web clients.
:::caution
Base URL is known to break HDHomeRun, DLNA, Sonarr, Radarr, Chromecast, and MrMC.
:::
The Base URL setting in the **Networking** page is an advanced setting used to specify the URL prefix that your Jellyfin instance can be accessed at. In effect, it adds this URL fragment to the start of any URL path. For instance, if you have a Jellyfin server at `http://myserver` and access its main page `http://myserver/web/index.html`, setting a Base URL of `/jellyfin` will alter this main page to `http://myserver/jellyfin/web/index.html`. This can be useful if administrators want to access multiple Jellyfin instances under a single domain name, or if the Jellyfin instance lives only at a subpath to another domain with other services listening on `/`.
The entered value on the configuration page will be normalized to include a leading `/` if this is missing.
This setting requires a server restart to change, in order to avoid invalidating existing paths until the administrator is ready.
There are three main caveats to this setting.
1. When setting a new Base URL (i.e. from `/` to `/baseurl`) or changing a Base URL (i.e. from `/baseurl` to `/newbaseurl`), the Jellyfin web server will automatically handle redirects to avoid displaying users invalid pages. For instance, accessing a server with a Base URL of `/jellyfin` on the `/` path will automatically append the `/jellyfin` Base URL. However, entirely removing a Base URL (i.e. from `/baseurl` to `/`, an empty value in the configuration) will not - all URLs with the old Base URL path will become invalid and throw 404 errors. This should be kept in mind when removing an existing Base URL.
2. Client applications generally, for now, do not handle the Base URL redirects implicitly. Therefore, for instance in the Android app, the `Host` setting _must_ include the BaseURL as well (e.g. `http://myserver:8096/baseurl`), or the connection will fail.
3. Any reverse proxy configurations must be updated to handle a new Base URL. Generally, passing `/` back to the Jellyfin instance will work fine in all cases and the paths will be normalized, and this is the standard configuration in our examples. Keep this in mind however when doing more advanced routing.
### Final Steps
It's strongly recommend that you check your SSL strength and server security at [SSLLabs](https://www.ssllabs.com/ssltest/analyze.html) if you are exposing these services to the internet.
-426
View File
@@ -1,426 +0,0 @@
---
uid: network-reverse-proxy-nginx
title: Nginx
---
## Nginx
"[Nginx](https://www.nginx.com/) (pronounced "engine X") is a web server which can also be used as a reverse proxy, load balancer, mail proxy and HTTP cache. The software was created by Igor Sysoev and first publicly released in 2004.[9] A company of the same name was founded in 2011 to provide support and Nginx plus paid software." - [Wikipedia](https://en.wikipedia.org/wiki/Nginx)
## Nginx from a subdomain (jellyfin.example.org)
:::caution
HTTP is insecure. The following configuration is provided for ease of use only. If you are planning on exposing your server over the Internet you should setup HTTPS. [Let's Encrypt](https://letsencrypt.org/getting-started/) can provide free TLS certificates which can be installed easily via [certbot](https://certbot.eff.org/). Using only HTTP will expose passwords and API keys.
:::
:::tip
The default X-Frame-Options header may cause issues with the webOS app, causing it to remain stuck at a black screen. If enabled, the default Content Security Policy may also cause issues.
:::
Create the file `/etc/nginx/conf.d/jellyfin.conf` which will forward requests to Jellyfin.
```config
# Uncomment the commented sections after you have acquired a SSL Certificate
server {
listen 80;
listen [::]:80;
# server_name DOMAIN_NAME;
# Uncomment to redirect HTTP to HTTPS
# return 301 https://$host$request_uri;
#}
#server {
# listen 443 ssl http2;
# listen [::]:443 ssl http2;
server_name DOMAIN_NAME;
## The default `client_max_body_size` is 1M, this might not be enough for some posters, etc.
client_max_body_size 20M;
# Uncomment next line to Disable TLS 1.0 and 1.1 (Might break older devices)
# ssl_protocols TLSv1.3 TLSv1.2;
# use a variable to store the upstream proxy
# in this example we are using a hostname which is resolved via DNS
# (if you aren't using DNS remove the resolver line and change the variable to point to an IP address e.g `set $jellyfin 127.0.0.1`)
set $jellyfin jellyfin;
resolver 127.0.0.1 valid=30s;
#ssl_certificate /etc/letsencrypt/live/DOMAIN_NAME/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/live/DOMAIN_NAME/privkey.pem;
#include /etc/letsencrypt/options-ssl-nginx.conf;
#ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
#add_header Strict-Transport-Security "max-age=31536000" always;
#ssl_trusted_certificate /etc/letsencrypt/live/DOMAIN_NAME/chain.pem;
#ssl_stapling on;
#ssl_stapling_verify on;
# Security / XSS Mitigation Headers
# NOTE: X-Frame-Options may cause issues with the webOS app
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "0"; # Do NOT enable. This is obsolete/dangerous
add_header X-Content-Type-Options "nosniff";
# COOP/COEP. Disable if you use external plugins/images/assets
add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Cross-Origin-Embedder-Policy "require-corp" always;
add_header Cross-Origin-Resource-Policy "same-origin" always;
# Permissions policy. May cause issues on some clients
add_header Permissions-Policy "accelerometer=(), ambient-light-sensor=(), battery=(), bluetooth=(), camera=(), clipboard-read=(), display-capture=(), document-domain=(), encrypted-media=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), interest-cohort=(), keyboard-map=(), local-fonts=(), magnetometer=(), microphone=(), payment=(), publickey-credentials-get=(), serial=(), sync-xhr=(), usb=(), xr-spatial-tracking=()" always;
# Content Security Policy
# See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
# Enforces https content and restricts JS/CSS to origin
# External Javascript (such as cast_sender.js for Chromecast) must be whitelisted.
# NOTE: The default CSP headers may cause issues with the webOS app
#add_header Content-Security-Policy "default-src https: data: blob: http://image.tmdb.org; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://www.gstatic.com https://www.youtube.com blob:; worker-src 'self' blob:; connect-src 'self'; object-src 'none'; frame-ancestors 'self'";
location = / {
return 302 http://$host/web/;
#return 302 https://$host/web/;
}
location / {
# Proxy main Jellyfin traffic
proxy_pass http://$jellyfin:8096;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
# Disable buffering when the nginx proxy gets very resource heavy upon streaming
proxy_buffering off;
}
# location block for /web - This is purely for aesthetics so /web/#!/ works instead of having to go to /web/index.html/#!/
location = /web/ {
# Proxy main Jellyfin traffic
proxy_pass http://$jellyfin:8096/web/index.html;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
}
location /socket {
# Proxy Jellyfin Websockets traffic
proxy_pass http://$jellyfin:8096;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
}
}
```
## Nginx with Subpath (example.org/jellyfin)
When connecting to server from a client application, enter `http(s)://DOMAIN_NAME/jellyfin` in the address field.
Set the [base URL](/docs/general/networking#base-url) field in the Jellyfin server. This can be done by navigating to the Admin Dashboard -> Networking -> Base URL in the web client. Fill in this box with `/jellyfin` and click Save. The server will need to be restarted before this change takes effect.
### HTTP config example
:::caution
HTTP is insecure. The following configuration is provided for ease of use only. If you are planning on exposing your server over the Internet you should setup HTTPS (see below for HTTPS configuration example). [Let's Encrypt](https://letsencrypt.org/getting-started/) can provide free TLS certificates which can be installed easily via [certbot](https://certbot.eff.org/).
:::
```conf
# Jellyfin hosted on http://DOMAIN_NAME/jellyfin
server {
listen 80;
listen [::]:80;
server_name DOMAIN_NAME;
# You can specify multiple domain names if you want
#server_name jellyfin.local;
# use a variable to store the upstream proxy
# in this example we are using a hostname which is resolved via DNS
# (if you aren't using DNS remove the resolver line and change the variable to point to an IP address e.g `set $jellyfin 127.0.0.1`)
set $jellyfin jellyfin;
resolver 127.0.0.1 valid=30s;
# Uncomment and create directory to also host static content
#root /srv/http/media;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# Jellyfin
location /jellyfin {
return 302 $scheme://$host/jellyfin/;
}
# The / at the end is significant.
# https://www.acunetix.com/blog/articles/a-fresh-look-on-reverse-proxy-related-attacks/
location /jellyfin/ {
# Proxy main Jellyfin traffic
proxy_pass http://$jellyfin:8096;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
# Disable buffering when the nginx proxy gets very resource heavy upon streaming
proxy_buffering off;
}
}
```
### HTTPS config example
The following config is meant to work with Certbot / Let's Encrypt.
```conf
# Jellyfin hosted on https://DOMAIN_NAME/jellyfin
server {
listen 80;
listen [::]:80;
server_name DOMAIN_NAME;
# Uncomment to redirect HTTP to HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name DOMAIN_NAME;
# You can specify multiple domain names if you want
#server_name jellyfin.local;
ssl_certificate /etc/letsencrypt/live/DOMAIN_NAME/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/DOMAIN_NAME/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
add_header Strict-Transport-Security "max-age=31536000" always;
ssl_trusted_certificate /etc/letsencrypt/live/DOMAIN_NAME/chain.pem;
ssl_stapling on;
ssl_stapling_verify on;
# use a variable to store the upstream proxy
# in this example we are using a hostname which is resolved via DNS
# (if you aren't using DNS remove the resolver line and change the variable to point to an IP address e.g `set $jellyfin 127.0.0.1`)
set $jellyfin jellyfin;
resolver 127.0.0.1 valid=30s;
# Uncomment next line to disable TLS 1.0 and 1.1 (Might break older devices)
# ssl_protocols TLSv1.3 TLSv1.2;
# Jellyfin
location /jellyfin {
return 302 $scheme://$host/jellyfin/;
}
# The / at the end is significant.
# https://www.acunetix.com/blog/articles/a-fresh-look-on-reverse-proxy-related-attacks/
location /jellyfin/ {
# Proxy main Jellyfin traffic
proxy_pass http://$jellyfin:8096;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
# Disable buffering when the nginx proxy gets very resource heavy upon streaming
proxy_buffering off;
}
}
```
## Extra Nginx Configurations
### Censor sensitive information in logs
This censors any <code>api_key</code> URL parameter from the logfile.
```conf
#Must be in HTTP block
log_format stripsecrets '$remote_addr $host - $remote_user [$time_local] '
'"$secretfilter" $status $body_bytes_sent '
'$request_length $request_time $upstream_response_time '
'"$http_referer" "$http_user_agent"';
map $request $secretfilter {
~*^(?<prefix1>.*[\?&]api_key=)([^&]*)(?<suffix1>.*)$ "${prefix1}***$suffix1";
default $request;
}
#Must be inside server block
#Insert into all servers where you want filtering (e.g HTTP + HTTPS block)
access_log /var/log/nginx/access.log stripsecrets;
```
### Cache Video Streams
```conf
# Must be in HTTP block
# Set in-memory cache-metadata size in keys_zone, size of video caching and how many days a cached object should persist
proxy_cache_path /var/cache/nginx/jellyfin-videos levels=1:2 keys_zone=jellyfin-videos:100m inactive=90d max_size=35000m;
map $request_uri $h264Level { ~(h264-level=)(.+?)& $2; }
map $request_uri $h264Profile { ~(h264-profile=)(.+?)& $2; }
# Set in Server block
location ~* ^/Videos/(.*)/(?!live)
{
# Set size of a slice (this amount will be always requested from the backend by nginx)
# Higher value means more latency, lower more overhead
# This size is independent of the size clients/browsers can request
slice 2m;
proxy_cache jellyfin-videos;
proxy_cache_valid 200 206 301 302 30d;
proxy_ignore_headers Expires Cache-Control Set-Cookie X-Accel-Expires;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
proxy_connect_timeout 15s;
proxy_http_version 1.1;
proxy_set_header Connection "";
# Transmit slice range to the backend
proxy_set_header Range $slice_range;
# This saves bandwidth between the proxy and jellyfin, as a file is only downloaded one time instead of multiple times when multiple clients want to at the same time
# The first client will trigger the download, the other clients will have to wait until the slice is cached
# Esp. practical during SyncPlay
proxy_cache_lock on;
proxy_cache_lock_age 60s;
proxy_pass http://$jellyfin:8096;
proxy_cache_key "jellyvideo$uri?MediaSourceId=$arg_MediaSourceId&VideoCodec=$arg_VideoCodec&AudioCodec=$arg_AudioCodec&AudioStreamIndex=$arg_AudioStreamIndex&VideoBitrate=$arg_VideoBitrate&AudioBitrate=$arg_AudioBitrate&SubtitleMethod=$arg_SubtitleMethod&TranscodingMaxAudioChannels=$arg_TranscodingMaxAudioChannels&RequireAvc=$arg_RequireAvc&SegmentContainer=$arg_SegmentContainer&MinSegments=$arg_MinSegments&BreakOnNonKeyFrames=$arg_BreakOnNonKeyFrames&h264-profile=$h264Profile&h264-level=$h264Level&slicerange=$slice_range";
# add_header X-Cache-Status $upstream_cache_status; # This is only for debugging cache
}
```
### Cache Images
```conf
# Add this outside of you server block (i.e. http block)
proxy_cache_path /var/cache/nginx/jellyfin levels=1:2 keys_zone=jellyfin:100m max_size=15g inactive=30d use_temp_path=off;
# Cache images (inside server block)
location ~ /Items/(.*)/Images {
proxy_pass http://$jellyfin:8096;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_cache jellyfin;
proxy_cache_revalidate on;
proxy_cache_lock on;
# add_header X-Cache-Status $upstream_cache_status; # This is only to check if cache is working
}
```
Ensure that the directory /var/cache/nginx/jellyfin exists and the nginx user has write permissions on it! All the cache options used are explained on [Nginx blog](https://www.nginx.com/blog/nginx-caching-guide/) and [Nginx proxy module](http://nginx.org/en/docs/http/ngx_http_proxy_module.html).
### Rate Limit Downloads
```conf
# Add this outside of you server block (i.e. http block)
limit_conn_zone $binary_remote_addr zone=addr:10m;
# Downloads limit (inside server block)
location ~ /Items/(.*)/Download$ {
proxy_pass http://$jellyfin:8096;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
limit_rate 1700k; # Speed limit (here is on kb/s)
limit_conn addr 3; # Number of simultaneous downloads per IP
limit_conn_status 460; # Custom error handling
# proxy_buffering on; # Be sure buffering is on (it is by default on nginx), otherwise limits won't work
}
# Error page
error_page 460 http://your-page-telling-your-limit/;
```
[See here for more](https://www.nginx.com/blog/rate-limiting-nginx/)
## Nginx Proxy Manager
[Nginx Proxy Manager](https://nginxproxymanager.com/) provides an easy-to-use web GUI for Nginx.
Create a proxy host and point it to your Jellyfin server's IP address and http port (usually 8096)
Enable "Block Common Exploits", and "Websockets Support". Configure the access list if you intend to use them. Otherwise leave it on "publicly accessible".
In the "Advanced" tab, enter the following in "Custom Nginx Configuration". This is optional, but recommended if you intend to make Jellyfin accessible outside of your home.
```config
# Disable buffering when the nginx proxy gets very resource heavy upon streaming
proxy_buffering off;
# Proxy main Jellyfin traffic
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_headers_hash_max_size 2048;
proxy_headers_hash_bucket_size 128;
# Security / XSS Mitigation Headers
# NOTE: X-Frame-Options may cause issues with the webOS app
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "0";
add_header X-Content-Type-Options "nosniff";
# Content Security Policy
# See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
# Enforces https content and restricts JS/CSS to origin
# External Javascript (such as cast_sender.js for Chromecast) must be whitelisted.
# NOTE: The default CSP headers may cause issues with the webOS app
#add_header Content-Security-Policy "default-src https: data: blob: http://image.tmdb.org; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://www.gstatic.com/cv/js/sender/v1/cast_sender.js https://www.gstatic.com/eureka/clank/95/cast_sender.js https://www.gstatic.com/eureka/clank/96/cast_sender.js https://www.gstatic.com/eureka/clank/97/cast_sender.js https://www.youtube.com blob:; worker-src 'self' blob:; connect-src 'self'; object-src 'none'; frame-ancestors 'self'";
```
In the "SSL" tab, use the jellyfin.example.org certificate that you created with Nginx Proxy Manager and enable "Force SSL", "HTTP/2 Support", "HSTS Enabled", "HSTS Subdomains".
-189
View File
@@ -1,189 +0,0 @@
---
uid: network-reverse-proxy-traefik
title: Traefik v1.x
---
## Traefik v1.x
[Traefik](https://traefik.io/) is a modern HTTP reverse proxy and load balancer that makes deploying microservices easy. Traefik integrates with your existing infrastructure components (Docker, Swarm mode, Kubernetes, Marathon, Consul, Etcd, Rancher, Amazon ECS, ...) and configures itself automatically and dynamically. Pointing Traefik at your orchestrator should be the only configuration step you need. This configuration is A+. Test your setup here at [SSLlabs](https://www.ssllabs.com/ssltest/).
Create docker-compose.yml, traefik.toml and acme.json in the **same** directory or change their paths in the volume section.
:::note
Ensure you enable Basic Auth protection for Traefik or disable its Dashboard. Otherwise your Dashboard will be accessible from the internet.
:::
```bash
sudo apt install apache2-utils
echo $(htpasswd -nb username mystrongpassword) | sed -e s/\\$/\\$\\$/g
```
This command automatically escapes all $ inside the password for the YML file. If using an environment file, it does not need the $ escaped since it will not be interpreted by the shell.
Create the docker network for traefik.
```bash
sudo docker network create traefik
```
### docker-compose.yml
```yml
version: '3.5'
networks:
traefik:
name: traefik
services:
traefik:
container_name: traefik
image: traefik:v1.7
networks:
- traefik
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.toml:/traefik.toml
- ./acme.json:/acme.json
labels:
traefik.enable: 'true'
traefik.backend: traefik
traefik.docker.network: traefik
traefik.port: 8080
traefik.frontend.rule: Host:traefik.example.com,
traefik.frontend.entryPoints: https
traefik.frontend.passHostHeader: 'true'
traefik.frontend.headers.SSLForceHost: 'true'
traefik.frontend.headers.SSLHost: traefik.example.com
traefik.frontend.headers.SSLRedirect: 'true'
traefik.frontend.headers.browserXSSFilter: 'true'
traefik.frontend.headers.contentTypeNosniff: 'true'
traefik.frontend.headers.forceSTSHeader: 'true'
traefik.frontend.headers.STSSeconds: 315360000
traefik.frontend.headers.STSIncludeSubdomains: 'true'
traefik.frontend.headers.STSPreload: 'true'
traefik.frontend.headers.customResponseHeaders: X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex
traefik.frontend.headers.frameDeny: 'true'
traefik.frontend.headers.customFrameOptionsValue: 'allow-from https://example.com'
# traefik.frontend.auth.basic.users: xxx:xxx
restart: unless-stopped
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
network_mode: 'host'
volumes:
- /path/to/config:/config
- /path/to/cache:/cache
- /path/to/media:/media
restart: unless-stopped
```
This TOML file can't support environment variables, so don't attempt to use variables.
:::caution
Due to a [bug](https://github.com/containous/traefik/issues/5559) in Traefik, you cannot dynamically route to containers when network_mode=host, so we have created a static route to the docker host (172.17.0.1:8096) in `traefik.toml`. Using host networking (or macvlan) is required to use DLNA or an HdHomeRun as it supports multicast networking.
:::
### traefik.toml
```toml
logLevel = "WARN"
defaultEntryPoints = ["http", "https"]
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
minVersion = "VersionTLS12"
cipherSuites = [
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"
]
[retry]
[api]
[acme]
acmeLogging = true
email = "user@example.com"
storage = "acme.json"
entryPoint = "https"
[acme.dnsChallenge]
provider = "provider"
delayBeforeCheck = "60"
[[acme.domains]]
main = "*.example.com"
[docker]
domain = "example.com"
network = "traefik"
exposedbydefault = false
[file]
[backends]
[backends.backend-jellyfin]
[backends.backend-jellyfin.servers]
[backends.backend-jellyfin.servers.server-1]
url = "http://172.17.0.1:8096"
[frontends]
[frontends.jellyfin]
backend = "backend-jellyfin"
passHostHeader = true
[frontends.jellyfin.routes]
[frontends.jellyfin.routes.route-jellyfin-ext]
rule = "Host:jellyfin.example.com"
[frontends.jellyfin.headers]
SSLRedirect = true
SSLHost = "jellyfin.example.com"
SSLForceHost = true
STSSeconds = 315360000
STSIncludeSubdomains = true
STSPreload = true
forceSTSHeader = true
frameDeny = true
contentTypeNosniff = true
browserXSSFilter = true
customResponseHeaders = "X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex"
customFrameOptionsValue = "allow-from https://example.com"
```
Finally, create an empty acme.json file to handle the certificate.
```bash
touch acme.json
chmod 600 acme.json
```
:::caution
Change example.com to your domain name and update the acme.json file with your email address. Let's Encrypt does not require a valid email but example.com will be flagged as fake.
:::
Launch the Traefik and Jellyfin services.
```bash
docker-compose up -d
```
Congratulations, your stack with Traefik and Jellyfin is running!
Go to the domain you used earlier in the config file and your Jellyfin server will be running with HTTPS (AES 256) enabled.
+2
View File
@@ -0,0 +1,2 @@
position: 3
label: 'Post-Install Setup'
@@ -0,0 +1,54 @@
---
uid: network-dlna
title: DLNA
sidebar-position: 2
---
DLNA support has been moved to a first party plugin and is not included in a Jellyfin base install since 10.9.
If you want to use DLNA, please install the plugin from the official Plugin catalog.
To do so simply navigate to the admin dashboard, open the Catalog and install the [DLNA Plugin](https://github.com/jellyfin/jellyfin-plugin-dlna). Plugins maintained by the Jellyfin Project will be available in there by default.
Make sure to restart your Jellyfin-Server to complete the plugin installation.
## General
**Requirements:**
- Docker Host-networking (if Docker is used)
- 1900 udp
DLNA is based on UPnP.
Therefore it will make use of its **Service Discovery** (SSDP) running on Port 1900 UDP.
Since UPnP is a standard Protocol expected to be on UDP port 1900, its not possible to configure this.
Make sure to open this port to your local network. You will find more information about how to do this in the [Firewall guide](./#firewall-port-forwarding).
DLNA discovery works by sending a broadcast to the current subnet and waiting for DLNA Servers to respond.
This means that Clients will not be abled to find your server if it is not in the same subnet.
Using DLNA remotely is not possible.
If you are using Docker, the network should use **Host Mode**, otherwise the broadcast signal will not reach the bridged network inside of Docker.
## Troubleshooting
- If DLNA fails to bind properly, the message `[ERR] Failed to bind to port 1900: "Address already in use". DLNA will be unavailable` should appear in the logs.
- Setting `Alive message interval (seconds)` to 30 seconds also appears to help discovery for some clients.
- If a base URL is set, try removing it and restarting the server.
## DLNA Logging
Use these entries in `logging.default.json` to turn on DLNA debug logs.
```json
{
"Serilog": {
"MinimumLevel": {
"Default": "Warning",
"Override": {
"Microsoft": "Warning",
"System": "Warning",
"Jellyfin.Plugin.Dlna": "Debug"
}
}
}
}
```
@@ -0,0 +1,2 @@
label: 'Reverse Proxy'
position: 2.1
@@ -3,8 +3,6 @@ uid: network-reverse-proxy-apache
title: Apache
---
## Apache HTTP Server Project
"The [Apache HTTP Server Project](https://httpd.apache.org/) is an effort to develop and maintain an open-source HTTP server for modern operating systems including UNIX and Windows. The goal of this project is to provide a secure, efficient and extensible server that provides HTTP services in sync with the current HTTP standards."
```conf
@@ -36,11 +34,17 @@ title: Apache
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
ProxyPass "/socket" "ws://SERVER_IP_ADDRESS:8096/socket"
ProxyPassReverse "/socket" "ws://SERVER_IP_ADDRESS:8096/socket"
# Apache should be able to know when to change protocols (between WebSocket and HTTP)
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket
RewriteRule /(.*) ws://SERVER_IP_ADDRESS:8096/socket/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket
RewriteRule /(.*) http://SERVER_IP_ADDRESS:8096/$1 [P,L]
ProxyPass "/" "http://SERVER_IP_ADDRESS:8096/"
ProxyPassReverse "/" "http://SERVER_IP_ADDRESS:8096/"
# Sometimes, Jellyfin requires clients to empty their cache to display and function correctly.
# This header tells clients not to keep any cache and is quite strict on that.
# This might also fix some syncplay issues (#5485 and #8140 @ https://github.com/jellyfin/jellyfin-web/issues/)
# Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0"
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/DOMAIN_NAME/fullchain.pem
@@ -60,7 +64,7 @@ title: Apache
</IfModule>
```
If you encouter errors, you may have to enable `mod_proxy`, `mod_ssl`, `proxy_wstunnel`, `http2`, `headers` and `remoteip` support manually.
If you encounter errors, you may have to enable `mod_proxy`, `mod_ssl`, `proxy_wstunnel`, `http2`, `headers` and `remoteip` support manually.
```bash
sudo a2enmod proxy proxy_http ssl proxy_wstunnel remoteip http2 headers
@@ -70,7 +74,7 @@ sudo a2enmod proxy proxy_http ssl proxy_wstunnel remoteip http2 headers
When connecting to server from a client application, enter `http(s)://DOMAIN_NAME/jellyfin` in the address field.
Set the [base URL](/docs/general/networking#base-url) field in the Jellyfin server. This can be done by navigating to the Admin Dashboard -> Networking -> Base URL in the web client. Fill in this box with `/jellyfin` and click Save. The server will need to be restarted before this change takes effect.
Set the [base URL](../#base-url) field in the Jellyfin server. This can be done by navigating to the Admin Dashboard -> Networking -> Base URL in the web client. Fill in this box with `/jellyfin` and click Save. The server will need to be restarted before this change takes effect.
:::caution
@@ -1,9 +1,12 @@
---
uid: network-reverse-proxy-caddy
title: Caddy
sidebar-position: 1
---
# Caddy
## Caddy
> **Note:** For HTTP/3 support, ensure UDP port 443 is forwarded/opened on your firewall, as HTTP/3 uses UDP.
"[Caddy](https://caddyserver.com/), sometimes clarified as the Caddy web server, is an open source, HTTP/2-enabled web server written in Go. It uses the Go standard library for its HTTP functionality." - [Wikipedia](<https://en.wikipedia.org/wiki/Caddy_(web_server)>)
@@ -37,7 +40,7 @@ Please proceed with caution when using this option:
Please read the [Let's Encrypt documentation](https://letsencrypt.org/docs/challenge-types/) for more info.
:::
## One-liners
### One-liners
The easiest way to reverse proxy to Jellyfin is with the `reverse-proxy` command:
@@ -60,7 +63,7 @@ caddy reverse-proxy --from example.com --to 127.0.0.1:8096
You will see Caddy provision a TLS certificate for your site and if it succeeds, you can then access your Jellyfin server over HTTPS with your domain name.
## Caddyfile
### Caddyfile
If you want to use a config file, create a file called `Caddyfile` for the configuration.
The first `reverse-proxy` command above is equivalent to the following options.
@@ -3,7 +3,7 @@ uid: network-reverse-proxy-haproxy
title: HAProxy
---
## HAProxy
> **Note:** For HTTP/3 support, ensure UDP port 443 is forwarded/opened on your firewall, as HTTP/3 uses UDP.
"[Haproxy](https://www.haproxy.com/) is a free, open source software that provides a high availability load balancer and proxy server for TCP and HTTP-based applications that spreads requests across multiple servers.[1] It is written in C[2] and has a reputation for being fast and efficient (in terms of processor and memory usage)." - [Wikipedia](https://en.wikipedia.org/wiki/HAProxy)
@@ -0,0 +1,64 @@
---
uid: reverse-proxy-index
title: Reverse Proxy
---
A proxy server is meant to catch and forward outgoing traffic. A reverse proxy does the same, but for incoming network traffic.
It can serve as an entry point to various services and will internally forward the traffic to your service.
This opens the ability to do rule specific routing, for example subdomain routing, ip geoblocking, ratelimits or url forwarding.
It is also possible to centralize DNS and SSL management on the reverse proxy, streamlining all routing-wise configuration.
Additionally, reverse proxies offer extended access logging, so it is always clear who, when and where a network request came from and went to.
## Running Jellyfin Behind a Reverse Proxy
Important things to note when using Jellyfin behind a reverse proxy.
### Logging
Be careful when logging requests with your reverse proxy. Jellyfin sometimes sends authentication information as part of the URL (e.g. `api_key` parameter), so logging the full request path can expose secrets to your logfile.
We recommend that you either protect your logfiles or do not log full request URLs or censor sensitive data from the logfile.
Our [proxy guides](./#guides) include examples on how to censor sensitive information from a logfile.
### Forwarded-For Headers
When traffic is forwarded through a reverse proxy, Jellyfin sees the proxys IP address rather than the clients.
This introduces potential security risks and can also break compatibility, since Jellyfin will not be able to differentiate between local and remote connections.
Therefore, if set up incorrectly, all limitations for external access will not work.
Therefore, the IP address(es) of your reverse proxy must be configured under “Known Proxies” in Jellyfins **Network** settings.
This allows Jellyfin to respect the `X-Forwarded-For`, `X-Forwarded-Proto`, and `X-Forwarded-Host` headers and use the associated value as the source IP address. By default, Jellyfin will discard all forwarded-for headers that do not originate from a "known Proxy". This is so that malicious devices will not be able to hide their IP address by providing a forwarded-for header.
This assumes that the reverse proxy is set up to include this header, which is not always the case by default.
If issues with source IP forwarding appear, this should be checked.
### Websockets
Jellyfin makes use of Websockets for various things. Not all reverse proxies allow this by default. It is important to make sure Websockets are allowed for your Jellyfin server.
## Guides
We recommend using [Caddy](https://caddyserver.com/) for its ease of use, especially with https. We provide a [guide](./caddy/) for configuring Caddy with Jellyfin.
If you do not want to use Caddy, some other popular options for reverse proxy systems are [Nginx](https://www.nginx.com), [Traefik](https://traefik.io), [Haproxy](https://www.haproxy.com) and [Apache](https://httpd.apache.org). Note that these have a greater learning curve than the recommended reverse proxy Caddy. You can find respective guides here:
- [Nginx](./nginx)
- [Traefik](./traefik)
- [HAProxy](./haproxy)
- [Apache](./apache)
While not a reverse proxy, Let's Encrypt can be used independently or with a reverse proxy to provide SSL certificates.
- [Let's Encrypt](../advanced/letsencrypt)
When following these guides, be sure to replace the following variables with your information.
- `DOMAIN_NAME`: Your public domain name to access Jellyfin on (e.g. jellyfin.example.com)
- `example.com`: The domain name Jellyfin services will run under (e.g. example.com)
- `SERVER_IP_ADDRESS`: The IP address of your Jellyfin server (if the reverse proxy is on the same server use 127.0.0.1)
In addition, the examples are configured for use with Let's Encrypt certificates. If you have a certificate from another source, change the SSL configuration from `/etc/letsencrypt/DOMAIN_NAME/` to the location of your certificate and key.
Ports 80 (TCP) and 443 (TCP) need to be opened on your router and firewall. (pointing to the proxy server)
For HTTP/3 support (QUIC), also forward/open UDP port 443.
@@ -0,0 +1,131 @@
---
uid: network-reverse-proxy-nginx
title: Nginx
---
"[Nginx](https://www.nginx.com/) (pronounced "engine X") is a web server which can also be used as a reverse proxy, load balancer, mail proxy and HTTP cache. The software was created by Igor Sysoev and first publicly released in 2004.[9] A company of the same name was founded in 2011 to provide support and Nginx plus paid software." - [Wikipedia](https://en.wikipedia.org/wiki/Nginx)
## Nginx from a subdomain (jellyfin.example.org)
Create the file `/etc/nginx/sites-available/jellyfin` which will forward requests to Jellyfin. After you've finished, you will need to symlink this file to /etc/nginx/sites-enabled and then reload nginx. This example assumes you've already acquired certifications as documented in our [Let's Encrypt](https://jellyfin.org/docs/general/networking/letsencrypt#nginx) guide.
Note that a server listening on http port 80 is required for the Certbot / Let's Encrypt certificate renewal process.
### HTTPS config example
```config
server {
# Nginx versions prior to 1.25
#listen 443 ssl http2;
#listen [::]:443 ssl http2;
# Nginx versions 1.25+
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name jellyfin.example.org;
## The default `client_max_body_size` is 1M, this might not be enough for some posters, etc.
client_max_body_size 20M;
# Comment next line to allow TLSv1.0 and TLSv1.1 if you have very old clients
ssl_protocols TLSv1.3 TLSv1.2;
ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.org/chain.pem;
# use a variable to store the upstream proxy
set $jellyfin 127.0.0.1;
# Security / XSS Mitigation Headers
add_header X-Content-Type-Options "nosniff";
# Permissions policy. May cause issues with some clients
add_header Permissions-Policy "accelerometer=(), ambient-light-sensor=(), battery=(), bluetooth=(), camera=(), clipboard-read=(), display-capture=(), document-domain=(), encrypted-media=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), interest-cohort=(), keyboard-map=(), local-fonts=(), magnetometer=(), microphone=(), payment=(), publickey-credentials-get=(), serial=(), sync-xhr=(), usb=(), xr-spatial-tracking=()" always;
# Content Security Policy
# See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
# Enforces https content and restricts JS/CSS to origin
# External Javascript (such as cast_sender.js for Chromecast) must be whitelisted.
add_header Content-Security-Policy "default-src https: data: blob: ; img-src 'self' https://* ; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://www.gstatic.com https://www.youtube.com blob:; worker-src 'self' blob:; connect-src 'self'; object-src 'none'; frame-ancestors 'self'; font-src 'self'";
location / {
# Proxy main Jellyfin traffic
proxy_pass http://$jellyfin:8096;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
# Disable buffering when the nginx proxy gets very resource heavy upon streaming
proxy_buffering off;
}
location /socket {
# Proxy Jellyfin Websockets traffic
proxy_pass http://$jellyfin:8096;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
}
}
server {
listen 80;
listen [::]:80;
server_name jellyfin.example.org;
return 301 https://$host$request_uri;
}
```
## Extra Nginx Configurations
### Censor sensitive information in logs
This censors any 'api_key' URL parameter from the logfile.
```conf
#Must be in HTTP block
log_format stripsecrets '$remote_addr $host - $remote_user [$time_local] '
'"$secretfilter" $status $body_bytes_sent '
'$request_length $request_time $upstream_response_time '
'"$http_referer" "$http_user_agent"';
map $request $secretfilter {
~*^(?<prefix1>.*[\?&]api_key=)([^&]*)(?<suffix1>.*)$ "${prefix1}***$suffix1";
default $request;
}
#Must be inside server block
#Insert into all servers where you want filtering (e.g HTTP + HTTPS block)
access_log /var/log/nginx/access.log stripsecrets;
```
### Nginx Proxy Manager
[Nginx Proxy Manager](https://nginxproxymanager.com/) provides an easy-to-use web GUI for Nginx.
Create a proxy host and point it to your Jellyfin server's IP address and http port (usually 8096)
Enable "Block Common Exploits", and "Websockets Support". Configure the access list if you intend to use them. Otherwise leave it on "publicly accessible".
In the "Advanced" tab, enter the following in "Custom Nginx Configuration". This is optional, but recommended if you intend to make Jellyfin accessible outside of your home.
```config
# Disable buffering when the nginx proxy gets very resource heavy upon streaming
proxy_buffering off;
```
In the "SSL" tab, use the jellyfin.example.org certificate that you created with Nginx Proxy Manager and enable "Force SSL", "HTTP/2 Support", "HSTS Enabled", "HSTS Subdomains".
@@ -1,10 +1,8 @@
---
uid: network-reverse-proxy-traefik2
title: Traefik v2.x
uid: network-reverse-proxy-traefik
title: Traefik
---
## Traefik v2.x
[Traefik](https://traefik.io/) is a modern HTTP reverse proxy and load balancer that makes deploying microservices easy. Traefik integrates with your existing infrastructure components (ie: Docker) and generally configures itself dynamically as services are added or removed.
This document provides a complete configuration of Traefik v2.x and Jellyfin. It uses a number of files including a `docker-compose.yml` file, `traefik.toml` (your Traefik static configuration), `traefik-provider.toml` (a file-based provider for Traefik), `traefik.log` (an optional log file), `.env` (the environment which may be needed for your ACME/LetsEncrypt providers), and `acme.json` (the state data for your ACME/LetsEncrypt certificate). The files should all be created in the **same** directory. Alternately, alter the paths in the volume section of the `traefik` service in `docker-compose.yml`. You can optionally jam some of the traefik.toml file into labels for the traefik service in `docker-compose.yml`, however this method is much clearer and easier to comment.
@@ -23,10 +21,9 @@ Traefik has many options for the configuration of LetsEncrypt using your choice
The configuration below creates a Traefik v2.x installation with access at entryPoint ports 80 (labelled 'http'), 443 (labeled 'https'), and 9999 (labeled 'secure'). Unrelated to this Jellyfin configuration, it redirects all traffic from http (port 80) to https (port 443) to ensure all data is encrypted. As for Jellyfin, it makes the service accessible without a path on the secure entry point. This configuration is intended to be used as a starting point and some adaptation is likely required for your configuration. If you want Jellyfin to be accessible without using a port (using the default https port), simply change 'secure' to 'https' in `docker-compose.yml` where indicated and remove the ':9999' from the SSLHost parameter. If you want Jellyfin to be accessible with a path, simply add the PathPrefix (i.e. '/jellyfin') and see the note near the end of this document about configuring Jellyfin.
### docker-compose.yml
## docker-compose.yml
```yml
version: '2.4'
services:
traefik:
container_name: traefik
@@ -110,7 +107,7 @@ services:
#### Set contentTypeNosniff to true to add the X-Content-Type-Options header with the value nosniff.
- 'traefik.http.middlewares.jellyfin-mw.headers.contentTypeNosniff=true'
#### Set browserXssFilter to true to add the X-XSS-Protection header with the value 1; mode=block.
- 'traefik.http.middlewares.jellyfin-mw.headers.customresponseheaders.X-XSS-PROTECTION=0'
- 'traefik.http.middlewares.jellyfin-mw.headers.customresponseheaders.X-XSS-PROTECTION=1'
#### The customFrameOptionsValue allows the X-Frame-Options header value to be set with a custom value. This
#### overrides the FrameDeny option.
- "traefik.http.middlewares.jellyfin-mw.headers.customFrameOptionsValue='allow-from https://DOMAIN_NAME'"
@@ -135,7 +132,7 @@ TOML files can't support environment variables, so all values must be hard coded
:::
### traefik.toml
## traefik.toml
```toml
[log]
@@ -227,7 +224,7 @@ TOML files can't support environment variables, so all values must be hard coded
Due to a [quirk](https://github.com/containous/traefik/issues/5559) in Traefik, you cannot dynamically route to containers when network_mode=host. We have created a static route to the docker host (192.168.1.xx:8096) in `traefik-provider.toml`. The use of host networking (as in this doc) or macvlan are required to use DLNA or an HdHomeRun so it can utilize the multicast network. `traefik-provider.toml` defines the jellyfin-svc@file service which we are pointing the router to in the `docker-compose.yml` file. You can not set a URL in `docker-compose.yml` which is why we set up this service externally. Be sure to update the IP address below to the IP address of the host on the local network (in this case, 192.168.1.xx).
### traefik-provider.toml
## traefik-provider.toml
```toml
[http]
@@ -262,7 +259,7 @@ Due to a [quirk](https://github.com/containous/traefik/issues/5559) in Traefik,
minVersion = "VersionTLS13"
```
### .env
## .env
```bash
RFC2136_NAMESERVER=...
@@ -287,7 +284,7 @@ These configurations use DOMAIN_NAME (i.e.: example.com) and HOST_NAME (i.e.: se
Launch the Traefik and Jellyfin services.
```bash
docker-compose up -d
docker compose up -d
```
If you set a PathPrefix (i.e. /jellyfin), you need to configure Jellyfin to expect it. After starting the service, access Jellyfin directly (via the host's IP at port 8096) and change the 'Base URL' in Dashboard / Advanced / Networking to match the '/jellyfin' path (if you used one in this configuration). Afterward, you may wish to create a firewall rule to prevent direct access to Jellyfin at port 8096 on the host, or simply ensure the port is not accessible via the Internet.
@@ -0,0 +1,2 @@
label: 'Advanced Networking'
position: 2.3
@@ -0,0 +1,274 @@
---
uid: network-fail2ban
title: fail2ban
---
[Fail2ban](https://github.com/fail2ban/fail2ban) is an intrusion prevention software framework that protects computer servers from brute-force attacks.
Fail2ban operates by monitoring log files (e.g. /var/log/auth.log, /var/log/apache/access.log, etc.) for selected entries and running scripts based on their content.
Jellyfin produces logs that can be monitored by Fail2ban to prevent brute-force attacks on your machine.
## Requirements
- Jellyfin remotely accessible
- Fail2ban installed and running
- Knowing where the logs for Jellyfin are stored: by default `/var/log/jellyfin/` for desktop and `/config/log/` for docker containers.
## Step one: create the jail
You need to create a jail for Fail2ban. If you're on Ubuntu and use nano as editor, run:
```bash
sudoedit /etc/fail2ban/jail.d/jellyfin.local
```
Add this to the new file, replacing `/path_to_logs` with the path to the log files above, e.g. `/var/log/jellyfin/`:
```bash
[jellyfin]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = jellyfin
maxretry = 3
bantime = 86400
findtime = 43200
logpath = /path_to_logs/jellyfin*.log
```
Save and exit nano.
Note:
1. If Jellyfin is running in a docker container, add the following to the `jellyfin.local` file:
```bash
action = iptables-allports[name=jellyfin, chain=DOCKER-USER]
```
2. If you're running Jellyfin on a non-standard port, then change the port from `80,443` to the relevant port say `8096,8920`
## Step two: create the filter
The filter contains a set of rules which Fail2ban will use to identify a failed authentication attempt. Create the filter by running:
```bash
sudoedit /etc/fail2ban/filter.d/jellyfin.conf
```
Paste:
```bash
[Definition]
failregex = ^.*Authentication request for .* has been denied \(IP: "<ADDR>"\)\.
```
Save and exit, then reload Fail2ban:
```bash
sudo systemctl restart fail2ban
```
Check fail2ban is running:
```bash
sudo systemctl status fail2ban
```
## Step three: test
Assuming you've at least one failed authentication attempt, you can test this new jail with `fail2ban-regex`:
```bash
sudo fail2ban-regex /path_to_logs/*.log /etc/fail2ban/filter.d/jellyfin.conf --print-all-matched
```
---
## Advanced Fail2Ban Setup: Forwarding and Managing Bans on an Upstream Proxy Server
To enhance security, Fail2Ban can manage IP bans on an upstream reverse proxy server instead of directly on the Jellyfin server. This setup allows you to block malicious IPs closer to your networks entry point, potentially benefiting other services using the same proxy.
This guide offers a configuration for setting up Fail2Ban to manage IP bans on an upstream reverse proxy server using **Dynamic Chains**, where each Fail2Ban jail creates and manages its own `iptables` chain on the upstream server.
### Assumptions
- **Fail2Ban** is installed on your local server (where Jellyfin is running).
- **iptables** is configured on the upstream server.
### Step one: Set Up SSH Key-Based Authentication
Ensure the Fail2Ban server can SSH into the upstream server without needing a password. This is crucial for automating the IP ban/unban process.
Replace `<upstream-server-ip>` with the actual IP address of your upstream server.
1. **Generate SSH Key (if not already done):**
```bash
ssh-keygen -t rsa -b 4096 -f /root/.ssh/id_rsa
```
2. **Copy the SSH Key to the Upstream Server:**
```bash
ssh-copy-id -i /root/.ssh/id_rsa.pub root@<upstream-server-ip>
```
3. **Test SSH Access:**
Ensure the SSH connection works without needing a password:
```bash
ssh -i /root/.ssh/id_rsa root@<upstream-server-ip>
```
### Step two: Configure Fail2Ban for Dynamic Chains
1. **Create the Fail2Ban Action File**:
On the Fail2Ban server, create a new action file:
```bash
sudo nano /etc/fail2ban/action.d/proxy-iptables-dynamic.conf
```
And add the Following Configuration, which will dynamically create, manage, and remove `iptables` chains on the upstream server per jail:
Remember to replace `<upstream-server-ip>` with the actual IP address of your upstream server.
```ini
[Definition]
# Option: actionban
# 1. Create the chain if it doesn't exist
# 2. Add the banned IP to the dynamic chain based on the jail name
# 3. Log the event
actionban = ssh -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@<upstream-server-ip> \
'iptables -N f2b-<name> 2>/dev/null || true; \
iptables -C INPUT -j f2b-<name> 2>/dev/null || iptables -I INPUT -j f2b-<name>; \
iptables -I f2b-<name> 1 -s <ip> -j DROP' && \
echo "Banned <ip> from jail <name> via upstream proxy" >> /var/log/fail2ban.log
# Option: actionunban
# 1. Remove the banned IP from the dynamic chain
# 2. Remove the chain if it becomes empty (cleanup)
# 3. Log the event
actionunban = ssh -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@<upstream-server-ip> \
'iptables -D f2b-<name> -s <ip> -j DROP; \
if ! iptables -L f2b-<name> | grep -q "DROP"; then \
iptables -D INPUT -j f2b-<name>; \
iptables -F f2b-<name>; \
iptables -X f2b-<name>; \
fi' && \
echo "Unbanned <ip> from jail <name> via upstream proxy and cleaned up chain if empty" >> /var/log/fail2ban.log
```
After making chaneges, save and close the file.
2. **Update Fail2Ban Jails to Use the Dynamic Chain Action**:
Open your jail configuration file, usually located at `/etc/fail2ban/jail.local`:
```bash
sudo nano /etc/fail2ban/jail.local
```
And for each jail you want to manage via the upstream proxy, add or modify the action line to use the proxy-iptables-dynamic action. Heres an example configuration for two jails:
```ini
[jellyfin]
enabled = true
filter = jellyfin
logpath = /path/to/jellyfin/log
maxretry = 3
bantime = 3600
action = proxy-iptables-dynamic
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 3600
action = proxy-iptables-dynamic
```
After making chaneges, save and close the file.
### Step three: Add proxy IPs to Jellyfin
1. **Get Proxy IPs**
Since you're using a proxy server, we need Jellyfin to output the correct IPs in logs for fail2ban to read.
Depending on your hosting setup, these IP ranges could be from internal Docker IPs, haproxy, or some other service.
Jellyfin accepts IPs with subnet masks such as `172.18.0.1/24`. You'll need a comma-separated list of these.
2. **Add Proxies to Jellyfin**
Open your Jellyfin server's dashboard, go to `Advanced` -> `Networking`, and then scroll down to `Known proxies`.
Enter your comma-seperated list of proxy IP ranges. You'll need to reboot the Jellyfin server as indicated.
### Step four: Restart Fail2Ban and Test the Setup
1. **Restart Fail2Ban**:
After making the configuration changes, restart Fail2Ban to apply the new settings:
```bash
sudo systemctl restart fail2ban
```
2. **Check Jail Status**:
Verify the status of your jails to ensure they are running correctly:
```bash
sudo fail2ban-client status jellyfin
```
3. **Test a Ban**:
Trigger a ban by performing invalid login attempts or by manually banning an IP. For example:
```bash
sudo fail2ban-client set jellyfin banip 192.168.1.100
```
4. **Verify on Upstream Server**:
Check if the IP is banned in the corresponding jail's chain on the upstream server ('f2b-jail-name'):
```bash
ssh root@<upstream-server-ip> "iptables -L f2b-jellyfin"
```
5. **Test Unbanning**:
To test unbanning, manually unban the IP:
```bash
sudo fail2ban-client set jellyfin unbanip 192.168.1.100
```
6. **Verify Unban**:
Verify that the IP is removed from the corresponding jail's chain ('f2b-jail-name'):
```bash
ssh root@<upstream-server-ip> "iptables -L f2b-jellyfin"
```
### Step five: Monitor Logs
Monitor the Fail2Ban log to ensure that actions are being executed properly:
```bash
tail -f /var/log/fail2ban.log
```
This log will display messages whenever an IP is banned or unbanned, helping you confirm that the configuration is working as expected.
@@ -3,8 +3,6 @@ uid: network-ipban
title: IPBan
---
## IPBan
[IPBan](https://github.com/DigitalRuby/IPBan) is an intrusion prevention much like fail2ban, but multi-platform
Install with one command on windows (elevated powershell prompt)
@@ -24,7 +22,7 @@ Config
</PathAndMask>
<FailedLoginRegex>
<![CDATA[
Authentication\s+request\s+for\s+\S+?(?<username>[^\s]+)\S+\s+has\s+been\s+(?<log>denied)\s+\(IP:\s+"(?<ipaddress>[^,]+)"\)
Authentication\s+request\s+for\s+\S+?(?<username>[^\s]+)\S+\s+has\s+been\s+(?<log>denied)\s+\(IP:\s+"(?<ipaddress>[^,"\s]+)"\)
]]>
</FailedLoginRegex>
<SuccessfulLoginRegex>
@@ -3,17 +3,15 @@ uid: network-letsencrypt
title: Let's Encrypt
---
## LetsEncrypt with Certbot
LetsEncrypt is a service that provides free SSL/TLS certificates to users. Certbot is a client that makes this easy to accomplish and automate. In addition, it has plugins for Apache and Nginx that make automating certificate generation even easier.
Installation instructions for most Linux distributions can be found on the [Certbot](https://certbot.eff.org/docs/install.html#operating-system-packages) website.
Once the packages are installed, you're ready to generate a new certificate.
### Apache
## Apache
#### Certbot Apache Plugin
### Certbot Apache Plugin
After installing Certbot and the Apache plugin, certificate generation is accomplished by with the following command.
@@ -29,9 +27,9 @@ Add a job to cron so the certificate will be renewed automatically.
echo "0 0 * * * root certbot renew --quiet --no-self-upgrade --post-hook 'systemctl reload apache2'" | sudo tee -a /etc/cron.d/renew_certbot
```
#### Certbot Webroot
### Certbot Webroot
##### Debian
#### Debian
If the certbot apache plugin doesn't work with your config, use webroot instead.
@@ -49,7 +47,11 @@ Run the certbot command as root:
sudo certbot certonly --webroot -w /var/www/html --agree-tos --email YOUR_EMAIL -d DOMAIN_NAME
```
### HAProxy
## Caddy
Caddy automatically handles obtaining an SSL certificate from Let's Encrypt when provided with a domain name. No manual action is required.
## HAProxy
HAProxy doesn't currently have a Certbot plugin. To get around this, run Certbot in standalone mode and proxy traffic through your network.
@@ -69,7 +71,7 @@ cat /etc/letsencrypt/live/DOMAIN_NAME/fullchain.pem /etc/letsencrypt/live/DOMAIN
Uncomment `bind *:443` and the redirect section in the configuration, then reload the service.
#### Automatic Certificate Renewal
### Automatic Certificate Renewal
Place the following script in `/usr/local/bin/` to automatically update your SSL certificate.
@@ -98,7 +100,7 @@ Add a job to cron so the certificate will be renewed automatically.
@monthly /usr/bin/certbot renew --renew-hook "/usr/local/bin/letsencrypt-renew.sh" >> /var/log/letsencrypt-renewal.log
```
### Nginx
## Nginx
After installing Certbot and the Nginx plugin with `sudo apt install certbot python3-certbot-nginx`, generate the certificate.
@@ -118,11 +120,11 @@ Add a job to cron so the certificate will be renewed automatically.
echo "0 0 * * * root certbot renew --quiet --no-self-upgrade --post-hook 'systemctl reload nginx'" | sudo tee -a /etc/cron.d/renew_certbot
```
### Let's Encrypt and Docker
## Let's Encrypt and Docker
This section assumes that Jellyfin is running in a Docker container (on Linux). This section also assumes that you wish to run Let's Encrypt in a Docker container as well. The Linuxserver/swag Docker container has a built-in nginx webserver to handle the reverse proxy.
Linuxserver/letsencrypt is deprecated in favor of linuxserver/swag, see [here](https://github.com/linuxserver/docker-swag#migrating-from-the-old-linuxserverletsencrypt-image) for information on how to migrate if needed.
`linuxserver/letsencrypt` is deprecated in favor of `linuxserver/swag`. See the [SWAG migration guide on GitHub](https://github.com/linuxserver/docker-swag#migrating-from-the-old-linuxserverletsencrypt-image) for information on how to migrate if needed.
First, you need to determine a few things.
@@ -137,7 +139,7 @@ First, you need to determine a few things.
9. Make sure ports 80 (if using http validation) and 443 are forwarded to the docker container from your router (instructions vary upon manufacturer)
10. What user will the container be running as (you can determine the PUID and PGID by running `id` (replacing "user" with the username of the user the container will be running as)
List of DNS Plugins [here](https://certbot.eff.org/docs/using.html#dns-plugins) if using DNS-01 challenge.
If you're using the DNS-01 challenge, you can find the [list of supported DNS plugins in the Certbot documentation](https://certbot.eff.org/docs/using.html#dns-plugins).
Then, depending on what those settings are, you'll need to adjust the values below as needed.
@@ -3,11 +3,16 @@ uid: monitoring
title: Monitoring
---
## Monitoring
Jellyfin has two monitoring and metrics endpoints built-in: a basic health check endpoint and a Prometheus-compatible metrics endpoint.
### Health check endpoint
## Health check endpoint
:::note
The health endpoint will not function as expected while the server is still starting up.
Monitoring/ Watchdog programs could therefore kill the server when its running migrations.
:::
Jellyfin exposes the `/health` endpoint designated for checking the status of the underlying service. Currently this will verify HTTP and database connectivity and return a `200 OK` response if successful. You can see this for yourself by using `curl`:
@@ -17,7 +22,7 @@ curl -i http://myserver:8096/health
The `-i` option tells `curl` to also print the HTTP response code and headers.
### Prometheus metrics
## Prometheus metrics
Jellyfin can make [Prometheus](https://prometheus.io/) metrics available at `/metrics`, but this is turned off by default to avoid unintentionally leaking this information on the public internet. To enable it, you will need to edit `/etc/jellyfin/system.xml` and change this line from `false` to `true`:
@@ -25,4 +30,4 @@ Jellyfin can make [Prometheus](https://prometheus.io/) metrics available at `/me
<EnableMetrics>false</EnableMetrics>
```
If you have a [reverse proxy](/docs/general/networking#running-jellyfin-behind-a-reverse-proxy) configured, you can configure it to block access to the `/metrics` endpoint except for your internal network.
If you have a [reverse proxy](../reverse-proxy/) configured, you can configure it to block access to the `/metrics` endpoint except for your internal network.
@@ -0,0 +1 @@
position: 2
@@ -0,0 +1,161 @@
---
uid: network-index
title: Networking
---
As a server software, Jellyfin offers different services over the network.
Specifically Jellyfin supports the streaming of content and comes packed with a web-Client. - This will work purely over the HTTP(S) ports.
Additionally, in local networks, Jellyfin offers various Auto-Discovery services. These will not work outside your local subnet.
As a fully self-hosted software, Jellyfin runs independently from the Internet.
You do not have to make your server accessible through the internet.
Neither does Jellyfin require an internet connection to run; however you should note that it will load metadata from various Providers, which will not work without an Internet connection.
## Port Bindings
This section aims to provide an administrator with knowledge on what ports Jellyfin binds to and what purpose they serve.
| Port | Protocol | Configurable | Description |
|---|---|---|---|
| 8096 | TCP | ✔️ | Default HTTP |
| 8920 | TCP | ✔️ | Default HTTPS |
| 7359 | UDP | ❌ | Client Discovery |
<details>
<summary>See details</summary>
- **HTTP Traffic** (8096/TCP):
The web frontend can be accessed here. You can modify this setting from the **Networking** page in the admin settings.
- **HTTPS Traffic** (8920/TCP):
Used when https is enabled. By default this port will not be used.
This setting can also be modified from the **Networking** page to use a different port.
- **Client Discovery** (7359/UDP):
Allows clients to discover Jellyfin on the local network. A broadcast message to this port will return detailed information about your server that includes name, ip-address and ID.
</details>
## Accessing Jellyfin
This section focusses on how to make Jellyfin Available within Networks.
Here you will find descriptions on how to make Jellyfin accessible both only locally and through the Internet.
In general, Jellyfin will be available locally on the specified port over the host-ip - e.g. `http://10.0.0.2:8096`.
However its also possible to create a local DNS entry that will point to your Jellyfin-Server - e.g. `http://jellyfin.local:8096`.
<details>
<summary>Learn more about limitations with local DNS</summary>
Devices like Google Chromecast or Google Streamer use hardcoded DNS Servers - therefore they will not make use of your local DNS entries.
There are multiple workarounds for this issue.
The easiest involves the usage of IPv6 Entries in the public DNS.
Since IPv6 addresses do not differentiate between local and public, the address will be abled to be resolved locally.
This, however, requires the use of a public DNS server - The Jellyfin Server does not have to be accessible from the outside though!
</details>
### Firewall / Port Forwarding
Networks are usually divided from each other by firewalls. These block all incoming traffic and are meant to protect the network.
To access Jellyfin through these boundaries, its ports need to be forwarded / opened in the respective firewalls.
Note that opening a port gives full access to that port to the next higher Network.
Opening a port directly to the Internet is therefore insecure and not recommended.
There are different layers where a firewall can be placed:
| Layer | Example | Description |
| --- | --- | --- |
| Local | Docker, VM | Open ports at this layer to allow traffic from the Host to enter the Application |
| Host | physical machine, operating system | Open ports at this layer to allow traffic from the Network to enter the Host device |
| Network | Router | Open ports at this layer to allow traffic from the Internet to enter the Local Network |
<details>
<summary>Port forwarding vs. opening a Port</summary>
Whilst Routers often allow you to forward a port, firewalls typically only allow you to open one.
The difference is within the Target. Opening a Port essentially just means that traffic on this Port will go through.
Forwarding a Port you typically do in NAT scenarios - traffic is coming in on your public IP Address, what device inside your network should recieve it.
Sometimes, port forwarding also lets you map an external port to a different internal port.
</details>
<details>
<summary>How to open a Port</summary>
How exactly a port will be opened depends on your firewall software and its UI.
Here is linked below how to open ports for:
- [Windows Firewall](https://learn.microsoft.com/en-us/sql/reporting-services/report-server/configure-a-firewall-for-report-server-access?view=sql-server-ver16#open-ports-in-windows-firewall)
- [firewalld](https://firewalld.org/documentation/howto/open-a-port-or-service.html)
- [Uncomplicated Firewall](https://wiki.ubuntu.com/UncomplicatedFirewall#Basic_Usage) (ufw)
- [nftables](https://wiki.nftables.org/wiki-nftables/index.php/Main_Page)
</details>
### External Access
Since Jellyfin is entirely self-hosted, you must manually expose it to the internet.
To do so, you need a method to access the HTTP(S) ports remotely.
Automatic discovery only works locally and should not be exposed externally
To access a server remotely there will need to be a way to find it or its network on the internet.
This can be done through the public IP Address of the Device or for IPv6 the Server's directly.
To store the IP Address, the easiest option would be to use a Domain and rely on DNS to resolve it.
This can also be used to store the 'current IP Address' in the case of a dynamic public IP Address.
However its not mandatory to use a Domain.
There are multiple ways of exposing Jellyfin to the outside - the most common ones are:
- forwarding its Ports directly to the internet (not recommended!)
- forwarding through a Reverse Proxy
- using a VPN connection to enter the Network
- use a VPS to Reverse Proxy to your home network
Learn more about reverse proxies in our dedicated [Reverse Proxy guide](./reverse-proxy/).
### SSL / https
Using https to access the Server is recommended.
By default, HTTPS is disabled because it requires an SSL certificate.
SSL Certificates are usually issued by a third party and verify that the Server and URL are assigned to another.
Please use a trusted certificate authority such as [Let's Encrypt](./advanced/letsencrypt) when using https.
:::caution
Self-signed certificates pose security and compatibility issues and are strongly discouraged.
:::
While Jellyfin supports HTTPS, it is strongly recommended to handle HTTPS termination separately on a reverse proxy. You can find more info on how to set this up on our [Reverse Proxy](./reverse-proxy/) page.
**It's strongly recommend that you check your SSL strength and server security at [SSLLabs](https://www.ssllabs.com/ssltest/analyze.html) if you are exposing these services to the internet.**
### Base URL
Running Jellyfin with a path (e.g. `https://example.com/jellyfin`) is supported.
:::caution
Base URL is known to break HDHomeRun, the [DLNA plugin](./dlna/), Sonarr, Radarr, and MrMC.
:::
The Base URL setting is a setting used to specify the URL prefix that your Jellyfin instance can be accessed at. In effect, it adds this URL fragment to the start of any URL path. For instance, if you have a Jellyfin server at `http://myserver` and access its main page `http://myserver/web/index.html`, setting a Base URL of `/jellyfin` will alter this main page to `http://myserver/jellyfin/web/index.html`. This can be useful if administrators want to access multiple Jellyfin instances under a single domain name, or if the Jellyfin instance lives only at a subpath to another domain with other services listening on `/`.
The entered value on the configuration page will be normalized to include a leading `/` if this is missing.
This setting requires a server restart to change, in order to avoid invalidating existing paths until the administrator is ready.
There are three main caveats to this setting.
1. When setting a new Base URL (i.e. from `/` to `/baseurl`) or changing a Base URL (i.e. from `/baseurl` to `/newbaseurl`), the Jellyfin web server will automatically handle redirects to avoid displaying users invalid pages. For instance, accessing a server with a Base URL of `/jellyfin` on the `/` path will automatically append the `/jellyfin` Base URL. However, entirely removing a Base URL (i.e. from `/baseurl` to `/`, an empty value in the configuration) will not - all URLs with the old Base URL path will become invalid and throw 404 errors. This should be kept in mind when removing an existing Base URL.
2. Client applications generally, for now, do not handle the Base URL redirects implicitly. Therefore, for instance in the Android TV app, the `Host` setting _must_ include the BaseURL as well (e.g. `http://myserver:8096/baseurl`), or the connection will fail.
3. Any reverse proxy configurations must be updated to handle a new Base URL. Generally, passing `/` back to the Jellyfin instance will work fine in all cases and the paths will be normalized, and this is the standard configuration in our examples. Keep this in mind however when doing more advanced routing.
+47
View File
@@ -0,0 +1,47 @@
---
uid: postinstall-setup-wizard
title: Setup Wizard Walkthrough
sidebar_position: 1
---
# Setup Wizard Walkthrough
This page will guide you through each step of the setup wizard.
## Select Language
Select your preferred language for the rest of the setup. This setting only affects the client you are using. Server-wide language settings will be configured later.
![Setup Wizard Language Prompt](/images/docs/post-install/setup-wizard/setup-wizard-1-language.png)
## Setup Administrator Account
Set up an administrator account for managing the server. Choose a strong password for better security. You are able to create more user and administrator accounts once you finish the setup wizard.
![Setup Wizard Admin Account Page](/images/docs/post-install/setup-wizard/setup-wizard-2-admin-account.png)
## Add Media Libraries
Add media libraries at this page. Click on the + to add a library. Alternatively, click on "Next" without adding anything to skip this step and add media later.
![Setup Wizard Add Media Library Page](/images/docs/post-install/setup-wizard/setup-wizard-3-media-main.png)
In the popup, chose a type on the "Content Type" dropdown, and set a display name in the "Display Name" field. Then, add some folders using the + button. If you don't see your media folders listed, you might have permission issues. You can get help on our [forum](https://forum.jellyfin.org/) or [chat rooms](/contact)
Read more about media libraries at the [media libraries' documentation](/docs/general/server/libraries/)
![Setup Wizard Add Media Library Popup](/images/docs/post-install/setup-wizard/setup-wizard-4-media-popup.png)
## Set a Preferred Metadata Language
Select a preferred language and region for metadata fetching as the server-wide default. Metadata from other language / regions may be fetched if metadata is not available with your preferred settings. This can be further customized on a per-library basis.
![Setup Wizard Metadata Language Page](/images/docs/post-install/setup-wizard/setup-wizard-5-metadata-lang.png)
## Networking Settings
Some basic options for networking can be set on this page. For most users, it is recommended to **enable** the "Allow remote access to this server" option, and **disable** the "Enable automatic port mapping" option.
![Setup Wizard Networking Page](/images/docs/post-install/setup-wizard/setup-wizard-6-networking.png)
## Next Steps
You have finished the setup wizard. Below is a list of items you should configure in order to get the best experience:
- [Setup remote access to use Jellyfin when you are not at home](./networking)
- [Setup hardware acceleration to improve performance and/or save power](./transcoding/hardware-acceleration/)
![Setup Wizard Completion Page](/images/docs/post-install/setup-wizard/setup-wizard-7-complete.png)
@@ -0,0 +1 @@
position: 3
@@ -0,0 +1,85 @@
---
uid: server-transcoding-downmix
title: Stereo Downmix
---
# Stereo Downmix
These settings will control how the server downmixes surround sound into stereo when the client only supports stereo sound.
## Stereo Downmix Algorithm
Algorithms used to downmix multi-channel audio to stereo. Each algorithm has its own design goal and has its own strength and weakness. Pick the algorithm that best fit your use case and preference.
### None
Don't use any custom algorithm; instead, use ffmpeg's built-in channel downmixing system. This is the default and safest setting. It guarantees that as long as the input channel layout is supported by ffmpeg, it will always find a way to downmix it to stereo output. A common misconception is that this mode just discards all other channels, which is incorrect. ffmpeg has its own mechanism to build a downmixing matrix and will apply that when possible. When other custom algorithms cannot support the input layout, Jellyfin will fallback to this mode.
**Strengths:**
- Supports all channel layouts that ffmpeg can handle.
- Produces satisfactory mixing results for most use cases.
**Weaknesses:**
- The auto-generated matrix may produce weaker volume levels compared to the original.
- The result might not be well balanced, leading to too low perceived dialog compared to music and sound effects.
### Dave750
A custom mixing algorithm created by [Dave_750 on SuperUser](https://superuser.com/a/1375875). This algorithm divides the center and LFE channels into left and right channels and applies a -3dB gain to the front and back channels to balance the volume. The original algorithm supports only 5.1 inputs, but the Jellyfin implementation extends it to support 7.1 inputs by using AC-4 cascading downmixing.
**Strengths:**
- Maintains the overall volume level effectively.
- Inclusion of the LFE channel can enhance sound effects for some inputs.
**Weaknesses:**
- Due to the low gain coefficient applied to the center channel, dialogues might sound too quiet compared to music.
- Including the LFE channel can have a negative impact because this channel often contains duplicated signals from other channels, which may cause the bass to be overpowering.
### NightmodeDialogue
A custom mixing algorithm created by [Robert Collier on the Doom9 forum](https://forum.doom9.org/showthread.php?t=168267). This algorithm strongly emphasizes the center channel and reduces the volume level for all other channels. The original algorithm supports only 5.1 inputs, but the Jellyfin implementation extends it to support 7.1 inputs by using AC-4 cascading downmixing.
**Strengths:**
- Produces very clear dialogues.
- Music and sound effects are minimized, allowing you to focus on voices.
**Weaknesses:**
- Too quite sound effects is not ideal for movies.
- Conversations not fully mixed into the center channel will also sound much quieter.
### RFC7845
A standardized downmixing algorithm defined in [RFC7845 Section 5.1.1.5](https://datatracker.ietf.org/doc/html/rfc7845#section-5.1.1.5). This algorithm splits the surround channels between both the left and right stereo channels with gains to maintain perceived intensity, focusing on the front channels. It supports the 3.0, quadraphonic, 5.0, 5.1, 6.1, and 7.1 channel layouts, and includes the LFE channel when available.
**Strengths:**
- Maintains perceived intensity excellently.
- Focus on front channels and inclusion of LFE makes it a good choice for music videos.
**Weaknesses:**
- The original spatial sound is compromised, as all surround channels are equally split into both stereo channels, making the surround sound more like a louder center channel.
- Not ideal for movies due to the loss of spatial mixing and a too-quiet center channel, which can cause sound effects and music to potentially overpower dialogues.
### AC-4
A standardized downmixing algorithm originally created for AC-4 audio, defined in [ETSI TS 103 190-1, Section 6.2.17](https://www.etsi.org/deliver/etsi_ts/103100_103199/10319001/01.03.01_60/ts_10319001v010301p.pdf). Jellyfin's implementation uses the spec-defined default values, applying -3dB gains to both center and surround channels, and -∞dB gain to the LFE channel, effectively discarding it. It supports 3.0, 5.0, 5.1, 7.0, and 7.1 inputs.
**Strengths:**
- A widely adopted industry standard, producing results close to commercial ATSC 3.0 systems.
- Maintains both volume level and auditory spatial attention well.
**Weaknesses:**
- Does not excel as much as other algorithms in their specific strengths.
## Audio boost when downmixing
This option applies a volume gain in normalized ratio when performing a stereo downmix. The valid range is 0.5 to 3. A value of 1 means the original volume level is maintained, while a value of 2 means the volume is increased to 200%. The default value is 2, which is suitable for the default ffmpeg built-in downmixing. If you change the downmix algorithm, remember to adjust this value accordingly, as different algorithms produce different volume levels. Reduce this value to 1 if you're unsure, and increase it if the result is too quiet.
@@ -0,0 +1 @@
position: 4

Some files were not shown because too many files have changed in this diff Show More