From 3a9310e1d9ebce2c9705f912566ac69e1c6f0e44 Mon Sep 17 00:00:00 2001 From: WrenIX Date: Sat, 17 Aug 2024 02:36:27 +0200 Subject: [PATCH] feat(nextcloud): Add support of imaginary an externalPreviewProvider Signed-off-by: WrenIX --- .github/workflows/lint-test.yaml | 4 + charts/nextcloud/Chart.yaml | 2 +- charts/nextcloud/README.md | 45 ++++++++++ .../defaultConfigs/imaginary.config.php.tpl | 4 + .../templates/imaginary/deployment.yaml | 88 +++++++++++++++++++ .../templates/imaginary/service.yaml | 36 ++++++++ charts/nextcloud/test-values/imaginary.yaml | 14 +++ charts/nextcloud/values.yaml | 67 ++++++++++++++ 8 files changed, 259 insertions(+), 1 deletion(-) create mode 100644 charts/nextcloud/files/defaultConfigs/imaginary.config.php.tpl create mode 100644 charts/nextcloud/templates/imaginary/deployment.yaml create mode 100644 charts/nextcloud/templates/imaginary/service.yaml create mode 100644 charts/nextcloud/test-values/imaginary.yaml diff --git a/.github/workflows/lint-test.yaml b/.github/workflows/lint-test.yaml index 4c673cbc..a5601351 100644 --- a/.github/workflows/lint-test.yaml +++ b/.github/workflows/lint-test.yaml @@ -88,6 +88,10 @@ jobs: helm_args: | --namespace nextcloud --skip-clean-up --helm-extra-set-args "--set=fullnameOverride=nextcloud --set=nextcloud.objectStore.s3.enabled=true --set=nextcloud.objectStore.s3.accessKey=nextcloud --set=nextcloud.objectStore.s3.secretKey=rootpass123 --set=nextcloud.objectStore.s3.host=minio.nextcloud.svc.cluster.local --set=nextcloud.objectStore.s3.port=9000 --set=nextcloud.objectStore.s3.ssl=false --set=nextcloud.objectStore.s3.bucket=nextcloud --set=nextcloud.objectStore.s3.usePathStyle=true --set=image.flavor=fpm --set=nginx.enabled=true --set=nextcloud.host=nextcloud --set=nextcloud.trustedDomains[0]='*'" + # test the helm chart with imaginary + - name: Imaginary Enabled + helm_args: --helm-extra-set-args "--values charts/nextcloud/test-values/imaginary.yaml" + steps: - name: Checkout uses: actions/checkout@v4 diff --git a/charts/nextcloud/Chart.yaml b/charts/nextcloud/Chart.yaml index 10bdc1e3..b87c62a3 100644 --- a/charts/nextcloud/Chart.yaml +++ b/charts/nextcloud/Chart.yaml @@ -1,6 +1,6 @@ apiVersion: v2 name: nextcloud -version: 6.2.2 +version: 6.3.0 appVersion: 30.0.2 description: A file sharing server that puts the control and security of your own data back into your hands. keywords: diff --git a/charts/nextcloud/README.md b/charts/nextcloud/README.md index 71e7cce8..5f2f440f 100644 --- a/charts/nextcloud/README.md +++ b/charts/nextcloud/README.md @@ -23,6 +23,7 @@ helm install my-release nextcloud/nextcloud * [Metrics Configurations](#metrics-configurations) * [Headers set on nginx](#headers-set-on-nginx) * [Probes Configurations](#probes-configurations) + * [Imaginary](#imaginary) * [Cron jobs](#cron-jobs) * [Using the nextcloud docker image auto-configuration via env vars](#using-the-nextcloud-docker-image-auto-configuration-via-env-vars) * [Multiple config.php file](#multiple-configphp-file) @@ -490,6 +491,50 @@ The nextcloud deployment includes a series of different probes you can use to de > [!Note] > If you are getting errors on initialization (such as `Fatal error: require_once(): Failed opening required '/var/www/html/lib/versioncheck.php'`, but you can get other errors as well), a good first step is to try and enable the startupProbe and/or increase the `initialDelaySeconds` for the `livenessProbe` and `readinessProbe` to something much greater (consider using `120` seconds instead of `10`. This is an especially good idea if your cluster is running on older hardware, has a slow internet connection, or you're using a slower storage class, such as NFS that's running with older disks or a slow connection. +### Imaginary + +We include an optional external preview provider from [h2non/imaginary](https://github.com/h2non/imaginary). + +| Parameter | Description | Default | +|----------------------------------------|-----------------------------------------------------------------------------------------|-------------------| +| `imaginary.enabled` | Start Imaginary | `false` | +| `imaginary.replicaCount` | Number of imaginary pod replicas to deploy | `1` | +| `imaginary.image.registry` | Imaginary image name | `docker.io` | +| `imaginary.image.repository` | Imaginary image name | `h2non/imaginary` | +| `imaginary.image.tag` | Imaginary image tag | `1.2.4` | +| `imaginary.image.pullPolicy` | Imaginary image pull policy | `IfNotPresent` | +| `imaginary.image.pullSecrets` | Imaginary image pull secrets | `nil` | +| `imaginary.podAnnotations` | Additional annotations for imaginary | `{}` | +| `imaginary.podLabels` | Additional labels for imaginary | `{}` | +| `imaginary.resources` | imaginary resources | `{}` | +| `imaginary.securityContext` | Optional security context for the Imaginary container | `nil` | +| `imaginary.podSecurityContext` | Optional security context for the Imaginary pod (applies to all containers in the pod) | `nil` | +| `imaginary.service.type` | Imaginary: Kubernetes Service type | `ClusterIP` | +| `imaginary.service.loadBalancerIP` | Imaginary: LoadBalancerIp for service type LoadBalancer | `nil` | +| `imaginary.service.nodePort` | Imaginary: NodePort for service type NodePort | `nil` | +| `imaginary.service.annotations` | Additional annotations for service imaginary | `{}` | +| `imaginary.service.labels` | Additional labels for service imaginary | `{}` | + + +> [!Note] +> You also need to setup nextcloud, to use imaginary +```yaml +nextcloud: + defaultConfigs: + imaginary.config.php: true + configs: + previews.config.php: |- + array( + 0 => 'OC\\Preview\\Imaginary', + 1 => 'OC\\Preview\\ImaginaryPDF', + ); + +imaginary: + enabled: true +``` + ## Cron jobs To execute [background tasks](https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/background_jobs_configuration.html) by using system cron instead of default Ajax cron, set `cronjob.enabled` parameter to `true`. Background jobs are important for tasks that do not necessarily need user intervention, but still need to be executed frequently (cleaning up, sending some notifications, pulling RSS feeds, etc.). diff --git a/charts/nextcloud/files/defaultConfigs/imaginary.config.php.tpl b/charts/nextcloud/files/defaultConfigs/imaginary.config.php.tpl new file mode 100644 index 00000000..95719b15 --- /dev/null +++ b/charts/nextcloud/files/defaultConfigs/imaginary.config.php.tpl @@ -0,0 +1,4 @@ + 'http://{{ template "nextcloud.fullname" . }}-imaginary', +); diff --git a/charts/nextcloud/templates/imaginary/deployment.yaml b/charts/nextcloud/templates/imaginary/deployment.yaml new file mode 100644 index 00000000..3845a2a0 --- /dev/null +++ b/charts/nextcloud/templates/imaginary/deployment.yaml @@ -0,0 +1,88 @@ +{{- if .Values.imaginary.enabled }} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "nextcloud.fullname" . }}-imaginary + labels: + app.kubernetes.io/name: {{ include "nextcloud.name" . }} + helm.sh/chart: {{ include "nextcloud.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/component: imaginary +spec: + replicas: {{ .Values.imaginary.replicaCount }} + selector: + matchLabels: + app.kubernetes.io/name: {{ include "nextcloud.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/component: imaginary + template: + metadata: + annotations: + {{- toYaml .Values.imaginary.podAnnotations | nindent 8 }} + labels: + app.kubernetes.io/name: {{ include "nextcloud.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/component: imaginary + {{- with .Values.imaginary.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- with .Values.imaginary.image.pullSecrets }} + imagePullSecrets: + {{- range . }} + - name: {{ . }} + {{- end}} + {{- end }} + containers: + - name: imaginary + {{- with .Values.imaginary.image }} + image: "{{ .registry }}/{{ .repository }}:{{ .tag }}" + imagePullPolicy: {{ .pullPolicy }} + {{- end }} + env: + - name: PORT + value: "9000" + ports: + - name: http + containerPort: 9000 + {{- with .Values.imaginary.readinessProbe }} + {{- if .enabled }} + readinessProbe: + httpGet: + path: /health + port: http + scheme: HTTP + failureThreshold: {{ .failureThreshold }} + successThreshold: {{ .successThreshold }} + periodSeconds: {{ .periodSeconds }} + timeoutSeconds: {{ .timeoutSeconds }} + {{- end }} + {{- end }} + {{- with .Values.imaginary.livenessProbe }} + {{- if .enabled }} + livenessProbe: + httpGet: + path: /health + port: http + scheme: HTTP + failureThreshold: {{ .failureThreshold }} + successThreshold: {{ .successThreshold }} + periodSeconds: {{ .periodSeconds }} + timeoutSeconds: {{ .timeoutSeconds }} + {{- end }} + {{- end }} + {{- with .Values.imaginary.resources }} + resources: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.imaginary.securityContext }} + securityContext: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.imaginary.podSecurityContext }} + securityContext: + {{- toYaml . | nindent 12 }} + {{- end }} +{{- end }} diff --git a/charts/nextcloud/templates/imaginary/service.yaml b/charts/nextcloud/templates/imaginary/service.yaml new file mode 100644 index 00000000..7f4b09e0 --- /dev/null +++ b/charts/nextcloud/templates/imaginary/service.yaml @@ -0,0 +1,36 @@ +{{- if .Values.imaginary.enabled }} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ template "nextcloud.fullname" . }}-imaginary + labels: + app.kubernetes.io/name: {{ include "nextcloud.name" . }} + helm.sh/chart: {{ include "nextcloud.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/component: imaginary + {{- with .Values.imaginary.service.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.imaginary.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.imaginary.service.type }} + {{- with .Values.imaginary.service.loadBalancerIP }} + loadBalancerIP: {{ . }} + {{- end }} + ports: + - name: http + port: 80 + targetPort: http + {{- with .Values.imaginary.service.nodePort }} + nodePort: {{ . }} + {{- end }} + selector: + app.kubernetes.io/name: {{ include "nextcloud.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/component: imaginary +{{- end }} diff --git a/charts/nextcloud/test-values/imaginary.yaml b/charts/nextcloud/test-values/imaginary.yaml new file mode 100644 index 00000000..a3139969 --- /dev/null +++ b/charts/nextcloud/test-values/imaginary.yaml @@ -0,0 +1,14 @@ +nextcloud: + defaultConfigs: + imaginary.config.php: true + configs: + previews.config.php: |- + array( + 0 => 'OC\\Preview\\Imaginary', + 1 => 'OC\\Preview\\ImaginaryPDF', + ); + +imaginary: + enabled: true diff --git a/charts/nextcloud/values.yaml b/charts/nextcloud/values.yaml index 586361eb..a3604c64 100644 --- a/charts/nextcloud/values.yaml +++ b/charts/nextcloud/values.yaml @@ -208,6 +208,8 @@ nextcloud: swift.config.php: true # disables the web based updater as the default nextcloud docker image does not support it upgrade-disable-web.config.php: true + # -- imaginary support config + imaginary.config.php: false # Extra config files created in /var/www/html/config/ # ref: https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/config_sample_php_parameters.html#multiple-config-php-file @@ -620,6 +622,71 @@ dnsConfig: {} # - name: ndots # value: "1" +imaginary: + # -- Start Imgaginary + enabled: false + # -- Number of imaginary pod replicas to deploy + replicaCount: 1 + + image: + # -- Imaginary image registry + registry: docker.io + # -- Imaginary image name + repository: h2non/imaginary + # -- Imaginary image tag + tag: 1.2.4 + # -- Imaginary image pull policy + pullPolicy: IfNotPresent + # -- Imaginary image pull secrets + pullSecrets: [] + + # -- Additional annotations for imaginary + podAnnotations: {} + # -- Additional labels for imaginary + podLabels: {} + # -- imaginary resources + resources: {} + + # -- Optional security context for the Imaginary container + securityContext: + runAsUser: 1000 + runAsNonRoot: true + # allowPrivilegeEscalation: false + # capabilities: + # drop: + # - ALL + + # -- Optional security context for the Imaginary pod (applies to all containers in the pod) + podSecurityContext: {} + # runAsNonRoot: true + # seccompProfile: + # type: RuntimeDefault + + readinessProbe: + enabled: true + failureThreshold: 3 + successThreshold: 1 + periodSeconds: 10 + timeoutSeconds: 1 + livenessProbe: + enabled: true + failureThreshold: 3 + successThreshold: 1 + periodSeconds: 10 + timeoutSeconds: 1 + + service: + # -- Imaginary: Kubernetes Service type + type: ClusterIP + # -- Imaginary: LoadBalancerIp for service type LoadBalancer + loadBalancerIP: + # -- Imaginary: NodePort for service type NodePort + nodePort: + # -- Additional annotations for service imaginary + annotations: {} + # -- Additional labels for service imaginary + labels: {} + ## Prometheus Exporter / Metrics ## metrics: