From ab8782744e56812afec3aa929002245c27ae0fc5 Mon Sep 17 00:00:00 2001 From: Alexander Olofsson Date: Mon, 10 Aug 2020 14:02:19 +0200 Subject: [PATCH] Add matrix-media-repo chart --- charts/matrix-media-repo/.helmignore | 23 +++ charts/matrix-media-repo/Chart.lock | 6 + charts/matrix-media-repo/Chart.yaml | 17 ++ .../charts/postgresql-8.9.9.tgz | Bin 0 -> 33147 bytes charts/matrix-media-repo/templates/NOTES.txt | 21 +++ .../matrix-media-repo/templates/_helpers.tpl | 148 ++++++++++++++++++ .../templates/configuration.yaml | 27 ++++ .../templates/deployment.yaml | 99 ++++++++++++ charts/matrix-media-repo/templates/hpa.yaml | 28 ++++ .../matrix-media-repo/templates/ingress.yaml | 41 +++++ charts/matrix-media-repo/templates/pvc.yaml | 21 +++ .../matrix-media-repo/templates/secrets.yaml | 15 ++ .../matrix-media-repo/templates/service.yaml | 15 ++ .../templates/serviceaccount.yaml | 12 ++ .../templates/tests/test-connection.yaml | 15 ++ charts/matrix-media-repo/values.yaml | 147 +++++++++++++++++ 16 files changed, 635 insertions(+) create mode 100644 charts/matrix-media-repo/.helmignore create mode 100644 charts/matrix-media-repo/Chart.lock create mode 100644 charts/matrix-media-repo/Chart.yaml create mode 100644 charts/matrix-media-repo/charts/postgresql-8.9.9.tgz create mode 100644 charts/matrix-media-repo/templates/NOTES.txt create mode 100644 charts/matrix-media-repo/templates/_helpers.tpl create mode 100644 charts/matrix-media-repo/templates/configuration.yaml create mode 100644 charts/matrix-media-repo/templates/deployment.yaml create mode 100644 charts/matrix-media-repo/templates/hpa.yaml create mode 100644 charts/matrix-media-repo/templates/ingress.yaml create mode 100644 charts/matrix-media-repo/templates/pvc.yaml create mode 100644 charts/matrix-media-repo/templates/secrets.yaml create mode 100644 charts/matrix-media-repo/templates/service.yaml create mode 100644 charts/matrix-media-repo/templates/serviceaccount.yaml create mode 100644 charts/matrix-media-repo/templates/tests/test-connection.yaml create mode 100644 charts/matrix-media-repo/values.yaml diff --git a/charts/matrix-media-repo/.helmignore b/charts/matrix-media-repo/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/charts/matrix-media-repo/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/charts/matrix-media-repo/Chart.lock b/charts/matrix-media-repo/Chart.lock new file mode 100644 index 0000000..a2869e2 --- /dev/null +++ b/charts/matrix-media-repo/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: postgresql + repository: https://charts.bitnami.com/bitnami + version: 8.9.9 +digest: sha256:96236bac2038bcac3b3d763400f66e8fba617db3b6ea539e1323a0b641b17bcb +generated: "2020-08-10T13:39:11.874887873+02:00" diff --git a/charts/matrix-media-repo/Chart.yaml b/charts/matrix-media-repo/Chart.yaml new file mode 100644 index 0000000..aca8c4b --- /dev/null +++ b/charts/matrix-media-repo/Chart.yaml @@ -0,0 +1,17 @@ +--- +apiVersion: v2 +name: matrix-media-repo +description: Matrix media repository with multi-domain in mind. +appVersion: 1.2.0 + +type: application +version: 0.1.0 +maintainers: + - name: Alexander Olofsson + email: ace@haxalot.com + +dependencies: + - name: postgresql + version: ~8.9.4 + repository: https://charts.bitnami.com/bitnami + condition: postgresql.enabled diff --git a/charts/matrix-media-repo/charts/postgresql-8.9.9.tgz b/charts/matrix-media-repo/charts/postgresql-8.9.9.tgz new file mode 100644 index 0000000000000000000000000000000000000000..6cfc3bb5983b9bfebaf90f9b957dec032ce546df GIT binary patch literal 33147 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 literal 0 HcmV?d00001 diff --git a/charts/matrix-media-repo/templates/NOTES.txt b/charts/matrix-media-repo/templates/NOTES.txt new file mode 100644 index 0000000..15e14d2 --- /dev/null +++ b/charts/matrix-media-repo/templates/NOTES.txt @@ -0,0 +1,21 @@ +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 }}{{ . }} + {{- 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 "matrix-media-repo.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 "matrix-media-repo.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "matrix-media-repo.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 "matrix-media-repo.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80 +{{- end }} diff --git a/charts/matrix-media-repo/templates/_helpers.tpl b/charts/matrix-media-repo/templates/_helpers.tpl new file mode 100644 index 0000000..a348ab3 --- /dev/null +++ b/charts/matrix-media-repo/templates/_helpers.tpl @@ -0,0 +1,148 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "matrix-media-repo.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "matrix-media-repo.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "matrix-media-repo.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Get the correct image tag name +*/}} +{{- define "matrix-media-repo.imageTag" -}} +{{- .Values.image.tag | default (printf "v%s" .Chart.AppVersion) -}} +{{- end -}} + +{{/* +Common labels +*/}} +{{- define "matrix-media-repo.labels" -}} +helm.sh/chart: {{ include "matrix-media-repo.chart" . }} +{{ include "matrix-media-repo.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "matrix-media-repo.selectorLabels" -}} +app.kubernetes.io/name: {{ include "matrix-media-repo.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "matrix-media-repo.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "matrix-media-repo.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "matrix-media-repo.postgresql.fullname" -}} +{{- printf "%s-%s" .Release.Name "postgresql" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Set postgres host +*/}} +{{- define "matrix-media-repo.postgresql.host" -}} +{{- if .Values.postgresql.enabled -}} +{{- template "matrix-media-repo.postgresql.fullname" . -}} +{{- else -}} +{{ required "A valid externalPostgresql.host is required" .Values.externalPostgresql.host }} +{{- end -}} +{{- end -}} + +{{/* +Set postgres secret +*/}} +{{- define "matrix-media-repo.postgresql.secret" -}} +{{- if .Values.postgresql.enabled -}} +{{- template "matrix-media-repo.postgresql.fullname" . -}} +{{- else -}} +{{- template "matrix-media-repo.fullname" . -}} +{{- end -}} +{{- end -}} + +{{/* +Set postgres port +*/}} +{{- define "matrix-media-repo.postgresql.port" -}} +{{- if .Values.postgresql.enabled -}} +{{- if .Values.postgresql.service -}} +{{- default 5432 .Values.postgresql.service.port }} +{{- else -}} +5432 +{{- end -}} +{{- else -}} +{{- required "A valid externalPostgresql.port is required" .Values.externalPostgresql.port -}} +{{- end -}} +{{- end -}} + +{{/* +Set postgresql username +*/}} +{{- define "matrix-media-repo.postgresql.username" -}} +{{- if .Values.postgresql.enabled -}} +{{- default "postgres" .Values.postgresql.postgresqlUsername }} +{{- else -}} +{{ required "A valid externalPostgresql.username is required" .Values.externalPostgresql.username }} +{{- end -}} +{{- end -}} + +{{/* +Set postgresql password +*/}} +{{- define "matrix-media-repo.postgresql.password" -}} +{{- if .Values.postgresql.enabled -}} +{{- default "" .Values.postgresql.postgresqlPassword }} +{{- else -}} +{{ required "A valid externalPostgresql.password is required" .Values.externalPostgresql.password }} +{{- end -}} +{{- end -}} + +{{/* +Set postgresql database +*/}} +{{- define "matrix-media-repo.postgresql.database" -}} +{{- if .Values.postgresql.enabled -}} +{{- default "synapse" .Values.postgresql.postgresqlDatabase }} +{{- else -}} +{{ required "A valid externalPostgresql.database is required" .Values.externalPostgresql.database }} +{{- end -}} +{{- end -}} diff --git a/charts/matrix-media-repo/templates/configuration.yaml b/charts/matrix-media-repo/templates/configuration.yaml new file mode 100644 index 0000000..abbd221 --- /dev/null +++ b/charts/matrix-media-repo/templates/configuration.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "matrix-media-repo.fullname" . }} + labels: + {{- include "matrix-media-repo.labels" . | nindent 4 }} +data: + 00-media-repo.yaml: | + repo: + bindAddress: '0.0.0.0' + port: 8000 + logDirectory: '-' + + metrics: + enabled: true + bindAddress: '0.0.0.0' + port: 9000 + + 01-config.yaml: | + {{- .Values.config | toYaml | nindent 4 }} + +{{- range $domain, $config := .Values.homeservers }} + 02-{{ $domain | replace "." "-" }}.yaml: | + homeserver: {{ $domain }} + {{- $config | toYaml | nindent 4 }} + +{{- end }} diff --git a/charts/matrix-media-repo/templates/deployment.yaml b/charts/matrix-media-repo/templates/deployment.yaml new file mode 100644 index 0000000..5c141cd --- /dev/null +++ b/charts/matrix-media-repo/templates/deployment.yaml @@ -0,0 +1,99 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "matrix-media-repo.fullname" . }} + labels: + {{- include "matrix-media-repo.labels" . | nindent 4 }} +spec: +{{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} +{{- end }} + selector: + matchLabels: + {{- include "matrix-media-repo.selectorLabels" . | nindent 6 }} + template: + metadata: + annotations: + checksum/secrets: {{ include (print $.Template.BasePath "/secrets.yaml") $ | sha256sum }} + {{- with .Values.podAnnotations }} + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "matrix-media-repo.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "matrix-media-repo.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + command: + - sh + - -c + - | + ( + while true; do + cp -u /config/secrets/* /config/config/* /config/combined/ + sleep 30 + done + ) & + + REPO_CONFIG=/config/combined media_repo + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ include "matrix-media-repo.imageTag" . }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: 8000 + protocol: TCP + livenessProbe: + httpGet: + path: /healthz + port: http + readinessProbe: + httpGet: + path: /healthz + port: http + resources: + {{- toYaml .Values.resources | nindent 12 }} + volumeMounts: + - mountPath: /config/combined + name: empty + - mountPath: /config/config + name: config + - mountPath: /config/secrets + name: secrets + - mountPath: /media + name: data + volumes: + - name: empty + emptyDir: {} + - name: config + configMap: + name: {{ include "matrix-media-repo.fullname" . }} + - name: secrets + secret: + secretName: {{ include "matrix-media-repo.fullname" . }} + - name: data + {{- if or .Values.persistence.enabled .Values.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.persistence.existingClaim | default (include "matrix-media-repo.fullname" .) }} + {{- else }} + emptyDir: {} + {{- 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 }} diff --git a/charts/matrix-media-repo/templates/hpa.yaml b/charts/matrix-media-repo/templates/hpa.yaml new file mode 100644 index 0000000..0211744 --- /dev/null +++ b/charts/matrix-media-repo/templates/hpa.yaml @@ -0,0 +1,28 @@ +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "matrix-media-repo.fullname" . }} + labels: + {{- include "matrix-media-repo.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "matrix-media-repo.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/charts/matrix-media-repo/templates/ingress.yaml b/charts/matrix-media-repo/templates/ingress.yaml new file mode 100644 index 0000000..7410839 --- /dev/null +++ b/charts/matrix-media-repo/templates/ingress.yaml @@ -0,0 +1,41 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "matrix-media-repo.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "matrix-media-repo.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ . }} + backend: + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} diff --git a/charts/matrix-media-repo/templates/pvc.yaml b/charts/matrix-media-repo/templates/pvc.yaml new file mode 100644 index 0000000..35d0734 --- /dev/null +++ b/charts/matrix-media-repo/templates/pvc.yaml @@ -0,0 +1,21 @@ +{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: {{ include "matrix-media-repo.fullname" . }} + labels: + {{- include "matrix-media-repo.labels" . | nindent 4 }} +spec: + accessModes: + - {{ .Values.persistence.accessMode | quote }} + resources: + requests: + storage: {{ .Values.persistence.size | quote }} +{{- if .Values.persistence.storageClass }} + {{- if (eq "-" .Values.persistence.storageClass) }} + storageClassName: "" + {{- else }} + storageClassName: "{{ .Values.persistence.storageClass }}" + {{- end }} +{{- end }} +{{- end -}} diff --git a/charts/matrix-media-repo/templates/secrets.yaml b/charts/matrix-media-repo/templates/secrets.yaml new file mode 100644 index 0000000..f3378db --- /dev/null +++ b/charts/matrix-media-repo/templates/secrets.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "matrix-media-repo.fullname" . }} + labels: + {{- include "matrix-media-repo.labels" . | nindent 4 }} +stringData: + 00-database.yaml: | + database: +{{- $sslmode := "" }} +{{- if or .Values.postgresql.sslMode .Values.externalPostgresql.sslMode }} + {{- $sslmode = printf "?sslmode=%s" (.Values.postgresql.sslMode | default .Values.externalPostgresql.sslMode) }} +{{- end }} + postgres: "postgres://{{ include "matrix-media-repo.postgresql.username" . }}:{{ required "A password must be provided for Postgres" (include "matrix-media-repo.postgresql.password" .) }}@{{ include "matrix-media-repo.postgresql.host" . }}/{{ include "matrix-media-repo.postgresql.database" . }}{{ $sslmode }}" + diff --git a/charts/matrix-media-repo/templates/service.yaml b/charts/matrix-media-repo/templates/service.yaml new file mode 100644 index 0000000..5f576ff --- /dev/null +++ b/charts/matrix-media-repo/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "matrix-media-repo.fullname" . }} + labels: + {{- include "matrix-media-repo.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "matrix-media-repo.selectorLabels" . | nindent 4 }} diff --git a/charts/matrix-media-repo/templates/serviceaccount.yaml b/charts/matrix-media-repo/templates/serviceaccount.yaml new file mode 100644 index 0000000..4919e52 --- /dev/null +++ b/charts/matrix-media-repo/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "matrix-media-repo.serviceAccountName" . }} + labels: + {{- include "matrix-media-repo.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/charts/matrix-media-repo/templates/tests/test-connection.yaml b/charts/matrix-media-repo/templates/tests/test-connection.yaml new file mode 100644 index 0000000..4464442 --- /dev/null +++ b/charts/matrix-media-repo/templates/tests/test-connection.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "matrix-media-repo.fullname" . }}-test-connection" + labels: + {{- include "matrix-media-repo.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test-success +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "matrix-media-repo.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never diff --git a/charts/matrix-media-repo/values.yaml b/charts/matrix-media-repo/values.yaml new file mode 100644 index 0000000..54034d3 --- /dev/null +++ b/charts/matrix-media-repo/values.yaml @@ -0,0 +1,147 @@ +--- +replicaCount: 1 + +image: + repository: turt2live/matrix-media-repo + pullPolicy: IfNotPresent + # tag: "" + +imagePullSecrets: [] +# nameOverride: "" +# fullnameOverride: "" + +## Global configuration +## Ref: https://github.com/turt2live/matrix-media-repo/blob/master/config.sample.yaml +## +config: + datastores: + - type: file + enabled: true + forKinds: ["thumbnails", "remote_media", "local_media", "archives"] + opts: + path: /media +# +# - type: s3 +# enabled: true +# forKinds: ["thumbnails", "remote_media", "local_media", "archives"] +# opts: +# tempPath: "/tmp/mediarepo_s3_upload" +# endpoint: sfo2.digitaloceanspaces.com +# accessKeyId: "" +# accessSecret: "" +# ssl: true +# bucketName: "your-media-bucket" +# region: "sfo2" +# +# admins: +# - "@user:example.org" +# +# featureSupport: +# MSC2448: +# enabled: true + +## Per-domain configuration +## Ref: https://github.com/turt2live/matrix-media-repo/blob/master/docs/config.md +## +homeservers: {} +# example.org: +# csApi: 'https://example.org' +# backoffAt: 10 +# adminApiKind: 'matrix' +# identicons: +# enabled: false + +## Media persistence +## Can be disabled if no datastore uses it +## +persistence: + enabled: true + + # existingClaim: matrix-media-repo + # storageClass: "-" + accessMode: ReadWriteOnce + size: 16Gi + + +## This configuration is for setting up the internally provided Postgres server, +## if you instead want to use an existing server, then you may want to set +## enabled to false and configure the externalPostgresql block. +## +postgresql: + enabled: true + + postgresqlUsername: matrix-media-repo + postgresqlDatabase: matrix-media-repo + + persistence: + size: 16G + +## An externally configured Postgres server +## +externalPostgresql: + # host: postgres + port: 5432 + username: matrix-media-repo + # password: matrix-media-repo + database: matrix-media-repo + # sslMode: require + +serviceAccount: + # Specifies whether a service account should be created + create: false + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: {} + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 80 + +ingress: + enabled: false + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: chart-example.local + paths: [] + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: {} + # limits: + # cpu: 250m + # memory: 512Mi + # requests: + # cpu: 250m + # memory: 512Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 4 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +nodeSelector: {} + +tolerations: [] + +affinity: {}