diff --git a/apps/base/jellyfin/allow-from-ingress.patch.yaml b/apps/base/jellyfin/allow-from-ingress.patch.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ed6a2bd895f0a63289fe4c3d4cd0c5d2aa85ac33 --- /dev/null +++ b/apps/base/jellyfin/allow-from-ingress.patch.yaml @@ -0,0 +1,9 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: allow-from-ingress +spec: + podSelector: + matchLabels: + app.kubernetes.io/component: jellyfin \ No newline at end of file diff --git a/apps/base/jellyfin/allow-to-public-web.patch.yaml b/apps/base/jellyfin/allow-to-public-web.patch.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8ff73f3005d3835401e7fa704293022fe9eecae4 --- /dev/null +++ b/apps/base/jellyfin/allow-to-public-web.patch.yaml @@ -0,0 +1,9 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: allow-to-public-web +spec: + podSelector: + matchLabels: + app.kubernetes.io/component: jellyfin \ No newline at end of file diff --git a/apps/base/jellyfin/deployment.yaml b/apps/base/jellyfin/deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ea42f570ee43e92f98fead2683acffacd4275c40 --- /dev/null +++ b/apps/base/jellyfin/deployment.yaml @@ -0,0 +1,92 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: jellyfin +spec: + strategy: + type: Recreate + selector: + matchLabels: + app.kubernetes.io/component: jellyfin + template: + metadata: + labels: + app.kubernetes.io/component: jellyfin + spec: + serviceAccountName: jellyfin + containers: + - env: + - name: NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + image: docker.io/jellyfin/jellyfin:10.8.13 + imagePullPolicy: IfNotPresent + name: jellyfin + readinessProbe: + httpGet: + path: /health + port: 8096 + ports: + - containerPort: 8096 + protocol: TCP + volumeMounts: + - mountPath: /data/media + name: media + readOnly: False + - mountPath: /config/transcodes + name: transcodes-tmp + - mountPath: /config + name: jellyfin-config + - mountPath: /cache + name: jellyfin-cache + resources: + requests: + amd.com/gpu: 1 + memory: 2Gi + cpu: 100m + limits: + amd.com/gpu: 1 + memory: 3.5Gi + cpu: "4" + securityContext: + allowPrivilegeEscalation: false + restartPolicy: Always + securityContext: + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 + fsGroup: 1000 + seccompProfile: + type: "RuntimeDefault" + volumes: + - name: transcodes-tmp + ephemeral: + volumeClaimTemplate: + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Gi + - name: media + persistentVolumeClaim: + claimName: media + - name: jellyfin-config + persistentVolumeClaim: + claimName: jellyfin-config + - name: jellyfin-cache + emptyDir: + sizeLimit: 500Mi diff --git a/apps/base/jellyfin/kustomization.yaml b/apps/base/jellyfin/kustomization.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e9dcce4f76c87260ef3f1a1d596e3eb1ec8e5ad9 --- /dev/null +++ b/apps/base/jellyfin/kustomization.yaml @@ -0,0 +1,18 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: jellyfin + +resources: + - namespace.yaml + - deployment.yaml + - pvc.yaml + - service.yaml + - serviceaccount.yaml + - ../../../shared/networkpolicies/deny-by-default-ingress.yaml + - ../../../shared/networkpolicies/deny-by-default-egress.yaml + - ../../../shared/networkpolicies/allow-from-ingress.yaml + - ../../../shared/networkpolicies/allow-to-public-web.yaml + +patches: + - path: allow-from-ingress.patch.yaml + - path: allow-to-public-web.patch.yaml diff --git a/apps/base/jellyfin/namespace.yaml b/apps/base/jellyfin/namespace.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3afecf79708b4213cf008b70f639b4e4ebcbc947 --- /dev/null +++ b/apps/base/jellyfin/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: jellyfin \ No newline at end of file diff --git a/apps/base/jellyfin/pvc.yaml b/apps/base/jellyfin/pvc.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b7d0bf7f32cbb1822994dde76f08a59cd085a2d4 --- /dev/null +++ b/apps/base/jellyfin/pvc.yaml @@ -0,0 +1,22 @@ +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: jellyfin-config +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: media +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 10Gi diff --git a/apps/k8s01/jellyfin/service.yaml b/apps/base/jellyfin/service.yaml similarity index 62% rename from apps/k8s01/jellyfin/service.yaml rename to apps/base/jellyfin/service.yaml index 24a579ce4a995b4d3ae7169d9e7d2dbb3e5eafa8..35fe4198c2509287d8e853912e4e2109fff69581 100644 --- a/apps/k8s01/jellyfin/service.yaml +++ b/apps/base/jellyfin/service.yaml @@ -2,9 +2,6 @@ apiVersion: v1 kind: Service metadata: - labels: - app.kubernetes.io/name: jellyfin - app.kubernetes.io/component: jellyfin name: jellyfin spec: ports: @@ -13,6 +10,5 @@ spec: protocol: TCP targetPort: 8096 selector: - app.kubernetes.io/name: jellyfin app.kubernetes.io/component: jellyfin type: ClusterIP diff --git a/apps/base/jellyfin/serviceaccount.yaml b/apps/base/jellyfin/serviceaccount.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4271ce2019de7060095162762d0b44c950e8f3e2 --- /dev/null +++ b/apps/base/jellyfin/serviceaccount.yaml @@ -0,0 +1,7 @@ +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: jellyfin + namespace: jellyfin +automountServiceAccountToken: false \ No newline at end of file diff --git a/apps/k8s01/jellyfin/deployment.yaml b/apps/k8s01/jellyfin/deployment.yaml index 51d0c558fc8a5958e42eaa4e561a23d080a351e6..0f0a1d7713854725968c457f96a2b1cd0c167b3d 100644 --- a/apps/k8s01/jellyfin/deployment.yaml +++ b/apps/k8s01/jellyfin/deployment.yaml @@ -1,106 +1,22 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: jellyfin - labels: - app.kubernetes.io/name: jellyfin - app.kubernetes.io/component: jellyfin -spec: - strategy: - type: Recreate - selector: - matchLabels: - app.kubernetes.io/name: jellyfin - app.kubernetes.io/component: jellyfin - template: - metadata: - labels: - app.kubernetes.io/name: jellyfin - app.kubernetes.io/component: jellyfin - spec: - containers: - - env: - - name: NODE_NAME - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: spec.nodeName - - name: POD_NAME - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: metadata.namespace - image: docker.io/jellyfin/jellyfin:10.8.13 - imagePullPolicy: IfNotPresent - name: jellyfin - readinessProbe: - httpGet: - path: /health - port: 8096 - ports: - - containerPort: 8096 - protocol: TCP - volumeMounts: - - mountPath: /data/media/shows - name: shows - - mountPath: /data/media/movies - name: movies - - mountPath: /data/media - name: media - readOnly: False - - mountPath: /config/transcodes - name: transcodes-tmp - - mountPath: /config - name: jellyfin-config - - mountPath: /cache - name: jellyfin-cache - resources: - requests: - amd.com/gpu: 1 - memory: 2Gi - cpu: 100m - limits: - amd.com/gpu: 1 - memory: 3.5Gi - cpu: "4" - securityContext: - allowPrivilegeEscalation: false - restartPolicy: Always - securityContext: - runAsNonRoot: true - runAsUser: 1000 - runAsGroup: 1000 - fsGroup: 1000 - seccompProfile: - type: "RuntimeDefault" - volumes: - - name: transcodes-tmp - ephemeral: - volumeClaimTemplate: - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 50Gi - - name: movies - persistentVolumeClaim: - claimName: jellyfin-movies - - name: shows - persistentVolumeClaim: - claimName: jellyfin-shows - - name: media - persistentVolumeClaim: - claimName: media - - name: jellyfin-config - persistentVolumeClaim: - claimName: jellyfin-config - - name: jellyfin-cache - emptyDir: - sizeLimit: 500Mi +- op: add + path: /spec/template/spec/volumes/0 + value: + name: movies + persistentVolumeClaim: + claimName: jellyfin-movies +- op: add + path: /spec/template/spec/volumes/0 + value: + name: shows + persistentVolumeClaim: + claimName: jellyfin-shows +- op: add + path: /spec/template/spec/containers/0/volumeMounts/0 + value: + mountPath: /data/media/shows + name: shows +- op: add + path: /spec/template/spec/containers/0/volumeMounts/0 + value: + mountPath: /data/media/movies + name: movies \ No newline at end of file diff --git a/apps/k8s01/jellyfin/kustomization.yaml b/apps/k8s01/jellyfin/kustomization.yaml index 93d58e9751c0408ab63c03016840e45b5ed3bf5b..c98b7c9f3ae8bc968ef4f2fbb27ff1fe57b4aab9 100644 --- a/apps/k8s01/jellyfin/kustomization.yaml +++ b/apps/k8s01/jellyfin/kustomization.yaml @@ -1,19 +1,24 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: jellyfin + +commonLabels: + app.kubernetes.io/name: jellyfin + app.kubernetes.io/instance: jellyfin + resources: - - namespace.yaml + - ../../base/jellyfin - pv.yaml - pvc.yaml - - deployment.yaml - - service.yaml - certificate.yaml - ingress.yaml - slo.yaml - - ../../../shared/networkpolicies/deny-by-default-ingress.yaml - - ../../../shared/networkpolicies/deny-by-default-egress.yaml - - ../../../shared/networkpolicies/allow-from-ingress.yaml - - ../../../shared/networkpolicies/allow-to-public-web.yaml - ../../../shared/resourcequotas/default.yaml -patchesStrategicMerge: - - networkpolicy.yaml \ No newline at end of file + +patches: + - path: deployment.yaml + target: + kind: Deployment + group: apps + version: v1 + name: jellyfin \ No newline at end of file diff --git a/apps/k8s01/jellyfin/namespace.yaml b/apps/k8s01/jellyfin/namespace.yaml deleted file mode 100644 index 1dbc13b460e032f6018747da986ef1b0520df221..0000000000000000000000000000000000000000 --- a/apps/k8s01/jellyfin/namespace.yaml +++ /dev/null @@ -1,31 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: jellyfin - labels: - pod-security.kubernetes.io/audit: restricted - pod-security.kubernetes.io/enforce: baseline - pod-security.kubernetes.io/warn: restricted - pod-security.kubernetes.io/audit-version: v1.26 - pod-security.kubernetes.io/enforce-version: v1.23 - pod-security.kubernetes.io/warn-version: v1.26 ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: flux-reconciler - namespace: jellyfin ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: flux-reconciler - namespace: jellyfin -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: admin -subjects: - - kind: ServiceAccount - name: flux-reconciler - namespace: jellyfin diff --git a/apps/k8s01/jellyfin/networkpolicy.yaml b/apps/k8s01/jellyfin/networkpolicy.yaml deleted file mode 100644 index ab9a83f1d3e7c5c648bcd2d87d10c4866040a57d..0000000000000000000000000000000000000000 --- a/apps/k8s01/jellyfin/networkpolicy.yaml +++ /dev/null @@ -1,26 +0,0 @@ ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: allow-from-ingress - labels: - app.kubernetes.io/name: jellyfin - app.kubernetes.io/component: jellyfin -spec: - podSelector: - matchLabels: - app.kubernetes.io/name: jellyfin - app.kubernetes.io/component: jellyfin ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: allow-to-public-web - labels: - app.kubernetes.io/name: jellyfin - app.kubernetes.io/component: jellyfin -spec: - podSelector: - matchLabels: - app.kubernetes.io/name: jellyfin - app.kubernetes.io/component: jellyfin \ No newline at end of file diff --git a/apps/k8s01/jellyfin/pvc.yaml b/apps/k8s01/jellyfin/pvc.yaml index 618a3a802fedfd7da8b35662583f70803d0f2503..1595358b44bc0620094ac1005bf1e28b00e6e9af 100644 --- a/apps/k8s01/jellyfin/pvc.yaml +++ b/apps/k8s01/jellyfin/pvc.yaml @@ -31,31 +31,3 @@ spec: requests: storage: 2Ti volumeName: jellyfin-shows ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: jellyfin-config - labels: - app.kubernetes.io/name: jellyfin - app.kubernetes.io/component: jellyfin -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 10Gi ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: media - labels: - app.kubernetes.io/name: jellyfin - app.kubernetes.io/component: jellyfin -spec: - accessModes: - - ReadWriteMany - resources: - requests: - storage: 10Gi