From 3edf3260d616f20c5fd6f876e4b43db206f7deae Mon Sep 17 00:00:00 2001 From: Vegard Hagen Date: Fri, 19 Jul 2024 08:52:58 +0200 Subject: [PATCH] feat(media): add media players Adding both Plex and Jellyfin media players --- remodel/k8s/apps/media/arr/kustomization.yaml | 1 + remodel/k8s/apps/media/arr/ns.yaml | 4 ++ .../k8s/apps/media/jellyfin/deployment.yaml | 64 +++++++++++++++++ remodel/k8s/apps/media/jellyfin/ingress.yaml | 24 +++++++ .../apps/media/jellyfin/kustomization.yaml | 17 +++++ remodel/k8s/apps/media/jellyfin/ns.yaml | 4 ++ remodel/k8s/apps/media/jellyfin/pvc.yaml | 13 ++++ remodel/k8s/apps/media/jellyfin/svc.yaml | 14 ++++ remodel/k8s/apps/media/plex/deployment.yaml | 68 +++++++++++++++++++ remodel/k8s/apps/media/plex/ingress.yaml | 24 +++++++ .../k8s/apps/media/plex/kustomization.yaml | 17 +++++ remodel/k8s/apps/media/plex/ns.yaml | 4 ++ remodel/k8s/apps/media/plex/pvc.yaml | 13 ++++ remodel/k8s/apps/media/plex/svc.yaml | 14 ++++ remodel/tofu/kubernetes/main.tf | 2 +- 15 files changed, 282 insertions(+), 1 deletion(-) create mode 100644 remodel/k8s/apps/media/arr/ns.yaml create mode 100644 remodel/k8s/apps/media/jellyfin/deployment.yaml create mode 100644 remodel/k8s/apps/media/jellyfin/ingress.yaml create mode 100644 remodel/k8s/apps/media/jellyfin/kustomization.yaml create mode 100644 remodel/k8s/apps/media/jellyfin/ns.yaml create mode 100644 remodel/k8s/apps/media/jellyfin/pvc.yaml create mode 100644 remodel/k8s/apps/media/jellyfin/svc.yaml create mode 100644 remodel/k8s/apps/media/plex/deployment.yaml create mode 100644 remodel/k8s/apps/media/plex/ingress.yaml create mode 100644 remodel/k8s/apps/media/plex/kustomization.yaml create mode 100644 remodel/k8s/apps/media/plex/ns.yaml create mode 100644 remodel/k8s/apps/media/plex/pvc.yaml create mode 100644 remodel/k8s/apps/media/plex/svc.yaml diff --git a/remodel/k8s/apps/media/arr/kustomization.yaml b/remodel/k8s/apps/media/arr/kustomization.yaml index a2c9991..46ff398 100644 --- a/remodel/k8s/apps/media/arr/kustomization.yaml +++ b/remodel/k8s/apps/media/arr/kustomization.yaml @@ -8,6 +8,7 @@ configMapGenerator: - TZ="Europe/Oslo" resources: + - ns.yaml - lidarr - prowlarr - radarr diff --git a/remodel/k8s/apps/media/arr/ns.yaml b/remodel/k8s/apps/media/arr/ns.yaml new file mode 100644 index 0000000..4f0d7b8 --- /dev/null +++ b/remodel/k8s/apps/media/arr/ns.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: arr \ No newline at end of file diff --git a/remodel/k8s/apps/media/jellyfin/deployment.yaml b/remodel/k8s/apps/media/jellyfin/deployment.yaml new file mode 100644 index 0000000..fc56e93 --- /dev/null +++ b/remodel/k8s/apps/media/jellyfin/deployment.yaml @@ -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: { } diff --git a/remodel/k8s/apps/media/jellyfin/ingress.yaml b/remodel/k8s/apps/media/jellyfin/ingress.yaml new file mode 100644 index 0000000..5f95392 --- /dev/null +++ b/remodel/k8s/apps/media/jellyfin/ingress.yaml @@ -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 diff --git a/remodel/k8s/apps/media/jellyfin/kustomization.yaml b/remodel/k8s/apps/media/jellyfin/kustomization.yaml new file mode 100644 index 0000000..7cac064 --- /dev/null +++ b/remodel/k8s/apps/media/jellyfin/kustomization.yaml @@ -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 diff --git a/remodel/k8s/apps/media/jellyfin/ns.yaml b/remodel/k8s/apps/media/jellyfin/ns.yaml new file mode 100644 index 0000000..3afecf7 --- /dev/null +++ b/remodel/k8s/apps/media/jellyfin/ns.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: jellyfin \ No newline at end of file diff --git a/remodel/k8s/apps/media/jellyfin/pvc.yaml b/remodel/k8s/apps/media/jellyfin/pvc.yaml new file mode 100644 index 0000000..9ab3d56 --- /dev/null +++ b/remodel/k8s/apps/media/jellyfin/pvc.yaml @@ -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 diff --git a/remodel/k8s/apps/media/jellyfin/svc.yaml b/remodel/k8s/apps/media/jellyfin/svc.yaml new file mode 100644 index 0000000..a824abd --- /dev/null +++ b/remodel/k8s/apps/media/jellyfin/svc.yaml @@ -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 \ No newline at end of file diff --git a/remodel/k8s/apps/media/plex/deployment.yaml b/remodel/k8s/apps/media/plex/deployment.yaml new file mode 100644 index 0000000..9b8c27e --- /dev/null +++ b/remodel/k8s/apps/media/plex/deployment.yaml @@ -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: { } diff --git a/remodel/k8s/apps/media/plex/ingress.yaml b/remodel/k8s/apps/media/plex/ingress.yaml new file mode 100644 index 0000000..ecbbc32 --- /dev/null +++ b/remodel/k8s/apps/media/plex/ingress.yaml @@ -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 diff --git a/remodel/k8s/apps/media/plex/kustomization.yaml b/remodel/k8s/apps/media/plex/kustomization.yaml new file mode 100644 index 0000000..9c8967a --- /dev/null +++ b/remodel/k8s/apps/media/plex/kustomization.yaml @@ -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 diff --git a/remodel/k8s/apps/media/plex/ns.yaml b/remodel/k8s/apps/media/plex/ns.yaml new file mode 100644 index 0000000..10293c3 --- /dev/null +++ b/remodel/k8s/apps/media/plex/ns.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: plex \ No newline at end of file diff --git a/remodel/k8s/apps/media/plex/pvc.yaml b/remodel/k8s/apps/media/plex/pvc.yaml new file mode 100644 index 0000000..4b6e189 --- /dev/null +++ b/remodel/k8s/apps/media/plex/pvc.yaml @@ -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 diff --git a/remodel/k8s/apps/media/plex/svc.yaml b/remodel/k8s/apps/media/plex/svc.yaml new file mode 100644 index 0000000..9e12f14 --- /dev/null +++ b/remodel/k8s/apps/media/plex/svc.yaml @@ -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 \ No newline at end of file diff --git a/remodel/tofu/kubernetes/main.tf b/remodel/tofu/kubernetes/main.tf index 3ba1c8d..ce75cfc 100644 --- a/remodel/tofu/kubernetes/main.tf +++ b/remodel/tofu/kubernetes/main.tf @@ -122,7 +122,7 @@ module "volumes" { size = "1G" } pv-jellyfin-config = { - node = "abel" + node = "euclid" size = "12G" } pv-plex-config = {