Compare commits
56
Commits
1.2.0
...
jellyfin-2.3.0
No files matched your search
@@ -1,6 +1,13 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": [
|
||||
"github>jellyfin/.github//renovate-presets/default"
|
||||
"extends": ["github>jellyfin/.github//renovate-presets/default"],
|
||||
"customManagers": [
|
||||
{
|
||||
"customType": "regex",
|
||||
"fileMatch": ["charts/jellyfin/Chart.yaml"],
|
||||
"matchStrings": ["appVersion: (?<currentValue>.*?)\\n"],
|
||||
"datasourceTemplate": "docker",
|
||||
"depNameTemplate": "jellyfin/jellyfin"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -17,12 +17,12 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5
|
||||
with:
|
||||
python-version: 3.x
|
||||
|
||||
|
||||
@@ -14,12 +14,12 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Helm Docs GitHub Action
|
||||
uses: losisin/helm-docs-github-action@v1.3.1
|
||||
uses: losisin/helm-docs-github-action@0ad5e25e0c45c6c9e32a99776f64eb410b4a5657 # v1.4.0
|
||||
with:
|
||||
git-push: true
|
||||
git-commit-message: "docs(charts): :memo: write updated reademe"
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -28,12 +28,12 @@ jobs:
|
||||
git config --global user.email "team@jellyfin.org"
|
||||
|
||||
- name: Install Helm
|
||||
uses: azure/setup-helm@v4
|
||||
uses: azure/setup-helm@b9e51907a09c216f16ebe8536097933489208112 # v4
|
||||
env:
|
||||
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
||||
|
||||
- name: Run chart-releaser
|
||||
uses: helm/chart-releaser-action@v1.6.0
|
||||
uses: helm/chart-releaser-action@cae68fefc6b5f367a0275617c9f83181ba54714f # v1.7.0
|
||||
env:
|
||||
CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
||||
with:
|
||||
|
||||
@@ -32,7 +32,7 @@ hellyfin-helm/
|
||||
To use the charts in this repository, first add the repository to Helm:
|
||||
|
||||
```bash
|
||||
helm repo add jellyfin https://<your-repo-url>.git
|
||||
helm repo add jellyfin https://jellyfin.github.io/jellyfin-helm
|
||||
helm repo update
|
||||
```
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
||||
.vscode/
|
||||
@@ -1,8 +1,6 @@
|
||||
apiVersion: v2
|
||||
appVersion: 10.9.11
|
||||
description: Jellyfin Media Server
|
||||
name: jellyfin
|
||||
version: 1.2.0
|
||||
description: A Helm chart for Jellyfin Media Server
|
||||
type: application
|
||||
home: https://jellyfin.org/
|
||||
icon: https://jellyfin.org/images/logo.svg
|
||||
@@ -10,3 +8,5 @@ keywords:
|
||||
- jellyfin
|
||||
- media
|
||||
- self-hosted
|
||||
version: 2.3.0
|
||||
appVersion: 10.10.6
|
||||
@@ -0,0 +1,44 @@
|
||||
# Migration Guide
|
||||
|
||||
## v1.x to v2.x
|
||||
|
||||
### General
|
||||
|
||||
1. The `enableDLNA` key has been moved from the top level to the `jellyfin` subkey.
|
||||
2. Some renames have occurred to align with the standard:
|
||||
```yaml
|
||||
extraPodLabels -> podLabels
|
||||
extraPodAnnotations -> podAnnotations
|
||||
```
|
||||
3. The `extraEnvVars` key has been moved and renamed to `jellyfin.env`.
|
||||
4. `extraVolumes` has been moved to `volumes`, and `extraVolumeMounts` has been moved to `volumeMounts`.
|
||||
5. The `extraExistingClaimMounts` key has been removed, as it can now be represented with `volumes` and `volumeMounts`.
|
||||
|
||||
### Service
|
||||
|
||||
1. The `name` field has been renamed to `portName` for consistency.
|
||||
2. The following fields have been added:
|
||||
```yaml
|
||||
# -- Configure dual-stack IP family policy. See: https://kubernetes.io/docs/concepts/services-networking/dual-stack/
|
||||
ipFamilyPolicy: ""
|
||||
# -- Supported IP families (IPv4, IPv6).
|
||||
ipFamilies: []
|
||||
# -- Class of the LoadBalancer.
|
||||
loadBalancerClass: ""
|
||||
# -- External traffic policy (Cluster or Local).
|
||||
# externalTrafficPolicy: Cluster
|
||||
```
|
||||
|
||||
### Ingress
|
||||
|
||||
1. The `className` field has been added for ingress class, as annotations are deprecated.
|
||||
2. The `path` field has been moved under the `hosts` key to better represent the actual CRD, providing more fine-grained control.
|
||||
3. The `labels` field has been added for additional labels.
|
||||
|
||||
### Persistence
|
||||
|
||||
PVC creation is now enabled by default to prevent data loss when the chart is used without a specific configuration.
|
||||
|
||||
### Probes
|
||||
|
||||
The liveness and readiness probes are now always enabled to ensure proper Kubernetes lifecycle management. Adjust the values accordingly if you have a large library.
|
||||
+100
-43
@@ -1,8 +1,8 @@
|
||||
# jellyfin
|
||||
|
||||
  
|
||||
  
|
||||
|
||||
Jellyfin Media Server
|
||||
A Helm chart for Jellyfin Media Server
|
||||
|
||||
**Homepage:** <https://jellyfin.org/>
|
||||
|
||||
@@ -13,7 +13,7 @@ Jellyfin Media Server
|
||||
Helm repositories contain collections of charts. You can add an existing repository using the following command:
|
||||
|
||||
```bash
|
||||
helm repo add <repo-name> <repo-url>
|
||||
helm repo add jellyfin https://jellyfin.github.io/jellyfin-helm
|
||||
```
|
||||
|
||||
### 2. Install the Helm Chart
|
||||
@@ -21,7 +21,7 @@ helm repo add <repo-name> <repo-url>
|
||||
To install a chart, use the following command:
|
||||
|
||||
```bash
|
||||
helm install <release-name> <repo-name>/jellyfin
|
||||
helm install my-jellyfin jellyfin/jellyfin
|
||||
```
|
||||
|
||||
### 3. View the Installation
|
||||
@@ -29,7 +29,7 @@ helm install <release-name> <repo-name>/jellyfin
|
||||
You can check the status of the release using:
|
||||
|
||||
```bash
|
||||
helm status <release-name>
|
||||
helm status my-jellyfin
|
||||
```
|
||||
|
||||
## Customizing the Chart
|
||||
@@ -38,58 +38,115 @@ Helm charts come with default values, but you can customize them by using the --
|
||||
|
||||
### 1. Using --set to Override Values
|
||||
```bash
|
||||
helm install <release-name> <chart-name> --set key1=value1,key2=value2
|
||||
helm install my-jellyfin jellyfin/jellyfin --set key1=value1,key2=value2
|
||||
```
|
||||
|
||||
### 2. Using a values.yaml File
|
||||
You can create a custom values.yaml file and pass it to the install command:
|
||||
|
||||
```bash
|
||||
helm install <release-name> <chart-name> -f values.yaml
|
||||
helm install my-jellyfin jellyfin/jellyfin -f values.yaml
|
||||
```
|
||||
|
||||
## Values
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| affinity | object | `{}` | |
|
||||
| enableDLNA | bool | `false` | Setting this to true enables DLNA which requires the pod to be attached to the host network in order to be useful - this can break things like ingress to the service https://jellyfin.org/docs/general/networking/dlna.html |
|
||||
| extraContainers | object | `{}` | additional sidecar containers to run inside the pod. |
|
||||
| extraEnvVars | list | `[]` | aditional environment variables passed to the pod |
|
||||
| extraPodAnnotations | object | `{}` | additional annotations applied to the pod |
|
||||
| extraPodLabels | object | `{}` | additional pod labels. Not used as a selector label. |
|
||||
| extraVolumeMounts | list | `[]` | Define mount points for additional volumes. |
|
||||
| extraVolumes | list | `[]` | Define additional volumes to mount to the pod. |
|
||||
| fullnameOverride | string | `""` | |
|
||||
| image.pullPolicy | string | `"IfNotPresent"` | |
|
||||
| image.repository | string | `"docker.io/jellyfin/jellyfin"` | Set cutom repository for jellyfin image |
|
||||
| image.tag | string | `""` | Set jellyfin version which should be required since chart is updated with new versions automatically |
|
||||
| ingress.annotations | object | `{}` | |
|
||||
| ingress.enabled | bool | `false` | |
|
||||
| ingress.hosts[0] | string | `"chart-example.local"` | |
|
||||
| ingress.path | string | `"/"` | |
|
||||
| ingress.tls | list | `[]` | |
|
||||
| livenessProbe | object | `{"enabled":true,"initialDelaySeconds":10}` | Larger libraries may need to increase the readinessProbe and livenessProbe timeouts. Start by increasing the initialDelaySeconds. |
|
||||
| nameOverride | string | `""` | |
|
||||
| nodeSelector | object | `{}` | |
|
||||
| affinity | object | `{}` | Affinity rules for pod scheduling. |
|
||||
| deploymentStrategy | object | `{"type":"RollingUpdate"}` | Deployment strategy configuration. See `kubectl explain deployment.spec.strategy`. |
|
||||
| extraContainers | list | `[]` | additional sidecar containers to run inside the pod. |
|
||||
| extraInitContainers | list | `[]` | additional init containers to run inside the pod. |
|
||||
| fullnameOverride | string | `""` | Override the default full name of the chart. |
|
||||
| image.pullPolicy | string | `"IfNotPresent"` | Image pull policy (Always, IfNotPresent, or Never). |
|
||||
| image.repository | string | `"docker.io/jellyfin/jellyfin"` | Container image repository for Jellyfin. |
|
||||
| image.tag | string | `""` | Jellyfin container image tag. Leave empty to automatically use the Chart's app version. |
|
||||
| imagePullSecrets | list | `[]` | Image pull secrets to authenticate with private repositories. See: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ |
|
||||
| ingress | object | `{"annotations":{},"className":"","enabled":false,"hosts":[{"host":"chart-example.local","paths":[{"path":"/","pathType":"ImplementationSpecific"}]}],"tls":[]}` | Ingress configuration. See: https://kubernetes.io/docs/concepts/services-networking/ingress/ |
|
||||
| jellyfin.args | list | `[]` | Additional arguments for the entrypoint command. |
|
||||
| jellyfin.command | list | `[]` | Custom command to use as container entrypoint. |
|
||||
| jellyfin.enableDLNA | bool | `false` | Enable DLNA. Requires host network. See: https://jellyfin.org/docs/general/networking/dlna.html |
|
||||
| jellyfin.env | list | `[]` | Additional environment variables for the container. |
|
||||
| livenessProbe | object | `{"initialDelaySeconds":10,"tcpSocket":{"port":"http"}}` | Configure liveness probe for Jellyfin. |
|
||||
| metrics | object | `{"command":["bash","-c","sed 's,<EnableMetrics>false</EnableMetrics>,<EnableMetrics>true</EnableMetrics>,' -i /config/config/system.xml && /jellyfin/jellyfin"],"enabled":false,"serviceMonitor":{"enabled":false,"interval":"30s","labels":{},"metricRelabelings":[],"namespace":"","path":"/metrics","port":8096,"relabelings":[],"scheme":"http","scrapeTimeout":"30s","targetLabels":[],"tlsConfig":{}}}` | Configuration for metrics collection and monitoring |
|
||||
| metrics.enabled | bool | `false` | Enable or disable metrics collection - Ensure you have started and configured your Jellyfin instance first as this will fail if system.xml does not exist yet. |
|
||||
| metrics.serviceMonitor | object | `{"enabled":false,"interval":"30s","labels":{},"metricRelabelings":[],"namespace":"","path":"/metrics","port":8096,"relabelings":[],"scheme":"http","scrapeTimeout":"30s","targetLabels":[],"tlsConfig":{}}` | Configuration for the Prometheus ServiceMonitor |
|
||||
| metrics.serviceMonitor.enabled | bool | `false` | Enable or disable the creation of a ServiceMonitor resource |
|
||||
| metrics.serviceMonitor.interval | string | `"30s"` | Interval at which metrics should be scraped |
|
||||
| metrics.serviceMonitor.labels | object | `{}` | Labels to add to the ServiceMonitor resource |
|
||||
| metrics.serviceMonitor.metricRelabelings | list | `[]` | Relabeling rules for the metrics before ingestion |
|
||||
| metrics.serviceMonitor.namespace | string | `""` | Namespace where the ServiceMonitor resource should be created. Defaults to Release.Namespace |
|
||||
| metrics.serviceMonitor.path | string | `"/metrics"` | Path to scrape for metrics |
|
||||
| metrics.serviceMonitor.port | int | `8096` | Port to scrape for metrics |
|
||||
| metrics.serviceMonitor.relabelings | list | `[]` | Relabeling rules for the scraped metrics |
|
||||
| metrics.serviceMonitor.scheme | string | `"http"` | Scheme to use for scraping metrics (http or https) |
|
||||
| metrics.serviceMonitor.scrapeTimeout | string | `"30s"` | Timeout for scraping metrics |
|
||||
| metrics.serviceMonitor.targetLabels | list | `[]` | Target labels to add to the scraped metrics |
|
||||
| metrics.serviceMonitor.tlsConfig | object | `{}` | TLS configuration for scraping metrics |
|
||||
| nameOverride | string | `""` | Override the default name of the chart. |
|
||||
| nodeSelector | object | `{}` | Node selector for pod scheduling. |
|
||||
| persistence.config.accessMode | string | `"ReadWriteOnce"` | |
|
||||
| persistence.config.enabled | bool | `false` | |
|
||||
| persistence.config.size | string | `"1Gi"` | |
|
||||
| persistence.config.storageClass | string | `"-"` | If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. |
|
||||
| persistence.extraExistingClaimMounts | list | `[]` | Add aditional PVs/PVCs to our container. Check values.yaml to see an example. |
|
||||
| persistence.config.annotations | object | `{}` | Custom annotations to be added to the PVC |
|
||||
| persistence.config.enabled | bool | `true` | set to false to use emptyDir |
|
||||
| persistence.config.size | string | `"5Gi"` | |
|
||||
| persistence.config.storageClass | string | `""` | If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. |
|
||||
| persistence.media.accessMode | string | `"ReadWriteOnce"` | |
|
||||
| persistence.media.enabled | bool | `false` | |
|
||||
| persistence.media.size | string | `"10Gi"` | |
|
||||
| persistence.media.storageClass | string | `"-"` | If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. |
|
||||
| readinessProbe | object | `{"enabled":true,"initialDelaySeconds":10}` | Larger libraries may need to increase the readinessProbe and livenessProbe timeouts. Start by increasing the initialDelaySeconds. |
|
||||
| replicaCount | int | `1` | Number of jellyfin replicas to start. Should be left at 1 |
|
||||
| resources | object | `{}` | |
|
||||
| service.annotations | object | `{}` | |
|
||||
| service.labels | object | `{}` | |
|
||||
| service.loadBalancerIP | string | `nil` | |
|
||||
| service.port | int | `8096` | |
|
||||
| service.type | string | `"ClusterIP"` | |
|
||||
| tolerations | list | `[]` | |
|
||||
| persistence.media.annotations | object | `{}` | Custom annotations to be added to the PVC |
|
||||
| persistence.media.enabled | bool | `true` | set to false to use emptyDir |
|
||||
| persistence.media.size | string | `"25Gi"` | |
|
||||
| persistence.media.storageClass | string | `""` | If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. |
|
||||
| podAnnotations | object | `{}` | Annotations to add to the pod. |
|
||||
| podLabels | object | `{}` | Additional labels to add to the pod. |
|
||||
| podSecurityContext | object | `{}` | Security context for the pod. |
|
||||
| readinessProbe | object | `{"initialDelaySeconds":10,"tcpSocket":{"port":"http"}}` | Configure readiness probe for Jellyfin. |
|
||||
| replicaCount | int | `1` | Number of Jellyfin replicas to start. Should be left at 1. |
|
||||
| resources | object | `{}` | Resource requests and limits for the Jellyfin container. |
|
||||
| runtimeClassName | string | `""` | Define a custom runtimeClassName for the pod. |
|
||||
| securityContext | object | `{}` | Security context for the container. |
|
||||
| service.annotations | object | `{}` | Annotations for the service. |
|
||||
| service.ipFamilies | list | `[]` | Supported IP families (IPv4, IPv6). |
|
||||
| service.ipFamilyPolicy | string | `""` | Configure dual-stack IP family policy. See: https://kubernetes.io/docs/concepts/services-networking/dual-stack/ |
|
||||
| service.labels | object | `{}` | Labels for the service. |
|
||||
| service.loadBalancerClass | string | `""` | Class of the LoadBalancer. |
|
||||
| service.loadBalancerIP | string | `""` | Specific IP address for the LoadBalancer. |
|
||||
| service.loadBalancerSourceRanges | list | `[]` | Source ranges allowed to access the LoadBalancer. |
|
||||
| service.port | int | `8096` | Port for the Jellyfin service. |
|
||||
| service.portName | string | `"service"` | Name of the port in the service. |
|
||||
| service.type | string | `"ClusterIP"` | Service type (ClusterIP, NodePort, or LoadBalancer). |
|
||||
| serviceAccount | object | `{"annotations":{},"automount":true,"create":true,"name":""}` | Service account configuration. See: https://kubernetes.io/docs/concepts/security/service-accounts/ |
|
||||
| serviceAccount.annotations | object | `{}` | Annotations for the service account. |
|
||||
| serviceAccount.automount | bool | `true` | Automatically mount API credentials for the service account. |
|
||||
| serviceAccount.create | bool | `true` | Specifies whether to create a service account. |
|
||||
| serviceAccount.name | string | `""` | Custom name for the service account. If left empty, the name will be autogenerated. |
|
||||
| tolerations | list | `[]` | Tolerations for pod scheduling. |
|
||||
| volumeMounts | list | `[]` | Additional volume mounts for the Jellyfin container. |
|
||||
| volumes | list | `[]` | Additional volumes to mount in the Jellyfin pod. |
|
||||
|
||||
----------------------------------------------
|
||||
Autogenerated from chart metadata using [helm-docs v1.14.2](https://github.com/norwoodj/helm-docs/releases/v1.14.2)
|
||||
|
||||
## Hardware acceleration
|
||||
|
||||
Out of the box the pod does not have the necessary permissions to enable hardware acceleration (HWA) in Jellyfin.
|
||||
Adding the following Helm values should make it enable you to use hardware acceleration features.
|
||||
Some settings may need to be tweaked depending on the type of device (Intel/AMD/NVIDIA/...) and your container runtime.
|
||||
|
||||
Please refer to the Jellyfin upstream documentation for more information about hardware acceleration: <https://jellyfin.org/docs/general/administration/hardware-acceleration/>
|
||||
|
||||
```yaml
|
||||
securityContext:
|
||||
capabilities:
|
||||
add:
|
||||
- "SYS_ADMIN"
|
||||
drop:
|
||||
- "ALL"
|
||||
privileged: false
|
||||
|
||||
extraVolumes:
|
||||
- name: hwa
|
||||
hostPath:
|
||||
path: /dev/dri
|
||||
|
||||
extraVolumeMounts:
|
||||
- name: hwa
|
||||
mountPath: /dev/dri
|
||||
```
|
||||
@@ -14,7 +14,7 @@
|
||||
Helm repositories contain collections of charts. You can add an existing repository using the following command:
|
||||
|
||||
```bash
|
||||
helm repo add <repo-name> <repo-url>
|
||||
helm repo add jellyfin https://jellyfin.github.io/jellyfin-helm
|
||||
```
|
||||
|
||||
### 2. Install the Helm Chart
|
||||
@@ -22,7 +22,7 @@ helm repo add <repo-name> <repo-url>
|
||||
To install a chart, use the following command:
|
||||
|
||||
```bash
|
||||
helm install <release-name> <repo-name>/jellyfin
|
||||
helm install my-jellyfin jellyfin/jellyfin
|
||||
```
|
||||
|
||||
### 3. View the Installation
|
||||
@@ -30,7 +30,7 @@ helm install <release-name> <repo-name>/jellyfin
|
||||
You can check the status of the release using:
|
||||
|
||||
```bash
|
||||
helm status <release-name>
|
||||
helm status my-jellyfin
|
||||
```
|
||||
|
||||
## Customizing the Chart
|
||||
@@ -39,14 +39,14 @@ Helm charts come with default values, but you can customize them by using the --
|
||||
|
||||
### 1. Using --set to Override Values
|
||||
```bash
|
||||
helm install <release-name> <chart-name> --set key1=value1,key2=value2
|
||||
helm install my-jellyfin jellyfin/jellyfin --set key1=value1,key2=value2
|
||||
```
|
||||
|
||||
### 2. Using a values.yaml File
|
||||
You can create a custom values.yaml file and pass it to the install command:
|
||||
|
||||
```bash
|
||||
helm install <release-name> <chart-name> -f values.yaml
|
||||
helm install my-jellyfin jellyfin/jellyfin -f values.yaml
|
||||
```
|
||||
|
||||
{{ template "chart.maintainersSection" . }}
|
||||
@@ -58,3 +58,30 @@ helm install <release-name> <chart-name> -f values.yaml
|
||||
{{ template "chart.valuesSection" . }}
|
||||
|
||||
{{ template "helm-docs.versionFooter" . }}
|
||||
|
||||
## Hardware acceleration
|
||||
|
||||
Out of the box the pod does not have the necessary permissions to enable hardware acceleration (HWA) in Jellyfin.
|
||||
Adding the following Helm values should make it enable you to use hardware acceleration features.
|
||||
Some settings may need to be tweaked depending on the type of device (Intel/AMD/NVIDIA/...) and your container runtime.
|
||||
|
||||
Please refer to the Jellyfin upstream documentation for more information about hardware acceleration: <https://jellyfin.org/docs/general/administration/hardware-acceleration/>
|
||||
|
||||
```yaml
|
||||
securityContext:
|
||||
capabilities:
|
||||
add:
|
||||
- "SYS_ADMIN"
|
||||
drop:
|
||||
- "ALL"
|
||||
privileged: false
|
||||
|
||||
extraVolumes:
|
||||
- name: hwa
|
||||
hostPath:
|
||||
path: /dev/dri
|
||||
|
||||
extraVolumeMounts:
|
||||
- name: hwa
|
||||
mountPath: /dev/dri
|
||||
```
|
||||
@@ -1,19 +0,0 @@
|
||||
1. Get the application URL by running these commands:
|
||||
{{- if .Values.ingress.enabled }}
|
||||
{{- range .Values.ingress.hosts }}
|
||||
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ . }}{{ $.Values.ingress.path }}
|
||||
{{- end }}
|
||||
{{- else if contains "NodePort" .Values.service.type }}
|
||||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "jellyfin.fullname" . }})
|
||||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||
echo http://$NODE_IP:$NODE_PORT
|
||||
{{- else if contains "LoadBalancer" .Values.service.type }}
|
||||
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||
You can watch the status of by running 'kubectl get svc -w {{ include "jellyfin.fullname" . }}'
|
||||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "jellyfin.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
|
||||
echo http://$SERVICE_IP:{{ .Values.service.port }}
|
||||
{{- else if contains "ClusterIP" .Values.service.type }}
|
||||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "jellyfin.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
||||
Visit http://127.0.0.1:8080 to use your application
|
||||
kubectl port-forward $POD_NAME 8080:80
|
||||
{{- end }}
|
||||
@@ -1,10 +1,16 @@
|
||||
{{/* vim: set filetype=mustache: */}}
|
||||
{{/*
|
||||
Fail if command and metrics are set
|
||||
*/}}
|
||||
{{- if and .Values.image.command .Values.metrics.enabled }}
|
||||
{{- fail "Can't use custom command and metrics in combination. They are exclusive features" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "jellyfin.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
@@ -12,21 +18,52 @@ We truncate at 63 chars because some Kubernetes name fields are limited to this
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "jellyfin.fullname" -}}
|
||||
{{- if .Values.fullnameOverride -}}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
|
||||
{{- else -}}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride -}}
|
||||
{{- if contains $name .Release.Name -}}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
|
||||
{{- else -}}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "jellyfin.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "jellyfin.labels" -}}
|
||||
helm.sh/chart: {{ include "jellyfin.chart" . }}
|
||||
{{ include "jellyfin.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "jellyfin.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "jellyfin.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "jellyfin.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "jellyfin.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -1,25 +0,0 @@
|
||||
|
||||
{{- if and .Values.persistence.config.enabled (not .Values.persistence.config.existingClaim) }}
|
||||
kind: PersistentVolumeClaim
|
||||
apiVersion: v1
|
||||
metadata:
|
||||
name: {{ template "jellyfin.fullname" . }}-config
|
||||
labels:
|
||||
app.kubernetes.io/name: {{ include "jellyfin.name" . }}
|
||||
helm.sh/chart: {{ include "jellyfin.chart" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
spec:
|
||||
accessModes:
|
||||
- {{ .Values.persistence.config.accessMode | quote }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.persistence.config.size | quote }}
|
||||
{{- if .Values.persistence.config.storageClass }}
|
||||
{{- if (eq "-" .Values.persistence.config.storageClass) }}
|
||||
storageClassName: ""
|
||||
{{- else }}
|
||||
storageClassName: "{{ .Values.persistence.config.storageClass }}"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
@@ -3,148 +3,121 @@ kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "jellyfin.fullname" . }}
|
||||
labels:
|
||||
app.kubernetes.io/name: {{ include "jellyfin.name" . }}
|
||||
helm.sh/chart: {{ include "jellyfin.chart" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- include "jellyfin.labels" . | nindent 4 }}
|
||||
spec:
|
||||
{{- with .Values.deploymentStrategy }}
|
||||
strategy:
|
||||
type: Recreate
|
||||
{{- toYaml . | trim | nindent 4 }}
|
||||
{{- end }}
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
selector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/name: {{ include "jellyfin.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- include "jellyfin.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/name: {{ include "jellyfin.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- with .Values.extraPodLabels }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.extraPodAnnotations }}
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "jellyfin.labels" . | nindent 8 }}
|
||||
{{- with .Values.podLabels }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if .Values.enableDLNA }}
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "jellyfin.serviceAccountName" . }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
{{- if .Values.jellyfin.enableDLNA }}
|
||||
hostNetwork: true
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: {{ .Chart.Name }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
{{ if .Values.extraEnvVars }}
|
||||
{{- if and .Values.image.command (not .Values.metrics.enabled) }}
|
||||
command:
|
||||
{{- toYaml .Values.jellyfin.command | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if .Values.metrics.enabled }}
|
||||
command:
|
||||
{{- toYaml .Values.metrics.command | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- with .Values.jellyfin.args }}
|
||||
args:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- with .Values.jellyfin.env }}
|
||||
env:
|
||||
{{- toYaml .Values.extraEnvVars | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: 8096
|
||||
protocol: TCP
|
||||
{{ if .Values.enableDLNA }}
|
||||
{{- if .Values.jellyfin.enableDLNA }}
|
||||
- name: dlna
|
||||
containerPort: 1900
|
||||
hostPort: 1900
|
||||
protocol: UDP
|
||||
{{- end }}
|
||||
{{ if .Values.livenessProbe.enabled }}
|
||||
{{- end }}
|
||||
livenessProbe:
|
||||
{{ if .Values.livenessProbe.initialDelaySeconds }}
|
||||
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
|
||||
{{- end }}
|
||||
{{ if .Values.livenessProbe.periodSeconds }}
|
||||
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
|
||||
{{- end }}
|
||||
{{ if .Values.livenessProbe.timeoutSeconds }}
|
||||
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
|
||||
{{- end }}
|
||||
{{ if .Values.livenessProbe.failureThreshold }}
|
||||
failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
|
||||
{{- end }}
|
||||
{{ if .Values.livenessProbe.successThreshold }}
|
||||
successThreshold: {{ .Values.livenessProbe.successThreshold }}
|
||||
{{- end }}
|
||||
tcpSocket:
|
||||
port: http
|
||||
{{- end }}
|
||||
{{ if .Values.readinessProbe.enabled }}
|
||||
{{- toYaml .Values.livenessProbe | nindent 12 }}
|
||||
readinessProbe:
|
||||
{{ if .Values.readinessProbe.initialDelaySeconds }}
|
||||
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
|
||||
{{- end }}
|
||||
{{ if .Values.readinessProbe.periodSeconds }}
|
||||
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
|
||||
{{- end }}
|
||||
{{ if .Values.readinessProbe.timeoutSeconds }}
|
||||
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
|
||||
{{- end }}
|
||||
{{ if .Values.readinessProbe.failureThreshold }}
|
||||
failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
|
||||
{{- end }}
|
||||
{{ if .Values.readinessProbe.successThreshold }}
|
||||
successThreshold: {{ .Values.readinessProbe.successThreshold }}
|
||||
{{- end }}
|
||||
tcpSocket:
|
||||
port: http
|
||||
{{- end }}
|
||||
{{- toYaml .Values.readinessProbe | nindent 12 }}
|
||||
resources:
|
||||
{{- toYaml .Values.resources | nindent 12 }}
|
||||
volumeMounts:
|
||||
- mountPath: /config
|
||||
name: config
|
||||
{{- if .Values.persistence.config.subPath }}
|
||||
subPath: {{ .Values.persistence.config.subPath }}
|
||||
{{- end }}
|
||||
- mountPath: /media
|
||||
name: media
|
||||
{{- if .Values.persistence.media.subPath }}
|
||||
subPath: {{ .Values.persistence.media.subPath }}
|
||||
{{- with .Values.volumeMounts }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- range .Values.persistence.extraExistingClaimMounts }}
|
||||
- name: {{ .name }}
|
||||
mountPath: {{ .mountPath }}
|
||||
readOnly: {{ .readOnly }}
|
||||
{{- end }}
|
||||
{{- if .Values.extraVolumeMounts }}
|
||||
{{- toYaml .Values.extraVolumeMounts | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if .Values.extraContainers }}
|
||||
{{- toYaml .Values.extraContainers | nindent 10 }}
|
||||
{{- end }}
|
||||
resources:
|
||||
{{ toYaml .Values.resources | indent 12 }}
|
||||
{{- with .Values.extraContainers }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.initContainers }}
|
||||
initContainers:
|
||||
{{- toYaml . | nindent 6 }}
|
||||
{{- end }}
|
||||
volumes:
|
||||
- name: config
|
||||
{{- if .Values.persistence.config.enabled }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ if .Values.persistence.config.existingClaim }}{{ .Values.persistence.config.existingClaim }}{{- else }}{{ template "jellyfin.fullname" . }}-config{{- end }}
|
||||
{{- else }}
|
||||
emptyDir: {}
|
||||
{{- end }}
|
||||
- name: media
|
||||
{{- if .Values.persistence.media.enabled }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ if .Values.persistence.media.existingClaim }}{{ .Values.persistence.media.existingClaim }}{{- else }}{{ template "jellyfin.fullname" . }}-media{{- end }}
|
||||
{{- else }}
|
||||
emptyDir: {}
|
||||
{{- end }}
|
||||
{{- range .Values.persistence.extraExistingClaimMounts }}
|
||||
- name: {{ .name }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ .existingClaim }}
|
||||
{{- end }}
|
||||
{{- if .Values.extraVolumes }}
|
||||
{{- toYaml .Values.extraVolumes | nindent 6 }}
|
||||
{{- end }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
- name: config
|
||||
{{- if .Values.persistence.config.enabled }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ if .Values.persistence.config.existingClaim }}{{ .Values.persistence.config.existingClaim }}{{- else }}{{ template "jellyfin.fullname" . }}-config{{- end }}
|
||||
{{- else }}
|
||||
emptyDir: {}
|
||||
{{- end }}
|
||||
- name: media
|
||||
{{- if .Values.persistence.media.enabled }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ if .Values.persistence.media.existingClaim }}{{ .Values.persistence.media.existingClaim }}{{- else }}{{ template "jellyfin.fullname" . }}-media{{- end }}
|
||||
{{- else }}
|
||||
emptyDir: {}
|
||||
{{- end }}
|
||||
{{- with .Values.volumes }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{ toYaml . | indent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{ toYaml . | indent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{ toYaml . | indent 8 }}
|
||||
{{- end }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.runtimeClassName }}
|
||||
runtimeClassName: {{ . | quote }}
|
||||
{{- end }}
|
||||
@@ -1,46 +1,43 @@
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
{{- $fullName := include "jellyfin.fullname" . -}}
|
||||
{{- $ingressPath := .Values.ingress.path -}}
|
||||
{{- if .Values.ingress.enabled }}
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ $fullName }}
|
||||
name: {{ include "jellyfin.fullname" . }}
|
||||
labels:
|
||||
app.kubernetes.io/name: {{ include "jellyfin.name" . }}
|
||||
helm.sh/chart: {{ include "jellyfin.chart" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- with .Values.ingress.annotations }}
|
||||
{{- include "jellyfin.labels" . | nindent 4 }}
|
||||
{{- with .Values.ingress.annotations }}
|
||||
annotations:
|
||||
{{ toYaml . | indent 4 }}
|
||||
{{- end }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if or (.Capabilities.APIVersions.Has "networking.k8s.io/v1/IngressClass") (.Capabilities.APIVersions.Has "networking.k8s.io/v1beta1/IngressClass") }}
|
||||
{{- if .Values.ingress.ingressClassName }}
|
||||
ingressClassName: {{ .Values.ingress.ingressClassName }}
|
||||
{{- with .Values.ingress.className }}
|
||||
ingressClassName: {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.ingress.tls }}
|
||||
{{- if .Values.ingress.tls }}
|
||||
tls:
|
||||
{{- range .Values.ingress.tls }}
|
||||
{{- range .Values.ingress.tls }}
|
||||
- hosts:
|
||||
{{- range .hosts }}
|
||||
{{- range .hosts }}
|
||||
- {{ . | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
secretName: {{ .secretName }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
rules:
|
||||
{{- range .Values.ingress.hosts }}
|
||||
- host: {{ . | quote }}
|
||||
{{- range .Values.ingress.hosts }}
|
||||
- host: {{ .host | quote }}
|
||||
http:
|
||||
paths:
|
||||
- pathType: Prefix
|
||||
path: {{ $ingressPath }}
|
||||
{{- range .paths }}
|
||||
- path: {{ .path }}
|
||||
{{- with .pathType }}
|
||||
pathType: {{ . }}
|
||||
{{- end }}
|
||||
backend:
|
||||
service:
|
||||
name: {{ $fullName }}
|
||||
name: {{ include "jellyfin.fullname" $ }}
|
||||
port:
|
||||
name: http
|
||||
{{- end }}
|
||||
number: {{ $.Values.service.port }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -1,25 +0,0 @@
|
||||
|
||||
{{- if and .Values.persistence.media.enabled (not .Values.persistence.media.existingClaim) }}
|
||||
kind: PersistentVolumeClaim
|
||||
apiVersion: v1
|
||||
metadata:
|
||||
name: {{ template "jellyfin.fullname" . }}-media
|
||||
labels:
|
||||
app.kubernetes.io/name: {{ include "jellyfin.name" . }}
|
||||
helm.sh/chart: {{ include "jellyfin.chart" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
spec:
|
||||
accessModes:
|
||||
- {{ .Values.persistence.media.accessMode | quote }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.persistence.media.size | quote }}
|
||||
{{- if .Values.persistence.media.storageClass }}
|
||||
{{- if (eq "-" .Values.persistence.media.storageClass) }}
|
||||
storageClassName: ""
|
||||
{{- else }}
|
||||
storageClassName: "{{ .Values.persistence.media.storageClass }}"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
@@ -0,0 +1,45 @@
|
||||
{{- if and .Values.persistence.config.enabled (not .Values.persistence.config.existingClaim) }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: {{ include "jellyfin.fullname" . }}-config
|
||||
labels:
|
||||
{{- include "jellyfin.labels" . | nindent 4 }}
|
||||
{{- with .Values.persistence.config.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
accessModes:
|
||||
- {{ .Values.persistence.config.accessMode | quote }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.persistence.config.size | quote }}
|
||||
{{- with .Values.persistence.config.storageClass }}
|
||||
storageClassName: {{ . | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if and .Values.persistence.media.enabled (not .Values.persistence.media.existingClaim) }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: {{ include "jellyfin.fullname" . }}-media
|
||||
labels:
|
||||
{{- include "jellyfin.labels" . | nindent 4 }}
|
||||
{{- with .Values.persistence.media.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
accessModes:
|
||||
- {{ .Values.persistence.media.accessMode | quote }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.persistence.media.size | quote }}
|
||||
{{- with .Values.persistence.media.storageClass }}
|
||||
storageClassName: {{ . | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -1,52 +1,58 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ template "jellyfin.fullname" . }}
|
||||
name: {{ include "jellyfin.fullname" . }}
|
||||
labels:
|
||||
app.kubernetes.io/name: {{ include "jellyfin.name" . }}
|
||||
helm.sh/chart: {{ include "jellyfin.chart" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- if .Values.service.labels }}
|
||||
{{ toYaml .Values.service.labels | indent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.annotations }}
|
||||
{{- include "jellyfin.labels" . | nindent 4 }}
|
||||
{{- with .Values.service.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.annotations }}
|
||||
annotations:
|
||||
{{ toYaml . | indent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if (or (eq .Values.service.type "ClusterIP") (empty .Values.service.type)) }}
|
||||
type: ClusterIP
|
||||
{{- if .Values.service.clusterIP }}
|
||||
clusterIP: {{ .Values.service.clusterIP }}
|
||||
{{end}}
|
||||
{{- else if eq .Values.service.type "LoadBalancer" }}
|
||||
type: {{ .Values.service.type }}
|
||||
{{- if .Values.service.loadBalancerIP }}
|
||||
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- if .Values.service.loadBalancerSourceRanges }}
|
||||
spec:
|
||||
{{- if (or (eq .Values.service.type "ClusterIP") (empty .Values.service.type)) }}
|
||||
type: ClusterIP
|
||||
{{- with .Values.service.clusterIP }}
|
||||
clusterIP: {{ . }}
|
||||
{{- end }}
|
||||
{{- else if eq .Values.service.type "LoadBalancer" }}
|
||||
type: LoadBalancer
|
||||
{{- with .Values.service.loadBalancerIP }}
|
||||
loadBalancerIP: {{ . }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.loadBalancerClass }}
|
||||
loadBalancerClass: {{ . }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.loadBalancerSourceRanges }}
|
||||
loadBalancerSourceRanges:
|
||||
{{ toYaml .Values.service.loadBalancerSourceRanges | indent 4 }}
|
||||
{{- end -}}
|
||||
{{- else }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
type: {{ .Values.service.type }}
|
||||
{{- end }}
|
||||
{{- if .Values.service.externalIPs }}
|
||||
{{- end }}
|
||||
{{- if .Values.service.ipFamilyPolicy }}
|
||||
ipFamilyPolicy: {{ .Values.service.ipFamilyPolicy }}
|
||||
{{- end }}
|
||||
{{- if .Values.service.ipFamilies }}
|
||||
ipFamilies:
|
||||
{{- toYaml .Values.service.ipFamilies | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.externalIPs }}
|
||||
externalIPs:
|
||||
{{ toYaml .Values.service.externalIPs | indent 4 }}
|
||||
{{- end }}
|
||||
{{- if .Values.service.externalTrafficPolicy }}
|
||||
externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.externalTrafficPolicy }}
|
||||
externalTrafficPolicy: {{ . }}
|
||||
{{- end }}
|
||||
ports:
|
||||
- name: http
|
||||
- name: {{ .Values.service.name | default "http" }}
|
||||
port: {{ .Values.service.port }}
|
||||
protocol: TCP
|
||||
targetPort: http
|
||||
{{ if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }}
|
||||
nodePort: {{.Values.service.nodePort}}
|
||||
{{ end }}
|
||||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }}
|
||||
nodePort: {{ .Values.service.nodePort }}
|
||||
{{- end }}
|
||||
selector:
|
||||
app.kubernetes.io/name: {{ include "jellyfin.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- include "jellyfin.selectorLabels" . | nindent 4 }}
|
||||
@@ -0,0 +1,48 @@
|
||||
{{- if and .Values.metrics.serviceMonitor.enabled .Values.metrics.enabled }}
|
||||
---
|
||||
apiVersion: monitoring.coreos.com/v1
|
||||
kind: ServiceMonitor
|
||||
metadata:
|
||||
name: {{ include "jellyfin.fullname" . }}
|
||||
{{- if .Values.metrics.serviceMonitor.namespace }}
|
||||
namespace: {{ tpl .Values.metrics.serviceMonitor.namespace . }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "jellyfin.labels" . | nindent 4 }}
|
||||
{{- with .Values.metrics.serviceMonitor.labels }}
|
||||
{{- tpl (toYaml . | nindent 4) $ }}
|
||||
{{- end }}
|
||||
spec:
|
||||
endpoints:
|
||||
- port: {{ .Values.service.name | default "http" }}
|
||||
{{- with .Values.metrics.serviceMonitor.interval }}
|
||||
interval: {{ . }}
|
||||
{{- end }}
|
||||
{{- with .Values.metrics.serviceMonitor.scrapeTimeout }}
|
||||
scrapeTimeout: {{ . }}
|
||||
{{- end }}
|
||||
honorLabels: true
|
||||
path: {{ .Values.metrics.serviceMonitor.path }}
|
||||
scheme: {{ .Values.metrics.serviceMonitor.scheme }}
|
||||
{{- with .Values.metrics.serviceMonitor.tlsConfig }}
|
||||
tlsConfig:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.metrics.serviceMonitor.relabelings }}
|
||||
relabelings:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.metrics.serviceMonitor.metricRelabelings }}
|
||||
metricRelabelings:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
jobLabel: "{{ .Release.Name }}"
|
||||
selector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/name: {{ include "jellyfin.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- with .Values.metrics.serviceMonitor.targetLabels }}
|
||||
targetLabels:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,13 @@
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ include "jellyfin.serviceAccountName" . }}
|
||||
labels:
|
||||
{{- include "jellyfin.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
automountServiceAccountToken: {{ .Values.serviceAccount.automount }}
|
||||
{{- end }}
|
||||
+187
-98
@@ -1,142 +1,231 @@
|
||||
# -- Number of jellyfin replicas to start. Should be left at 1
|
||||
# Default values for Jellyfin.
|
||||
# This is a YAML-formatted file.
|
||||
|
||||
# -- Number of Jellyfin replicas to start. Should be left at 1.
|
||||
replicaCount: 1
|
||||
|
||||
# -- Image pull secrets to authenticate with private repositories.
|
||||
# See: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||
imagePullSecrets: []
|
||||
|
||||
image:
|
||||
# -- Set cutom repository for jellyfin image
|
||||
# -- Container image repository for Jellyfin.
|
||||
repository: docker.io/jellyfin/jellyfin
|
||||
# -- Set jellyfin version which should be required since chart is updated with new versions automatically
|
||||
# -- Jellyfin container image tag. Leave empty to automatically use the Chart's app version.
|
||||
tag: ""
|
||||
# -- Image pull policy (Always, IfNotPresent, or Never).
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
# -- Override the default name of the chart.
|
||||
nameOverride: ""
|
||||
# -- Override the default full name of the chart.
|
||||
fullnameOverride: ""
|
||||
|
||||
# -- Setting this to true enables DLNA which requires the pod to be attached to the
|
||||
# host network in order to be useful - this can break things like ingress to the service
|
||||
# https://jellyfin.org/docs/general/networking/dlna.html
|
||||
enableDLNA: false
|
||||
# -- Service account configuration. See: https://kubernetes.io/docs/concepts/security/service-accounts/
|
||||
serviceAccount:
|
||||
# -- Specifies whether to create a service account.
|
||||
create: true
|
||||
# -- Automatically mount API credentials for the service account.
|
||||
automount: true
|
||||
# -- Annotations for the service account.
|
||||
annotations: {}
|
||||
# -- Custom name for the service account. If left empty, the name will be autogenerated.
|
||||
name: ""
|
||||
|
||||
# -- Annotations to add to the pod.
|
||||
podAnnotations: {}
|
||||
# -- Additional labels to add to the pod.
|
||||
podLabels: {}
|
||||
|
||||
# -- Security context for the pod.
|
||||
podSecurityContext: {}
|
||||
# fsGroup: 2000
|
||||
|
||||
# -- Security context for the container.
|
||||
securityContext: {}
|
||||
# capabilities:
|
||||
# drop:
|
||||
# - ALL
|
||||
# readOnlyRootFilesystem: true
|
||||
# runAsNonRoot: true
|
||||
# runAsUser: 1000
|
||||
|
||||
# -- Define a custom runtimeClassName for the pod.
|
||||
runtimeClassName: ''
|
||||
|
||||
# -- Deployment strategy configuration. See `kubectl explain deployment.spec.strategy`.
|
||||
deploymentStrategy:
|
||||
type: RollingUpdate
|
||||
|
||||
service:
|
||||
# # -- Custom name for the service port
|
||||
# name: http
|
||||
# -- Service type (ClusterIP, NodePort, or LoadBalancer).
|
||||
type: ClusterIP
|
||||
# -- Configure dual-stack IP family policy. See: https://kubernetes.io/docs/concepts/services-networking/dual-stack/
|
||||
ipFamilyPolicy: ""
|
||||
# -- Supported IP families (IPv4, IPv6).
|
||||
ipFamilies: []
|
||||
# -- Specific IP address for the LoadBalancer.
|
||||
loadBalancerIP: ""
|
||||
# -- Class of the LoadBalancer.
|
||||
loadBalancerClass: ""
|
||||
# -- Source ranges allowed to access the LoadBalancer.
|
||||
loadBalancerSourceRanges: []
|
||||
# -- Port for the Jellyfin service.
|
||||
port: 8096
|
||||
## Specify the nodePort value for the LoadBalancer and NodePort service types.
|
||||
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
|
||||
##
|
||||
# nodePort:
|
||||
## Provide any additional annotations which may be required. This can be used to
|
||||
## set the LoadBalancer service type to internal only.
|
||||
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||
##
|
||||
# -- Name of the port in the service.
|
||||
portName: service
|
||||
# -- Annotations for the service.
|
||||
annotations: {}
|
||||
# -- Labels for the service.
|
||||
labels: {}
|
||||
## Use loadBalancerIP to request a specific static IP,
|
||||
## otherwise leave blank
|
||||
##
|
||||
loadBalancerIP:
|
||||
# loadBalancerSourceRanges: []
|
||||
## Set the externalTrafficPolicy in the Service to either Cluster or Local
|
||||
# -- External traffic policy (Cluster or Local).
|
||||
# externalTrafficPolicy: Cluster
|
||||
# -- NodePort for the service (if applicable).
|
||||
# nodePort:
|
||||
|
||||
# -- Ingress configuration. See: https://kubernetes.io/docs/concepts/services-networking/ingress/
|
||||
ingress:
|
||||
enabled: false
|
||||
className: ""
|
||||
annotations: {}
|
||||
# kubernetes.io/ingress.class: nginx
|
||||
# kubernetes.io/tls-acme: "true"
|
||||
path: /
|
||||
hosts:
|
||||
- chart-example.local
|
||||
- host: chart-example.local
|
||||
paths:
|
||||
- path: /
|
||||
pathType: ImplementationSpecific
|
||||
tls: []
|
||||
# - secretName: chart-example-tls
|
||||
# hosts:
|
||||
# - chart-example.local
|
||||
|
||||
persistence:
|
||||
config:
|
||||
enabled: false
|
||||
# -- If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner.
|
||||
storageClass: "-"
|
||||
## If you want to reuse an existing claim, you can pass the name of the PVC using
|
||||
## the existingClaim variable
|
||||
# existingClaim: your-claim
|
||||
# subPath: some-subpath
|
||||
accessMode: ReadWriteOnce
|
||||
size: 1Gi
|
||||
media:
|
||||
enabled: false
|
||||
# -- If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner.
|
||||
storageClass: "-"
|
||||
## If you want to reuse an existing claim, you can pass the name of the PVC using
|
||||
## the existingClaim variable
|
||||
# existingClaim: your-claim
|
||||
# subPath: some-subpath
|
||||
accessMode: ReadWriteOnce
|
||||
size: 10Gi
|
||||
# -- Add aditional PVs/PVCs to our container. Check values.yaml to see an example.
|
||||
extraExistingClaimMounts: []
|
||||
# - name: external-mount
|
||||
# mountPath: /srv/external-mount
|
||||
## A manually managed Persistent Volume and Claim
|
||||
## If defined, PVC must be created manually before volume will be bound
|
||||
# existingClaim:
|
||||
# readOnly: true
|
||||
|
||||
# -- Resource requests and limits for the Jellyfin container.
|
||||
resources: {}
|
||||
# We usually recommend not to specify default resources and to leave this as a conscious
|
||||
# choice for the user. This also increases chances charts run on environments with little
|
||||
# resources, such as Minikube. If you do want to specify resources, uncomment the following
|
||||
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
|
||||
# limits:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
# requests:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
|
||||
# -- Configure liveness probe for Jellyfin.
|
||||
livenessProbe:
|
||||
initialDelaySeconds: 10
|
||||
tcpSocket:
|
||||
port: http
|
||||
# successThreshold: 1
|
||||
# failureThreshold: 3
|
||||
# timeoutSeconds: 1
|
||||
# periodSeconds: 10
|
||||
|
||||
# -- Configure readiness probe for Jellyfin.
|
||||
readinessProbe:
|
||||
initialDelaySeconds: 10
|
||||
tcpSocket:
|
||||
port: http
|
||||
# successThreshold: 1
|
||||
# failureThreshold: 3
|
||||
# timeoutSeconds: 1
|
||||
# periodSeconds: 10
|
||||
|
||||
# -- Additional volumes to mount in the Jellyfin pod.
|
||||
volumes: []
|
||||
# - name: foo
|
||||
# secret:
|
||||
# secretName: mysecret
|
||||
# optional: false
|
||||
|
||||
# -- Additional volume mounts for the Jellyfin container.
|
||||
volumeMounts: []
|
||||
# - name: foo
|
||||
# mountPath: "/etc/foo"
|
||||
# readOnly: true
|
||||
|
||||
# -- Node selector for pod scheduling.
|
||||
nodeSelector: {}
|
||||
|
||||
# -- Tolerations for pod scheduling.
|
||||
tolerations: []
|
||||
|
||||
# -- Affinity rules for pod scheduling.
|
||||
affinity: {}
|
||||
|
||||
# -- Define additional volumes to mount to the pod.
|
||||
extraVolumes: []
|
||||
#- name: renderD129
|
||||
# hostPath:
|
||||
# path: /dev/dri/renderD129
|
||||
jellyfin:
|
||||
# -- Enable DLNA. Requires host network. See: https://jellyfin.org/docs/general/networking/dlna.html
|
||||
enableDLNA: false
|
||||
# -- Custom command to use as container entrypoint.
|
||||
command: []
|
||||
# -- Additional arguments for the entrypoint command.
|
||||
args: []
|
||||
# -- Additional environment variables for the container.
|
||||
env: []
|
||||
|
||||
# -- Define mount points for additional volumes.
|
||||
extraVolumeMounts: []
|
||||
#- mountPath: /dev/dri/renderD129
|
||||
# name: renderD129
|
||||
persistence:
|
||||
config:
|
||||
# -- set to false to use emptyDir
|
||||
enabled: true
|
||||
accessMode: ReadWriteOnce
|
||||
size: 5Gi
|
||||
# -- Custom annotations to be added to the PVC
|
||||
annotations: {}
|
||||
# -- If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner.
|
||||
storageClass: ''
|
||||
## -- Use an existing PVC for this mount
|
||||
# existingClaim: ''
|
||||
media:
|
||||
# -- set to false to use emptyDir
|
||||
enabled: true
|
||||
accessMode: ReadWriteOnce
|
||||
size: 25Gi
|
||||
# -- Custom annotations to be added to the PVC
|
||||
annotations: {}
|
||||
# -- If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner.
|
||||
storageClass: ''
|
||||
## -- Use an existing PVC for this mount
|
||||
# existingClaim: ''
|
||||
|
||||
# -- additional pod labels. Not used as a selector label.
|
||||
extraPodLabels: {}
|
||||
# -- Configuration for metrics collection and monitoring
|
||||
metrics:
|
||||
# -- Enable or disable metrics collection - Ensure you have started and configured your Jellyfin instance first as this will fail if system.xml does not exist yet.
|
||||
enabled: false
|
||||
command:
|
||||
- bash
|
||||
- '-c'
|
||||
- >-
|
||||
sed 's,<EnableMetrics>false</EnableMetrics>,<EnableMetrics>true</EnableMetrics>,' -i /config/config/system.xml &&
|
||||
/jellyfin/jellyfin
|
||||
# -- Configuration for the Prometheus ServiceMonitor
|
||||
serviceMonitor:
|
||||
# -- Enable or disable the creation of a ServiceMonitor resource
|
||||
enabled: false
|
||||
# -- Namespace where the ServiceMonitor resource should be created. Defaults to Release.Namespace
|
||||
namespace: ''
|
||||
# -- Labels to add to the ServiceMonitor resource
|
||||
labels: {}
|
||||
# -- Interval at which metrics should be scraped
|
||||
interval: 30s
|
||||
# -- Timeout for scraping metrics
|
||||
scrapeTimeout: 30s
|
||||
# -- Path to scrape for metrics
|
||||
path: /metrics
|
||||
# -- Port to scrape for metrics
|
||||
port: 8096
|
||||
# -- Scheme to use for scraping metrics (http or https)
|
||||
scheme: http
|
||||
# -- TLS configuration for scraping metrics
|
||||
tlsConfig: {}
|
||||
# -- Relabeling rules for the scraped metrics
|
||||
relabelings: []
|
||||
# -- Relabeling rules for the metrics before ingestion
|
||||
metricRelabelings: []
|
||||
# -- Target labels to add to the scraped metrics
|
||||
targetLabels: []
|
||||
|
||||
# -- aditional environment variables passed to the pod
|
||||
extraEnvVars: []
|
||||
#- name: MY_ENV_VAR
|
||||
# value: my-env-var-value
|
||||
|
||||
# -- additional annotations applied to the pod
|
||||
extraPodAnnotations: {}
|
||||
# -- additional init containers to run inside the pod.
|
||||
extraInitContainers: []
|
||||
|
||||
# -- additional sidecar containers to run inside the pod.
|
||||
extraContainers: {}
|
||||
|
||||
# -- Larger libraries may need to increase the readinessProbe and livenessProbe timeouts. Start by increasing the initialDelaySeconds.
|
||||
livenessProbe:
|
||||
enabled: true
|
||||
# failureThreshold: 3
|
||||
initialDelaySeconds: 10
|
||||
# periodSeconds: 10
|
||||
# successThreshold: 1
|
||||
# timeoutSeconds: 1
|
||||
|
||||
# -- Larger libraries may need to increase the readinessProbe and livenessProbe timeouts. Start by increasing the initialDelaySeconds.
|
||||
readinessProbe:
|
||||
enabled: true
|
||||
# failureThreshold: 3
|
||||
initialDelaySeconds: 10
|
||||
# periodSeconds: 10
|
||||
# successThreshold: 1
|
||||
# timeoutSeconds: 1
|
||||
extraContainers: []
|
||||
Reference in new issue
Block a user