Some checks failed
validate / lint (push) Failing after 1s
10.11.11 can't read the schema Jellyfin 12.0 already migrated the config DB to (SQLite errors on every user query), which broke login entirely. Pin to 12.0 instead of :latest to restore service and stop future silent version jumps. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016EQrGkfXFae4PZG9QfPRf4
175 lines
3.9 KiB
YAML
175 lines
3.9 KiB
YAML
# Apply: kubectl apply -f manifests/media/jellyfin.yaml
|
|
# Delete: kubectl delete -f manifests/media/jellyfin.yaml
|
|
# Description: Jellyfin media server with NFS media PV, local config PVC, and Ingress at jellyfin.home.arpa.
|
|
apiVersion: v1
|
|
kind: Namespace
|
|
metadata:
|
|
name: jellyfin
|
|
---
|
|
apiVersion: v1
|
|
kind: PersistentVolume
|
|
metadata:
|
|
name: jellyfin-media-pv
|
|
spec:
|
|
capacity:
|
|
storage: 10Ti
|
|
accessModes:
|
|
- ReadOnlyMany
|
|
persistentVolumeReclaimPolicy: Retain
|
|
nfs:
|
|
server: 10.10.40.20
|
|
path: /mnt/storage
|
|
nodeAffinity:
|
|
required:
|
|
nodeSelectorTerms:
|
|
- matchExpressions:
|
|
- key: kubernetes.io/hostname
|
|
operator: In
|
|
values:
|
|
- minisforum
|
|
---
|
|
apiVersion: v1
|
|
kind: PersistentVolumeClaim
|
|
metadata:
|
|
name: jellyfin-media
|
|
namespace: jellyfin
|
|
annotations:
|
|
helm.sh/resource-policy: keep
|
|
spec:
|
|
accessModes:
|
|
- ReadOnlyMany
|
|
storageClassName: ""
|
|
volumeName: jellyfin-media-pv
|
|
resources:
|
|
requests:
|
|
storage: 10Ti
|
|
---
|
|
apiVersion: v1
|
|
kind: PersistentVolumeClaim
|
|
metadata:
|
|
name: jellyfin-config
|
|
namespace: jellyfin
|
|
annotations:
|
|
helm.sh/resource-policy: keep
|
|
spec:
|
|
accessModes:
|
|
- ReadWriteOnce
|
|
storageClassName: local-path
|
|
resources:
|
|
requests:
|
|
storage: 10Gi
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: jellyfin
|
|
namespace: jellyfin
|
|
spec:
|
|
replicas: 1
|
|
selector:
|
|
matchLabels:
|
|
app: jellyfin
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: jellyfin
|
|
spec:
|
|
affinity:
|
|
nodeAffinity:
|
|
requiredDuringSchedulingIgnoredDuringExecution:
|
|
nodeSelectorTerms:
|
|
- matchExpressions:
|
|
- key: node-role
|
|
operator: In
|
|
values:
|
|
- primary
|
|
containers:
|
|
- name: jellyfin
|
|
image: jellyfin/jellyfin:12.0
|
|
ports:
|
|
- containerPort: 8096
|
|
env:
|
|
- name: JELLYFIN_PublishedServerUrl
|
|
value: https://jellyfin.home.arpa
|
|
- name: LIBVA_DRIVER_NAME
|
|
value: radeonsi
|
|
readinessProbe:
|
|
httpGet:
|
|
path: /health
|
|
port: 8096
|
|
initialDelaySeconds: 15
|
|
periodSeconds: 15
|
|
livenessProbe:
|
|
httpGet:
|
|
path: /health
|
|
port: 8096
|
|
initialDelaySeconds: 30
|
|
periodSeconds: 30
|
|
resources:
|
|
requests:
|
|
cpu: 200m
|
|
memory: 1Gi
|
|
limits:
|
|
cpu: 2000m
|
|
memory: 4Gi
|
|
volumeMounts:
|
|
- name: config
|
|
mountPath: /config
|
|
- name: media
|
|
mountPath: /media
|
|
readOnly: true
|
|
- name: dri
|
|
mountPath: /dev/dri
|
|
securityContext:
|
|
supplementalGroups:
|
|
- 992
|
|
volumes:
|
|
- name: config
|
|
persistentVolumeClaim:
|
|
claimName: jellyfin-config
|
|
- name: media
|
|
persistentVolumeClaim:
|
|
claimName: jellyfin-media
|
|
- name: dri
|
|
hostPath:
|
|
path: /dev/dri
|
|
---
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: jellyfin
|
|
namespace: jellyfin
|
|
spec:
|
|
selector:
|
|
app: jellyfin
|
|
ports:
|
|
- port: 80
|
|
targetPort: 8096
|
|
---
|
|
apiVersion: networking.k8s.io/v1
|
|
kind: Ingress
|
|
metadata:
|
|
name: jellyfin
|
|
namespace: jellyfin
|
|
annotations:
|
|
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
|
traefik.ingress.kubernetes.io/router.tls: "true"
|
|
cert-manager.io/cluster-issuer: internal-ca-issuer
|
|
spec:
|
|
ingressClassName: traefik
|
|
tls:
|
|
- secretName: jellyfin-tls
|
|
hosts:
|
|
- jellyfin.home.arpa
|
|
rules:
|
|
- host: jellyfin.home.arpa
|
|
http:
|
|
paths:
|
|
- path: /
|
|
pathType: Prefix
|
|
backend:
|
|
service:
|
|
name: jellyfin
|
|
port:
|
|
number: 80
|