Files
k8s-apps/jellyfin/jellyfin.yaml
2025-08-24 13:38:37 +02:00

436 lines
12 KiB
YAML

apiVersion: v1
kind: ConfigMap
metadata:
name: config
namespace: jellyfin
data:
# file-like keys
system.xml: |
<?xml version="1.0" encoding="utf-8"?>
<ServerConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<LogFileRetentionDays>3</LogFileRetentionDays>
<IsStartupWizardCompleted>false</IsStartupWizardCompleted>
<EnableMetrics>true</EnableMetrics>
<EnableNormalizedItemByNameIds>true</EnableNormalizedItemByNameIds>
<IsPortAuthorized>true</IsPortAuthorized>
<QuickConnectAvailable>true</QuickConnectAvailable>
<EnableCaseSensitiveItemIds>true</EnableCaseSensitiveItemIds>
<DisableLiveTvChannelUserDataName>true</DisableLiveTvChannelUserDataName>
<MetadataPath />
<MetadataNetworkPath />
<PreferredMetadataLanguage>en</PreferredMetadataLanguage>
<MetadataCountryCode>US</MetadataCountryCode>
<SortReplaceCharacters>
<string>.</string>
<string>+</string>
<string>%</string>
</SortReplaceCharacters>
<SortRemoveCharacters>
<string>,</string>
<string>&amp;</string>
<string>-</string>
<string>{</string>
<string>}</string>
<string>'</string>
</SortRemoveCharacters>
<SortRemoveWords>
<string>the</string>
<string>a</string>
<string>an</string>
</SortRemoveWords>
<MinResumePct>5</MinResumePct>
<MaxResumePct>90</MaxResumePct>
<MinResumeDurationSeconds>300</MinResumeDurationSeconds>
<MinAudiobookResume>5</MinAudiobookResume>
<MaxAudiobookResume>5</MaxAudiobookResume>
<LibraryMonitorDelay>60</LibraryMonitorDelay>
<ImageSavingConvention>Legacy</ImageSavingConvention>
<MetadataOptions>
<MetadataOptions>
<ItemType>Book</ItemType>
<DisabledMetadataSavers />
<LocalMetadataReaderOrder />
<DisabledMetadataFetchers />
<MetadataFetcherOrder />
<DisabledImageFetchers />
<ImageFetcherOrder />
</MetadataOptions>
<MetadataOptions>
<ItemType>Movie</ItemType>
<DisabledMetadataSavers />
<LocalMetadataReaderOrder />
<DisabledMetadataFetchers />
<MetadataFetcherOrder />
<DisabledImageFetchers />
<ImageFetcherOrder />
</MetadataOptions>
<MetadataOptions>
<ItemType>MusicVideo</ItemType>
<DisabledMetadataSavers />
<LocalMetadataReaderOrder />
<DisabledMetadataFetchers>
<string>The Open Movie Database</string>
</DisabledMetadataFetchers>
<MetadataFetcherOrder />
<DisabledImageFetchers>
<string>The Open Movie Database</string>
</DisabledImageFetchers>
<ImageFetcherOrder />
</MetadataOptions>
<MetadataOptions>
<ItemType>Series</ItemType>
<DisabledMetadataSavers />
<LocalMetadataReaderOrder />
<DisabledMetadataFetchers />
<MetadataFetcherOrder />
<DisabledImageFetchers />
<ImageFetcherOrder />
</MetadataOptions>
<MetadataOptions>
<ItemType>MusicAlbum</ItemType>
<DisabledMetadataSavers />
<LocalMetadataReaderOrder />
<DisabledMetadataFetchers>
<string>TheAudioDB</string>
</DisabledMetadataFetchers>
<MetadataFetcherOrder />
<DisabledImageFetchers />
<ImageFetcherOrder />
</MetadataOptions>
<MetadataOptions>
<ItemType>MusicArtist</ItemType>
<DisabledMetadataSavers />
<LocalMetadataReaderOrder />
<DisabledMetadataFetchers>
<string>TheAudioDB</string>
</DisabledMetadataFetchers>
<MetadataFetcherOrder />
<DisabledImageFetchers />
<ImageFetcherOrder />
</MetadataOptions>
<MetadataOptions>
<ItemType>BoxSet</ItemType>
<DisabledMetadataSavers />
<LocalMetadataReaderOrder />
<DisabledMetadataFetchers />
<MetadataFetcherOrder />
<DisabledImageFetchers />
<ImageFetcherOrder />
</MetadataOptions>
<MetadataOptions>
<ItemType>Season</ItemType>
<DisabledMetadataSavers />
<LocalMetadataReaderOrder />
<DisabledMetadataFetchers />
<MetadataFetcherOrder />
<DisabledImageFetchers />
<ImageFetcherOrder />
</MetadataOptions>
<MetadataOptions>
<ItemType>Episode</ItemType>
<DisabledMetadataSavers />
<LocalMetadataReaderOrder />
<DisabledMetadataFetchers />
<MetadataFetcherOrder />
<DisabledImageFetchers />
<ImageFetcherOrder />
</MetadataOptions>
</MetadataOptions>
<SkipDeserializationForBasicTypes>true</SkipDeserializationForBasicTypes>
<ServerName />
<UICulture>en-US</UICulture>
<SaveMetadataHidden>false</SaveMetadataHidden>
<ContentTypes />
<RemoteClientBitrateLimit>0</RemoteClientBitrateLimit>
<EnableFolderView>false</EnableFolderView>
<EnableGroupingIntoCollections>false</EnableGroupingIntoCollections>
<DisplaySpecialsWithinSeasons>true</DisplaySpecialsWithinSeasons>
<CodecsUsed />
<PluginRepositories>
<RepositoryInfo>
<Name>Jellyfin Stable</Name>
<Url>https://repo.jellyfin.org/releases/plugin/manifest-stable.json</Url>
<Enabled>true</Enabled>
</RepositoryInfo>
</PluginRepositories>
<EnableExternalContentInSuggestions>true</EnableExternalContentInSuggestions>
<ImageExtractionTimeoutMs>0</ImageExtractionTimeoutMs>
<PathSubstitutions />
<EnableSlowResponseWarning>true</EnableSlowResponseWarning>
<SlowResponseThresholdMs>500</SlowResponseThresholdMs>
<CorsHosts>
<string>*</string>
</CorsHosts>
<ActivityLogRetentionDays>30</ActivityLogRetentionDays>
<LibraryScanFanoutConcurrency>0</LibraryScanFanoutConcurrency>
<LibraryMetadataRefreshConcurrency>0</LibraryMetadataRefreshConcurrency>
<RemoveOldPlugins>false</RemoveOldPlugins>
<AllowClientLogUpload>true</AllowClientLogUpload>
</ServerConfiguration>
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: jellyfin
# Change "rook-ceph" provisioner prefix to match the operator namespace if needed
provisioner: rook-ceph.cephfs.csi.ceph.com
parameters:
# clusterID is the namespace where the rook cluster is running
# If you change this namespace, also change the namespace below where the secret namespaces are defined
clusterID: rook-ceph
# CephFS filesystem name into which the volume shall be created
fsName: jellyfin
# Ceph pool into which the volume shall be created
# Required for provisionVolume: "true"
pool: jellyfin-replicated
# The secrets contain Ceph admin credentials. These are generated automatically by the operator
# in the same namespace as the cluster.
csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
csi.storage.k8s.io/controller-expand-secret-name: rook-csi-cephfs-provisioner
csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
csi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-node
csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
reclaimPolicy: Delete
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: config
namespace: jellyfin
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
storageClassName: jellyfin
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: music-jelly
namespace: jellyfin
spec:
storageClassName: ""
capacity:
storage: 32Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
mountOptions:
- dir_mode=0777
- file_mode=0777
- vers=3.0
csi:
driver: smb.csi.k8s.io
readOnly: false
volumeHandle: "music" # make sure it's a unique id in the cluster
volumeAttributes:
source: "//samba.fileserver.svc.k8aux.undercloud.cf./music"
nodeStageSecretRef:
name: fileserver-smb-account
namespace: jellyfin
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: music
namespace: jellyfin
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 30Gi
volumeName: music-jelly
storageClassName: ""
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: movies
namespace: jellyfin
spec:
storageClassName: ""
capacity:
storage: 32Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
mountOptions:
- dir_mode=0777
- file_mode=0777
- vers=3.0
csi:
driver: smb.csi.k8s.io
readOnly: false
volumeHandle: "movies" # make sure it's a unique id in the cluster
volumeAttributes:
source: "//samba.fileserver.svc.k8aux.undercloud.cf./movies"
nodeStageSecretRef:
name: fileserver-smb-account
namespace: jellyfin
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: tvshows
namespace: jellyfin
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 30Gi
volumeName: tvshows
storageClassName: ""
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: tvshows
namespace: jellyfin
spec:
storageClassName: ""
capacity:
storage: 32Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
mountOptions:
- dir_mode=0777
- file_mode=0777
- vers=3.0
csi:
driver: smb.csi.k8s.io
readOnly: false
volumeHandle: "tvshows" # make sure it's a unique id in the cluster
volumeAttributes:
source: "//samba.fileserver.svc.k8aux.undercloud.cf./tvshows"
nodeStageSecretRef:
name: fileserver-smb-account
namespace: jellyfin
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: movies
namespace: jellyfin
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 30Gi
volumeName: movies
storageClassName: ""
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: jellyfin
namespace: jellyfin
labels:
app: jellyfin
spec:
replicas: 1
selector:
matchLabels:
app: jellyfin
template:
metadata:
labels:
app: jellyfin
spec:
dnsConfig:
options:
- name: ndots
value: "1"
#securityContext:
# runAsUser: 1000
# runAsGroup: 1000
# fsGroup: 1000
containers:
- name: jellyfin
image: linuxserver/jellyfin
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8096
- containerPort: 8920
- containerPort: 7359 #udp
- containerPort: 1900 #udp
#livenessProbe:
# httpGet:
# path: /health
# port: 8096
# #httpHeaders:
# #- name: Custom-Header
# # value: Awesome
# initialDelaySeconds: 30
# periodSeconds: 5
env:
- name: PUID
value: "1000"
- name: PGID
value: "1000"
volumeMounts:
- mountPath: /config
name: config
- mountPath: /data/movies
name: movies
#- mountPath: "/config/system.xml"
# name: config-cm
# subPath: system.xml
volumes:
- name: config
persistentVolumeClaim:
claimName: config
readOnly: false
- name: movies
persistentVolumeClaim:
claimName: movies
readOnly: false
- name: config-cm
configMap:
name: config
items:
- key: "system.xml"
path: "system.xml"
---
apiVersion: v1
kind: Service
metadata:
name: jellyfin
namespace: jellyfin
spec:
ipFamilies:
- IPv6
- IPv4
ipFamilyPolicy: PreferDualStack
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8096
- name: jelly1
port: 8920
protocol: TCP
targetPort: 8920
- name: jelly2
port: 7359
protocol: UDP
targetPort: 7359
- name: jelly3
port: 1900
protocol: UDP
targetPort: 1900
selector:
app: jellyfin
sessionAffinity: None
type: ClusterIP