feat(media): add media players

Adding both Plex and Jellyfin media players
This commit is contained in:
Vegard Hagen
2024-07-19 08:52:58 +02:00
parent 7780078984
commit 3edf3260d6
15 changed files with 282 additions and 1 deletions

View File

@@ -8,6 +8,7 @@ configMapGenerator:
- TZ="Europe/Oslo"
resources:
- ns.yaml
- lidarr
- prowlarr
- radarr

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: arr

View File

@@ -0,0 +1,64 @@
kind: Deployment
apiVersion: apps/v1
metadata:
name: jellyfin
namespace: jellyfin
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: jellyfin
template:
spec:
nodeSelector:
topology.kubernetes.io/zone: euclid
securityContext:
runAsNonRoot: true
runAsUser: 65534
runAsGroup: 65534
fsGroup: 65534
fsGroupChangePolicy: OnRootMismatch
supplementalGroups: [ 44, 104 ]
seccompProfile:
type: RuntimeDefault
containers:
- name: jellyfin
image: ghcr.io/jellyfin/jellyfin:10.9.7
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: [ "ALL" ]
resources:
requests:
cpu: 500m
memory: 2Gi
limits:
cpu: 6000m
memory: 6Gi
gpu.intel.com/i915: 1000m
envFrom:
- configMapRef:
name: jellyfin-env
ports:
- name: http
containerPort: 8096
volumeMounts:
- name: config
mountPath: /config
- name: media
mountPath: /mnt/media
- name: cache
mountPath: /cache
volumes:
- name: config
persistentVolumeClaim:
claimName: jellyfin-config
- name: media
nfs:
server: 192.168.1.55
path: /mnt/pool-0/data/media
- name: cache
emptyDir: { }

View File

@@ -0,0 +1,24 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: jellyfin
namespace: jellyfin
annotations:
cert-manager.io/cluster-issuer: cloudflare-cluster-issuer
spec:
ingressClassName: cilium
tls:
- hosts:
- jellyfin.stonegarden.dev
secretName: jellyfin-ingress-tls
rules:
- host: jellyfin.stonegarden.dev
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: jellyfin
port:
number: 8096

View File

@@ -0,0 +1,17 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
commonLabels:
app: jellyfin
configMapGenerator:
- name: jellyfin-env
namespace: jellyfin
literals:
- TZ="Europe/Oslo"
resources:
- ns.yaml
- svc.yaml
- pvc.yaml
- ingress.yaml
- deployment.yaml

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: jellyfin

View File

@@ -0,0 +1,13 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jellyfin-config
namespace: jellyfin
spec:
storageClassName: proxmox-csi
volumeName: pv-jellyfin-config
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 12G

View File

@@ -0,0 +1,14 @@
apiVersion: v1
kind: Service
metadata:
name: jellyfin
namespace: jellyfin
annotations:
io.cilium/lb-ipam-ips: 192.168.1.228
spec:
selector:
app: jellyfin
type: LoadBalancer
ports:
- name: http
port: 8096

View File

@@ -0,0 +1,68 @@
kind: Deployment
apiVersion: apps/v1
metadata:
name: plex
namespace: plex
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: plex
template:
spec:
nodeSelector:
topology.kubernetes.io/zone: abel
securityContext:
runAsNonRoot: true
runAsUser: 65534
runAsGroup: 65534
fsGroup: 65534
fsGroupChangePolicy: OnRootMismatch
supplementalGroups: [ 44, 104 ]
seccompProfile:
type: RuntimeDefault
containers:
- name: plex
image: ghcr.io/onedr0p/plex:1.40.4.8679-424562606
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: [ "ALL" ]
resources:
requests:
cpu: 500m
memory: 2Gi
limits:
cpu: 6000m
memory: 6Gi
gpu.intel.com/i915: 1000m
envFrom:
- configMapRef:
name: plex-env
ports:
- name: http
containerPort: 32400
volumeMounts:
- name: config
mountPath: /config
- name: media
mountPath: /mnt/media
- name: transcode
mountPath: /transcode
- name: tmp
mountPath: /tmp
volumes:
- name: config
persistentVolumeClaim:
claimName: plex-config
- name: media
nfs:
server: 192.168.1.55
path: /mnt/pool-0/data/media
- name: transcode
emptyDir: { }
- name: tmp
emptyDir: { }

View File

@@ -0,0 +1,24 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: plex
namespace: plex
annotations:
cert-manager.io/cluster-issuer: cloudflare-cluster-issuer
spec:
ingressClassName: cilium
tls:
- hosts:
- plex.stonegarden.dev
secretName: plex-ingress-tls
rules:
- host: plex.stonegarden.dev
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: plex
port:
number: 32400

View File

@@ -0,0 +1,17 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
commonLabels:
app: plex
configMapGenerator:
- name: plex-env
namespace: plex
literals:
- TZ="Europe/Oslo"
resources:
- ns.yaml
- svc.yaml
- pvc.yaml
- ingress.yaml
- deployment.yaml

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: plex

View File

@@ -0,0 +1,13 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: plex-config
namespace: plex
spec:
storageClassName: proxmox-csi
volumeName: pv-plex-config
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 12G

View File

@@ -0,0 +1,14 @@
apiVersion: v1
kind: Service
metadata:
name: plex
namespace: plex
annotations:
io.cilium/lb-ipam-ips: 192.168.1.229
spec:
selector:
app: plex
type: LoadBalancer
ports:
- name: http
port: 32400

View File

@@ -122,7 +122,7 @@ module "volumes" {
size = "1G"
}
pv-jellyfin-config = {
node = "abel"
node = "euclid"
size = "12G"
}
pv-plex-config = {