Skip to content

Commit 697bcaf

Browse files
authored
feat(charts): Add Jellyfin
feat(charts): Add Jellyfin
2 parents 89862e1 + 2c96b41 commit 697bcaf

File tree

10 files changed

+735
-414
lines changed

10 files changed

+735
-414
lines changed

.github/workflows/integration-tests.yml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,11 @@ jobs:
8080
- name: Edit hosts file and test apps
8181
run: |
8282
sudo echo "127.0.0.1 ${{ env.plex_ingress_host }} ${{ env.ingress_host }}" | sudo tee -a /etc/hosts
83-
wget ${{ env.ingress_host }}/sonarr
84-
wget ${{ env.ingress_host }}/radarr
85-
wget ${{ env.ingress_host }}/sabnzbd
86-
wget ${{ env.ingress_host }}/prowlarr
87-
wget --retry-on-http-error=503,500 ${{ env.ingress_host }}/jackett
83+
sudo echo "127.0.0.1 ${{ env.jellyfin_ingress_host }} ${{ env.ingress_host }}" | sudo tee -a /etc/hosts
84+
wget --retry-on-http-error=503,500 ${{ env.ingress_host }}/sonarr
85+
wget --retry-on-http-error=503,500 ${{ env.ingress_host }}/radarr
86+
wget --retry-on-http-error=503,500 ${{ env.ingress_host }}/sabnzbd
87+
wget --retry-on-http-error=503,500 ${{ env.ingress_host }}/prowlarr
88+
wget --retry-on-http-error=503,500 ${{ env.ingress_host }}/jackett
8889
curl ${{ env.plex_ingress_host }}
90+
curl ${{ env.jellyfin_ingress_host }}

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ bin
1313
*.swo
1414
*~
1515
kubeserver.yml
16+
my-values.yaml

README.md

Lines changed: 206 additions & 166 deletions
Large diffs are not rendered by default.

config/samples/charts_v1_k8smediaserver.yaml

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ spec:
1818
pgid: 1000
1919
# Persistent storage selections and pathing
2020
storage:
21-
customVolume: false # set to true if not using a PVC (must provide volume below)
21+
customVolume: false # set to true if not using a PVC (must provide volume below)
2222
pvcName: mediaserver-pvc
2323
size: 5Gi
2424
pvcStorageClass: ""
@@ -73,6 +73,27 @@ spec:
7373
port: 32400
7474
type: ClusterIP
7575
volume: {}
76+
jellyfin:
77+
container:
78+
image: docker.io/linuxserver/jellyfin
79+
nodeSelector: {}
80+
port: 8096
81+
enabled: false
82+
ingress:
83+
annotations: {}
84+
enabled: true
85+
tls:
86+
enabled: false
87+
secretName: ""
88+
replicaCount: 1
89+
resources: {}
90+
service:
91+
extraLBAnnotations: {}
92+
extraLBService: false
93+
nodePort: null
94+
port: 8096
95+
type: ClusterIP
96+
volume: {}
7697
prowlarr:
7798
container:
7899
image: docker.io/linuxserver/prowlarr
@@ -203,5 +224,3 @@ spec:
203224
port: 9091
204225
type: ClusterIP
205226
volume: {}
206-
207-
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
apiVersion: v2
2-
appVersion: 0.9.2
2+
appVersion: 0.10.0
33
description: A Helm chart for Kubernetes mediaserver
44
name: k8s-mediaserver
55
type: application
6-
version: 0.9.2
6+
version: 0.10.0
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
{{ if .Values.jellyfin.enabled }}
2+
---
3+
### CONFIGMAP
4+
apiVersion: v1
5+
kind: ConfigMap
6+
metadata:
7+
name: jellyfin-config
8+
data:
9+
PGID: "{{ .Values.general.pgid }}"
10+
PUID: "{{ .Values.general.puid }}"
11+
---
12+
### DEPLOYMENT
13+
apiVersion: apps/v1
14+
kind: Deployment
15+
metadata:
16+
name: jellyfin
17+
labels:
18+
{{- include "k8s-mediaserver.labels" . | nindent 4 }}
19+
spec:
20+
replicas: {{ .Values.jellyfin.replicaCount }}
21+
selector:
22+
matchLabels:
23+
{{- include "k8s-mediaserver.selectorLabels" . | nindent 6 }}
24+
template:
25+
metadata:
26+
labels:
27+
{{- include "k8s-mediaserver.selectorLabels" . | nindent 8 }}
28+
app: jellyfin
29+
spec:
30+
volumes:
31+
{{- if not .Values.general.storage.customVolume }}
32+
- name: mediaserver-volume
33+
persistentVolumeClaim:
34+
claimName: {{ .Values.general.storage.pvcName }}
35+
{{- else }}
36+
- name: mediaserver-volume
37+
{{- toYaml .Values.general.storage.volumes | nindent 10 }}
38+
{{- end }}
39+
{{- if .Values.jellyfin.volume }}
40+
- name: {{ .Values.jellyfin.volume.name }}
41+
persistentVolumeClaim:
42+
claimName: {{ .Values.jellyfin.volume.name }}
43+
{{- end }}
44+
containers:
45+
- name: {{ .Chart.Name }}
46+
envFrom:
47+
- configMapRef:
48+
name: jellyfin-config
49+
image: "{{ .Values.jellyfin.container.image }}:{{ .Values.jellyfin.container.tag | default .Values.general.image_tag }}"
50+
imagePullPolicy: Always
51+
readinessProbe:
52+
tcpSocket:
53+
port: {{ .Values.jellyfin.container.port }}
54+
initialDelaySeconds: 20
55+
periodSeconds: 15
56+
ports:
57+
- name: jellyfin-port
58+
containerPort: {{ .Values.jellyfin.container.port }}
59+
protocol: TCP
60+
volumeMounts:
61+
{{- if .Values.jellyfin.volume }}
62+
- name: {{ .Values.jellyfin.volume.name }}
63+
mountPath: /config
64+
{{- else }}
65+
- name: mediaserver-volume
66+
mountPath: /config
67+
subPath: "{{ .Values.general.storage.subPaths.config }}/jellyfin"
68+
{{- end }}
69+
- name: mediaserver-volume
70+
mountPath: /movies
71+
subPath: "{{ .Values.general.storage.subPaths.movies }}"
72+
- name: mediaserver-volume
73+
mountPath: /tv
74+
subPath: "{{ .Values.general.storage.subPaths.tv }}"
75+
{{- with .Values.jellyfin.resources }}
76+
resources:
77+
{{- toYaml . | nindent 12 }}
78+
{{- end }}
79+
{{- with .Values.general.nodeSelector }}
80+
nodeSelector:
81+
{{- toYaml . | nindent 8 }}
82+
{{- end }}
83+
---
84+
### SERVICE
85+
apiVersion: v1
86+
kind: Service
87+
metadata:
88+
name: jellyfin
89+
labels:
90+
{{- include "k8s-mediaserver.labels" . | nindent 4 }}
91+
spec:
92+
type: {{ .Values.jellyfin.service.type }}
93+
ports:
94+
- port: {{ .Values.jellyfin.service.port }}
95+
targetPort: {{ .Values.jellyfin.container.port }}
96+
protocol: TCP
97+
name: jellyfin-port
98+
{{ if eq .Values.jellyfin.service.type "NodePort" }}
99+
nodePort: {{ .Values.jellyfin.service.nodePort }}
100+
{{ end }}
101+
selector:
102+
app: jellyfin
103+
104+
---
105+
{{ if .Values.jellyfin.service.extraLBService }}
106+
apiVersion: v1
107+
kind: Service
108+
metadata:
109+
name: jellyfin-lb
110+
annotations:
111+
{{- include .Values.jellyfin.service.extraLBService.annotations . | nindent 4 }}
112+
labels:
113+
{{- include "k8s-mediaserver.labels" . | nindent 4 }}
114+
spec:
115+
type: LoadBalancer
116+
ports:
117+
- port: {{ .Values.jellyfin.service.port }}
118+
targetPort: {{ .Values.jellyfin.container.port }}
119+
protocol: TCP
120+
name: jellyfin-port
121+
selector:
122+
app: jellyfin
123+
{{ end }}
124+
---
125+
### INGRESS
126+
{{ if .Values.jellyfin.ingress.enabled }}
127+
apiVersion: networking.k8s.io/v1
128+
kind: Ingress
129+
metadata:
130+
name: jellyfin
131+
labels:
132+
{{- include "k8s-mediaserver.labels" . | nindent 4 }}
133+
{{- with .Values.jellyfin.ingress.annotations }}
134+
annotations:
135+
{{- toYaml . | nindent 4 }}
136+
{{- end }}
137+
spec:
138+
{{- if .Values.jellyfin.ingress.tls.enabled }}
139+
tls:
140+
- hosts:
141+
- {{ .Values.general.jellyfin_ingress_host | quote }}
142+
secretName: {{ .Values.jellyfin.ingress.tls.secretName }}
143+
{{ end }}
144+
ingressClassName: {{ .Values.general.ingress.ingressClassName }}
145+
rules:
146+
- host: {{ .Values.general.jellyfin_ingress_host | quote }}
147+
http:
148+
paths:
149+
- path: /
150+
pathType: Prefix
151+
backend:
152+
service:
153+
name: jellyfin
154+
port:
155+
number: {{ .Values.jellyfin.service.port }}
156+
{{ end }}
157+
{{ end }}

helm-charts/k8s-mediaserver/templates/storage-resources.yml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,32 @@ spec:
9090
{{- toYaml . | nindent 4 }}
9191
{{- end }}
9292
{{- end }}
93+
{{- with .Values.jellyfin.volume }}
94+
---
95+
apiVersion: v1
96+
kind: PersistentVolumeClaim
97+
metadata:
98+
name: {{ .name }}
99+
{{ with .annotations }}
100+
annotations:
101+
{{- toYaml . | nindent 4 }}
102+
{{- end }}
103+
{{ with .labels }}
104+
labels:
105+
{{- toYaml . | nindent 4 }}
106+
{{- end }}
107+
spec:
108+
accessModes:
109+
- {{ .accessModes }}
110+
resources:
111+
requests:
112+
storage: {{ .storage }}
113+
storageClassName: {{ .storageClassName }}
114+
{{ with .selector }}
115+
selector:
116+
{{- toYaml . | nindent 4 }}
117+
{{- end }}
118+
{{- end }}
93119
{{- with .Values.jackett.volume }}
94120
---
95121
apiVersion: v1

helm-charts/k8s-mediaserver/values.yaml

Lines changed: 55 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
general:
66
ingress_host: k8s-mediaserver.k8s.test
77
plex_ingress_host: k8s-plex.k8s.test
8+
jellyfin_ingress_host: k8s-jelly.k8s.test
89
image_tag: latest
910
podDistribution: cluster # can be "spread" or "cluster"
1011
#UID to run the process with
1112
puid: 1000
12-
#GID to run the process with
13+
# GID to run the process with
1314
pgid: 1000
14-
#Persistent storage selections and pathing
15+
# Persistent storage selections and pathing
1516
storage:
16-
customVolume: false #set to true if not using a PVC (must provide volume below)
17+
customVolume: false # set to true if not using a PVC (must provide volume below)
1718
pvcName: mediaserver-pvc
1819
accessMode: ""
1920
size: 5Gi
@@ -55,15 +56,15 @@ sonarr:
5556
secretName: ""
5657
resources: {}
5758
volume: {}
58-
#name: pvc-sonarr-config
59-
#storageClassName: longhorn
60-
#annotations:
61-
# my-annotation/test: my-value
62-
#labels:
63-
# my-label/test: my-other-value
64-
#accessModes: ReadWriteOnce
65-
#storage: 5Gi
66-
#selector: {}
59+
# name: pvc-sonarr-config
60+
# storageClassName: longhorn
61+
# annotations:
62+
# my-annotation/test: my-value
63+
# labels:
64+
# my-label/test: my-other-value
65+
# accessModes: ReadWriteOnce
66+
# storage: 5Gi
67+
# selector: {}
6768

6869
radarr:
6970
enabled: true
@@ -87,13 +88,13 @@ radarr:
8788
secretName: ""
8889
resources: {}
8990
volume: {}
90-
#name: pvc-radarr-config
91-
#storageClassName: longhorn
92-
#annotations: {}
93-
#labels: {}
94-
#accessModes: ReadWriteOnce
95-
#storage: 5Gi
96-
#selector: {}
91+
# name: pvc-radarr-config
92+
# storageClassName: longhorn
93+
# annotations: {}
94+
# labels: {}
95+
# accessModes: ReadWriteOnce
96+
# storage: 5Gi
97+
# selector: {}
9798

9899
jackett:
99100
enabled: true
@@ -279,3 +280,38 @@ plex:
279280
# accessModes: ReadWriteOnce
280281
# storage: 5Gi
281282
# selector: {}
283+
284+
jellyfin:
285+
enabled: false
286+
replicaCount: 1
287+
container:
288+
image: docker.io/linuxserver/jellyfin
289+
nodeSelector: {}
290+
port: 8096
291+
service:
292+
type: ClusterIP
293+
port: 8096
294+
nodePort:
295+
# Defines an additional LB service, requires cloud provider service or MetalLB
296+
extraLBService: false
297+
ingress:
298+
enabled: true
299+
annotations: {}
300+
tls:
301+
enabled: false
302+
secretName: ""
303+
resources: {}
304+
# limits:
305+
# cpu: 100m
306+
# memory: 100Mi
307+
# requests:
308+
# cpu: 100m
309+
# memory: 100Mi
310+
volume: {}
311+
# name: pvc-jellyfin-config
312+
# storageClassName: longhorn
313+
# annotations: {}
314+
# labels: {}
315+
# accessModes: ReadWriteOnce
316+
# storage: 5Gi
317+
# selector: {}

0 commit comments

Comments
 (0)