diff --git a/charts/donetick/values.yaml b/charts/donetick/values.yaml index 6c7973e..88234d7 100644 --- a/charts/donetick/values.yaml +++ b/charts/donetick/values.yaml @@ -85,13 +85,13 @@ extraVolumeMounts: [] extraVolumes: [] ## Resource limits and requests -resources: - limits: - cpu: 500m - memory: 512Mi - requests: - cpu: 100m - memory: 128Mi +# resources: +# limits: +# cpu: 500m +# memory: 512Mi +# requests: +# cpu: 100m +# memory: 128Mi ## Application health checks probes: diff --git a/charts/jellyseerr/Chart.yaml b/charts/jellyseerr/Chart.yaml new file mode 100644 index 0000000..505d855 --- /dev/null +++ b/charts/jellyseerr/Chart.yaml @@ -0,0 +1,16 @@ +apiVersion: v2 +name: jellyseerr +description: A Helm chart for Jellyseerr - A fork of Overseerr for Jellyfin support +type: application +version: 0.0.1 +appVersion: 2.5.2 +maintainers: + - name: Richard Tomik + email: no@m.com +keywords: + - jellyseerr + - jellyfin + - media-requests +home: https://github.com/rtomik/helm-charts +sources: + - https://github.com/fallenbagel/jellyseerr \ No newline at end of file diff --git a/charts/jellyseerr/NOTES.txt b/charts/jellyseerr/NOTES.txt new file mode 100644 index 0000000..873fac0 --- /dev/null +++ b/charts/jellyseerr/NOTES.txt @@ -0,0 +1,32 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "jellyseerr.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "jellyseerr.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "jellyseerr.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "jellyseerr.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} + +2. Jellyseerr will be available at port {{ .Values.service.port }} + +{{- if .Values.persistence.enabled }} +3. Data is persisted using PVC: {{ if .Values.persistence.existingClaim }}{{ .Values.persistence.existingClaim }}{{ else }}{{ include "jellyseerr.fullname" . }}-config{{ end }} +{{- else }} +3. WARNING: No persistence enabled. Data will be lost when pods are restarted. +{{- end }} + +For more information about using this Helm chart, please refer to the README.md file. diff --git a/charts/jellyseerr/readme.md b/charts/jellyseerr/readme.md new file mode 100644 index 0000000..cb25249 --- /dev/null +++ b/charts/jellyseerr/readme.md @@ -0,0 +1,142 @@ +# Jellyseerr Helm Chart + +A Helm chart for deploying [Jellyseerr](https://github.com/fallenbagel/jellyseerr) on Kubernetes. + +## Introduction + +This chart deploys Jellyseerr on a Kubernetes cluster using the Helm package manager. Jellyseerr is a fork of Overseerr for Jellyfin support. + +## Prerequisites + +- Kubernetes 1.19+ +- Helm 3.0+ +- PV provisioner support in the underlying infrastructure (if persistence is needed) + +## Installing the Chart + +To install the chart with the release name `jellyseerr`: + +```bash +$ helm repo add rtomik-charts https://rtomik.github.io/helm-charts +$ helm install jellyseerr rtomik-charts/jellyseerr +``` + +> **Tip**: List all releases using `helm list` + +## Uninstalling the Chart + +To uninstall/delete the `jellyseerr` deployment: + +```bash +$ helm uninstall jellyseerr +``` + +## Parameters + +### Global parameters + +| Name | Description | Value | +|------------------------|---------------------------------------------------------------|--------| +| `nameOverride` | String to partially override the release name | `""` | +| `fullnameOverride` | String to fully override the release name | `""` | + +### Image parameters + +| Name | Description | Value | +|-------------------------|--------------------------------------------------------------|--------------------------------| +| `image.repository` | Jellyseerr image repository | `ghcr.io/fallenbagel/jellyseerr` | +| `image.tag` | Jellyseerr image tag | `latest` | +| `image.pullPolicy` | Jellyseerr image pull policy | `IfNotPresent` | +| `imagePullSecrets` | Global Docker registry secret names as an array | `[]` | + +### Deployment parameters + +| Name | Description | Value | +|--------------------------------------|--------------------------------------------------|-----------| +| `replicaCount` | Number of Jellyseerr replicas | `1` | +| `revisionHistoryLimit` | Number of revisions to retain for rollback | `3` | +| `podSecurityContext.runAsNonRoot` | Run containers as non-root user | `true` | +| `podSecurityContext.runAsUser` | User ID for the container | `1000` | +| `podSecurityContext.fsGroup` | Group ID for the container filesystem | `1000` | +| `containerSecurityContext` | Security context for the container | See values.yaml | +| `nodeSelector` | Node labels for pod assignment | `{}` | +| `tolerations` | Tolerations for pod assignment | `[]` | +| `affinity` | Affinity for pod assignment | `{}` | + +### Service parameters + +| Name | Description | Value | +|----------------------------|----------------------------------------------|-------------| +| `service.type` | Kubernetes Service type | `ClusterIP` | +| `service.port` | Service HTTP port | `5055` | + +### Ingress parameters + +| Name | Description | Value | +|----------------------------|----------------------------------------------|------------------------| +| `ingress.enabled` | Enable ingress record generation | `false` | +| `ingress.className` | IngressClass name | `""` | +| `ingress.annotations` | Additional annotations for the Ingress resource | `{}` | +| `ingress.hosts` | Array of host and path objects | See values.yaml | +| `ingress.tls` | TLS configuration | `[]` | + +### Persistence parameters + +| Name | Description | Value | +|-------------------------------|----------------------------------------------|-----------------| +| `persistence.enabled` | Enable persistence using PVC | `true` | +| `persistence.existingClaim` | Use an existing PVC | `""` | +| `persistence.storageClass` | PVC Storage Class | `""` | +| `persistence.accessMode` | PVC Access Mode | `ReadWriteOnce` | +| `persistence.size` | PVC Storage Size | `1Gi` | +| `persistence.annotations` | Additional custom annotations for the PVC | `{}` | + +### Environment variables + +| Name | Description | Value | +|--------------------------|----------------------------------------------|-----------------| +| `env` | Environment variables for Jellyseerr | See values.yaml | +| `extraEnv` | Additional environment variables | `[]` | + +### Resources parameters + +| Name | Description | Value | +|--------------------------|----------------------------------------------|-----------------| +| `resources.limits` | The resources limits for containers | See values.yaml | +| `resources.requests` | The resources requests for containers | See values.yaml | + +## Configuration + +The following table lists the configurable parameters of the Jellyseerr chart and their default values. + +### Environment Variables + +You can configure Jellyseerr by setting environment variables: + +```yaml +env: + - name: TZ + value: "America/New_York" + - name: LOG_LEVEL + value: "info" + - name: PORT + value: "5055" +``` + +### Using Persistence + +By default, persistence is enabled with a 1Gi volume: + +```yaml +persistence: + enabled: true + size: 1Gi +``` + +You can also use an existing PVC: + +```yaml +persistence: + enabled: true + existingClaim: my-jellyseerr-pvc +``` \ No newline at end of file diff --git a/charts/jellyseerr/templates/_helpers.tpl b/charts/jellyseerr/templates/_helpers.tpl new file mode 100644 index 0000000..7eb6303 --- /dev/null +++ b/charts/jellyseerr/templates/_helpers.tpl @@ -0,0 +1,45 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "jellyseerr.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +*/}} +{{- define "jellyseerr.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- printf "%s" $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "jellyseerr.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "jellyseerr.labels" -}} +helm.sh/chart: {{ include "jellyseerr.chart" . }} +{{ include "jellyseerr.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "jellyseerr.selectorLabels" -}} +app.kubernetes.io/name: {{ include "jellyseerr.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} \ No newline at end of file diff --git a/charts/jellyseerr/templates/deployment.yaml b/charts/jellyseerr/templates/deployment.yaml new file mode 100644 index 0000000..b233591 --- /dev/null +++ b/charts/jellyseerr/templates/deployment.yaml @@ -0,0 +1,107 @@ +### templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "jellyseerr.fullname" . }} + labels: + {{- include "jellyseerr.labels" . | nindent 4 }} + annotations: +spec: + replicas: {{ .Values.replicaCount }} + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + {{- include "jellyseerr.selectorLabels" . | nindent 6 }} + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 1 + maxSurge: 1 + template: + metadata: + labels: + {{- include "jellyseerr.selectorLabels" . | nindent 8 }} + annotations: + {{- with .Values.podAnnotations }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.containerSecurityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if .Values.startupArgs }} + args: + {{- range .Values.startupArgs }} + - {{ . | quote }} + {{- end }} + {{- end }} + ports: + - name: http + containerPort: {{ .Values.service.port }} + protocol: TCP + {{- if .Values.probes.liveness.enabled }} + livenessProbe: + httpGet: + path: {{ .Values.probes.liveness.path }} + port: http + initialDelaySeconds: {{ .Values.probes.liveness.initialDelaySeconds }} + periodSeconds: {{ .Values.probes.liveness.periodSeconds }} + timeoutSeconds: {{ .Values.probes.liveness.timeoutSeconds }} + failureThreshold: {{ .Values.probes.liveness.failureThreshold }} + successThreshold: {{ .Values.probes.liveness.successThreshold }} + {{- end }} + {{- if .Values.probes.readiness.enabled }} + readinessProbe: + httpGet: + path: {{ .Values.probes.readiness.path }} + port: http + initialDelaySeconds: {{ .Values.probes.readiness.initialDelaySeconds }} + periodSeconds: {{ .Values.probes.readiness.periodSeconds }} + timeoutSeconds: {{ .Values.probes.readiness.timeoutSeconds }} + failureThreshold: {{ .Values.probes.readiness.failureThreshold }} + successThreshold: {{ .Values.probes.readiness.successThreshold }} + {{- end }} + env: + {{- range .Values.env }} + - name: {{ .name }} + value: {{ .value | quote }} + {{- end }} + {{- with .Values.extraEnv }} + {{- toYaml . | nindent 12 }} + {{- end }} + volumeMounts: + - name: config + mountPath: /app/config + {{- with .Values.extraVolumeMounts }} + {{- toYaml . | nindent 12 }} + {{- end }} + resources: + {{- toYaml .Values.resources | nindent 12 }} + volumes: + - name: config + persistentVolumeClaim: + claimName: {{ if .Values.persistence.existingClaim }}{{ .Values.persistence.existingClaim }}{{ else }}{{ include "jellyseerr.fullname" . }}-config{{ end }} + {{- with .Values.extraVolumes }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} \ No newline at end of file diff --git a/charts/jellyseerr/templates/ingress.yaml b/charts/jellyseerr/templates/ingress.yaml new file mode 100644 index 0000000..2653c7d --- /dev/null +++ b/charts/jellyseerr/templates/ingress.yaml @@ -0,0 +1,43 @@ +{{- if .Values.ingress.enabled -}} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ include "jellyseerr.fullname" . }} + labels: + {{- include "jellyseerr.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if .Values.ingress.className }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + {{- if .secretName }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + pathType: {{ .pathType }} + backend: + service: + name: {{ include "jellyseerr.fullname" $ }} + port: + number: {{ $.Values.service.port }} + {{- end }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/jellyseerr/templates/pvc.yaml b/charts/jellyseerr/templates/pvc.yaml new file mode 100644 index 0000000..95edc11 --- /dev/null +++ b/charts/jellyseerr/templates/pvc.yaml @@ -0,0 +1,21 @@ +{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "jellyseerr.fullname" . }}-config + labels: + {{- include "jellyseerr.labels" . | nindent 4 }} + {{- with .Values.persistence.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + accessModes: + - {{ .Values.persistence.accessMode | quote }} + {{- if .Values.persistence.storageClass }} + storageClassName: {{ .Values.persistence.storageClass | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.persistence.size | quote }} +{{- end }} \ No newline at end of file diff --git a/charts/jellyseerr/templates/service.yaml b/charts/jellyseerr/templates/service.yaml new file mode 100644 index 0000000..43a383a --- /dev/null +++ b/charts/jellyseerr/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "jellyseerr.fullname" . }} + labels: + {{- include "jellyseerr.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "jellyseerr.selectorLabels" . | nindent 4 }} \ No newline at end of file diff --git a/charts/jellyseerr/values.yaml b/charts/jellyseerr/values.yaml new file mode 100644 index 0000000..e8dc970 --- /dev/null +++ b/charts/jellyseerr/values.yaml @@ -0,0 +1,117 @@ +## Global settings +nameOverride: "" +fullnameOverride: "" + +## Image settings +image: + repository: ghcr.io/fallenbagel/jellyseerr + tag: 2.5.2 + pullPolicy: IfNotPresent + +## Deployment settings +replicaCount: 1 +revisionHistoryLimit: 3 + +# Optional startup arguments +startupArgs: [] + +# Pod security settings +podSecurityContext: + runAsNonRoot: true + runAsUser: 1000 + fsGroup: 1000 + +containerSecurityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: false + capabilities: + drop: + - ALL + +## Pod scheduling +nodeSelector: {} +tolerations: [] +affinity: {} + +## Pod annotations +podAnnotations: {} + +## Service settings +service: + type: ClusterIP + port: 5055 + +## Ingress settings +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + # cert-manager.io/cluster-issuer: letsencrypt-prod + hosts: + - host: jellyseerr.domain.com + paths: + - path: / + pathType: Prefix + tls: [] + # - hosts: + # - jellyseerr.domain.com + # secretName: jellyseerr-tls + +## Persistence settings +persistence: + enabled: true + existingClaim: "" + storageClass: "" + accessMode: ReadWriteOnce + size: 1Gi + annotations: {} + +## Environment variables +env: + - name: TZ + value: "UTC" + - name: LOG_LEVEL + value: "info" + - name: PORT + value: "5055" + +# Extra environment variables (for advanced use cases) +extraEnv: [] + # - name: NODE_ENV + # value: "production" + +# Extra volume mounts +extraVolumeMounts: [] + +# Extra volumes +extraVolumes: [] + +## Resource limits and requests +# resources: +# limits: +# cpu: 500m +# memory: 512Mi +# requests: +# cpu: 100m +# memory: 128Mi + +## Application health checks +probes: + liveness: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 + path: /api/v1/status + readiness: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 + successThreshold: 1 + path: /api/v1/status \ No newline at end of file diff --git a/charts/recipya/values.yaml b/charts/recipya/values.yaml index 65b01e6..5005f2e 100644 --- a/charts/recipya/values.yaml +++ b/charts/recipya/values.yaml @@ -78,13 +78,13 @@ persistence: retain: true # Resource limits and requests -resources: - limits: - cpu: 500m - memory: 512Mi - requests: - cpu: 100m - memory: 128Mi +# resources: +# limits: +# cpu: 500m +# memory: 512Mi +# requests: +# cpu: 100m +# memory: 128Mi # Node selector nodeSelector: {}