This Helm chart installs Jellyfin, a web media system, in a Kubernetes cluster.
This README covers the basics of customising and installation
![]()
Install this helm chart using the following command:
helm repo add media-servarr https://media-servarr.shw.al/charts
helm install jellyfin media-servarr/jellyfin
Pointing the host media-servarr.local to your kubernetes cluster will then allow you to access the application at the default location of http://media-servarr.local/jellyfin/
Here are some examples of configuration you may want to override (and include in installation with -f myvalues.yaml).
By default, base configuration is defined using a ConfigMap - defined by default in ./values.yaml in application.config. You can change values in the contents, such as the url base in your custom values.yaml
Jellyfin has multiple config files which we can create ConfigMaps for. By default, we manage network.xml and system.xml, but we could also add encoding.xml.
application:
port: 8096 # default UI port
urlBase: 'jellyfin' # default web base path
config:
- filename: 'network.xml'
contents: |
# We could change the BaseURL or Port here
...
mountPath: '/config/config/network.xml'
# System Options
- filename: 'system.xml'
contents: |
# We could add <EnableMetrics>true</EnableMetrics> to enable prometheus metrics
# It is recommended to add <IsStartupWizardCompleted>true</IsStartupWizardCompleted> to
# prevent the wizard running again after initial setup.
...
mountPath: '/config/config/system.xml'
- filename: 'encoding.xml'
contents: |
...
mountPath: '/config/config/encoding.xml'
You can prevent a ConfigMap being created and the configuration being managed as a kubernetes resource by defining the config as null. For example:
application:
...
config: null
The following volumes are available by default:
deployment:
...
volumes:
config: # The key will be the volume name
persistentVolumeClaim:
claimName: 'jellyfin-config'
ebooks:
nfs:
server: 'fileserver.local'
path: '/srv/media/ebooks/'
film:
music:
television:
By default, a PersistentVolumeClaim will be provisioned for the config, but emptyDir: {} will be used for ebooks, film, music, and television, unless otherwise specified in your values.yaml
persistentVolumeClaims:
jellyfin-config:
accessMode: 'ReadWriteOnce'
requestStorage: '1Gi'
storageClassName: 'manual'
# volumeName: 'existing-pv-name' # optional: bind this PVC to a specific pre-existing PV
selector:
matchLabels:
type: 'local'
Ingress can be enabled, and you can customise the default host, path, and TLS settings:
ingress:
enabled: true
host: 'example.com'
tls:
# Your TLS settings...
Prometheus metrics are enabled by placing <EnableMetrics>true</EnableMetrics> in System.xml.
Read more about this functionality in the official documentation
If your cluster supports GPUs, you can use runtimeClassName to ensure you are using the correct runtime class, be sure nodeSelector to control app placement. You should review the official documentation to understand how the official docker image supports hardware acceleration for your hardware type, and review the docs for enabling hardware passthrough on your kubernetes cluster.
Other supported deployment configuration include deployment.nodeSelector, deployment.tolerations, and deployment.affinity
You can also adjust container ports, environment variables (such as adding PGID and PUID) and define a serviceAccount.
Have a look at the parent charts default values.yaml for a comprehensive list of available config.
To upgrade the deployment:
helm upgrade jellyfin media-servarr/jellyfin -f myvalues.yaml
To uninstall/delete the jellyfin deployment:
helm uninstall jellyfin
For support, issues, or feature requests, please file an issue on the chart’s repository issue tracker.