From 0b354fa151029a8cb28f6de793c15a6ddeea3f0b Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Thu, 29 Sep 2022 01:08:30 +0300 Subject: [PATCH] feat(immich): add immich (#3942) * feat(immich): add immich * quote bool * mount nginx config on proxy * run as node user * fix CM * hmm * make entrypoint executables * server entrypoint * whoops * chmod something.. * add mapbox keys * fix cm * fix cm * add some probes * one mroe probe * split configmap * add ui * add all db envs to ML * passwds also --- charts/incubator/immich/.helmignore | 30 ++++ charts/incubator/immich/Chart.yaml | 33 ++++ charts/incubator/immich/README.md | 0 charts/incubator/immich/icon.png | Bin 0 -> 70371 bytes charts/incubator/immich/questions.yaml | 166 ++++++++++++++++++ .../incubator/immich/templates/_configmap.tpl | 142 +++++++++++++++ .../immich/templates/_microservices.tpl | 49 ++++++ charts/incubator/immich/templates/_ml.tpl | 49 ++++++ charts/incubator/immich/templates/_proxy.tpl | 44 +++++ charts/incubator/immich/templates/_secret.tpl | 27 +++ charts/incubator/immich/templates/_web.tpl | 41 +++++ charts/incubator/immich/templates/common.yaml | 15 ++ charts/incubator/immich/values.yaml | 99 +++++++++++ cspell.config.yaml | 2 + 14 files changed, 697 insertions(+) create mode 100644 charts/incubator/immich/.helmignore create mode 100644 charts/incubator/immich/Chart.yaml create mode 100644 charts/incubator/immich/README.md create mode 100644 charts/incubator/immich/icon.png create mode 100644 charts/incubator/immich/questions.yaml create mode 100644 charts/incubator/immich/templates/_configmap.tpl create mode 100644 charts/incubator/immich/templates/_microservices.tpl create mode 100644 charts/incubator/immich/templates/_ml.tpl create mode 100644 charts/incubator/immich/templates/_proxy.tpl create mode 100644 charts/incubator/immich/templates/_secret.tpl create mode 100644 charts/incubator/immich/templates/_web.tpl create mode 100644 charts/incubator/immich/templates/common.yaml create mode 100644 charts/incubator/immich/values.yaml diff --git a/charts/incubator/immich/.helmignore b/charts/incubator/immich/.helmignore new file mode 100644 index 00000000000..77ca5567b26 --- /dev/null +++ b/charts/incubator/immich/.helmignore @@ -0,0 +1,30 @@ +# 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 +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +# OWNERS file for Kubernetes +OWNERS +# helm-docs templates +*.gotmpl +# docs folder +/docs +# icon +icon.png diff --git a/charts/incubator/immich/Chart.yaml b/charts/incubator/immich/Chart.yaml new file mode 100644 index 00000000000..89ada2618f2 --- /dev/null +++ b/charts/incubator/immich/Chart.yaml @@ -0,0 +1,33 @@ +apiVersion: v2 +appVersion: "10.6.2" +dependencies: + - name: common + repository: https://library-charts.truecharts.org + version: 10.6.4 + - condition: postgresql.enabled + name: postgresql + repository: https://charts.truecharts.org/ + version: 8.0.88 + - condition: redis.enabled + name: redis + repository: https://charts.truecharts.org + version: 3.0.85 +description: High performance self-hosted photo and video backup solution. +home: https://truecharts.org/docs/charts/stable/airsonic +icon: https://truecharts.org/img/hotlink-ok/chart-icons/airsonic.png +keywords: + - photos +kubeVersion: ">=1.16.0-0" +maintainers: + - email: info@truecharts.org + name: TrueCharts + url: https://truecharts.org +name: immich +sources: + - https://github.com/immich-app/immich +version: 0.0.1 +annotations: + truecharts.org/catagories: | + - media + truecharts.org/SCALE-support: "true" + truecharts.org/grade: U diff --git a/charts/incubator/immich/README.md b/charts/incubator/immich/README.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/charts/incubator/immich/icon.png b/charts/incubator/immich/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f928b565580e99f9660c6c9fc1c8be5e8202ba3a GIT binary patch literal 70371 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 #msT{_^ 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 P9T3K73skNCo!I{Z8tjYk literal 0 HcmV?d00001 diff --git a/charts/incubator/immich/questions.yaml b/charts/incubator/immich/questions.yaml new file mode 100644 index 00000000000..cd4435983bd --- /dev/null +++ b/charts/incubator/immich/questions.yaml @@ -0,0 +1,166 @@ +# Include{groups} +portals: + open: +# Include{portalLink} +questions: +# Include{global} +# Include{controller} +# Include{controllerDeployment} +# Include{replicas} +# Include{replica1} +# Include{strategy} +# Include{recreate} +# Include{controllerExpert} +# Include{controllerExpertExtraArgs} + - variable: immich + group: Container Configuration + label: Immich Configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: public_login_page_message + label: Public Login Page Message + description: Custom message on the login page, should be written in HTML form. + schema: + type: string + default: "" + - variable: disable_reverse_geocoding + label: Disable Reverse Geocoding + schema: + type: boolean + default: false + - variable: reverse_geocoding_precision + label: Reverse Geocoding Precision + description: Reverse geocoding is done locally which has a small impact on memory usage. (Valid options 0 - 3) + schema: + type: int + show_if: [["disable_reverse_geocoding", "=", "false"]] + default: 3 + - variable: mapbox_enable + label: Enable MapBox + schema: + type: boolean + default: false + - variable: mapbox_key + label: MaxBox Key + schema: + type: string + private: true + show_if: [["maxbox_enable", "=", "false"]] + default: "" + - variable: log_level + label: Log Level + schema: + type: string + default: simple + enum: + - value: simple + description: simple + - value: verbose + description: verbose +# Include{containerConfig} +# Include{serviceRoot} + - variable: main + label: Main Service + description: The Primary service on which the healthcheck runs, often the webUI + schema: + additional_attrs: true + type: dict + attrs: +# Include{serviceSelectorLoadBalancer} +# Include{serviceSelectorExtras} + - variable: main + label: Main Service Port Configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: Port + description: This port exposes the container port on the service + schema: + type: int + default: 10323 + required: true +# Include{advancedPortHTTP} + - variable: targetPort + label: Target Port + description: The internal(!) port on the container the Application runs on + schema: + type: int + default: 10323 +# Include{serviceExpertRoot} + default: false +# Include{serviceExpert} +# Include{serviceList} +# Include{persistenceRoot} + - variable: uploads + label: App Uploads Storage + description: Stores the Application Uploads. + schema: + additional_attrs: true + type: dict + attrs: +# Include{persistenceBasic} +# Include{persistenceAdvanced} +# Include{persistenceList} +# Include{ingressRoot} + - variable: main + label: Main Ingress + schema: + additional_attrs: true + type: dict + attrs: +# Include{ingressDefault} +# Include{ingressTLS} +# Include{ingressTraefik} +# Include{ingressExpert} +# Include{ingressList} +# Include{security} +# Include{securityContextAdvancedRoot} + - variable: privileged + label: Privileged mode + schema: + type: boolean + default: false + - variable: readOnlyRootFilesystem + label: ReadOnly Root Filesystem + schema: + type: boolean + default: false + - variable: allowPrivilegeEscalation + label: Allow Privilege Escalation + schema: + type: boolean + default: false + - variable: runAsNonRoot + label: runAsNonRoot + schema: + type: boolean + default: false +# Include{securityContextAdvanced} +# Include{podSecurityContextRoot} + - variable: runAsUser + label: runAsUser + description: The UserID of the user running the application + schema: + type: int + default: 0 + - variable: runAsGroup + label: runAsGroup + description: The groupID this App of the user running the application + schema: + type: int + default: 0 + - variable: fsGroup + label: fsGroup + description: The group that should own ALL storage. + schema: + type: int + default: 568 +# Include{podSecurityContextAdvanced} +# Include{resources} +# Include{advanced} +# Include{addons} +# Include{documentation} diff --git a/charts/incubator/immich/templates/_configmap.tpl b/charts/incubator/immich/templates/_configmap.tpl new file mode 100644 index 00000000000..1ac8675c207 --- /dev/null +++ b/charts/incubator/immich/templates/_configmap.tpl @@ -0,0 +1,142 @@ +{{/* Define the configmap */}} +{{- define "immich.config" -}} + +{{- $serverConfigName := printf "%s-server-config" (include "tc.common.names.fullname" .) }} +{{- $commonConfigName := printf "%s-common-config" (include "tc.common.names.fullname" .) }} +{{- $proxyConfigName := printf "%s-proxy-config" (include "tc.common.names.fullname" .) }} + +--- + +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ $serverConfigName }} + labels: + {{- include "tc.common.labels" . | nindent 4 }} +data: + DB_HOSTNAME: {{ printf "%v-%v" .Release.Name "postgresql" }} + DB_USERNAME: {{ .Values.postgresql.postgresqlUsername }} + DB_DATABASE_NAME: {{ .Values.postgresql.postgresqlDatabase }} + DB_PORT: "5432" + REDIS_HOSTNAME: {{ printf "%v-%v" .Release.Name "redis" }} + REDIS_PORT: "6379" + REDIS_DBINDEX: "0" + {{/* User Defined */}} + DISABLE_REVERSE_GEOCODING: {{ .Values.immich.disable_reverse_geocoding | quote }} + REVERSE_GEOCODING_PRECISION: {{ .Values.immich.reverse_geocoding_precision | quote }} + ENABLE_MAPBOX: {{ .Values.immich.mapbox_enable | quote }} + +--- + +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ $commonConfigName }} + labels: + {{- include "tc.common.labels" . | nindent 4 }} +data: + NODE_ENV: production + {{/* User Defined */}} + PUBLIC_LOGIN_PAGE_MESSAGE: {{ .Values.immich.public_login_page_message }} + LOG_LEVEL: {{ .Values.immich.log_level }} +--- + +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ $proxyConfigName }} + labels: + {{- include "tc.common.labels" . | nindent 4 }} +data: + nginx.conf: | + worker_processes auto; + error_log /var/log/nginx/error.log; + pid /tmp/nginx.pid; + + # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. + include /usr/share/nginx/modules/*.conf; + + events { + worker_connections 1024; + } + + http { + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + + client_body_temp_path /tmp/client_temp; + proxy_temp_path /tmp/proxy_temp_path; + fastcgi_temp_path /tmp/fastcgi_temp; + uwsgi_temp_path /tmp/uwsgi_temp; + scgi_temp_path /tmp/scgi_temp; + + # events { + # worker_connections 1000; + # } + + server { + gzip on; + gzip_min_length 1000; + gunzip on; + + client_max_body_size 50000M; + + listen {{ .Values.service.main.ports.main.port }}; + access_log off; + + location /api { + # Compression + gzip_static on; + gzip_min_length 1000; + gzip_comp_level 2; + + proxy_buffering off; + proxy_buffer_size 16k; + proxy_busy_buffers_size 24k; + proxy_buffers 64 4k; + proxy_force_ranges on; + + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + + rewrite /api/(.*) /$1 break; + + # Server Container + proxy_pass http://localhost:3001; + } + + location / { + # Compression + gzip_static on; + gzip_min_length 1000; + gzip_comp_level 2; + + proxy_buffering off; + proxy_buffer_size 16k; + proxy_busy_buffers_size 24k; + proxy_buffers 64 4k; + proxy_force_ranges on; + + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + + # Web Container + proxy_pass http://localhost:3000; + } + } + } +{{- end -}} diff --git a/charts/incubator/immich/templates/_microservices.tpl b/charts/incubator/immich/templates/_microservices.tpl new file mode 100644 index 00000000000..08a414e767d --- /dev/null +++ b/charts/incubator/immich/templates/_microservices.tpl @@ -0,0 +1,49 @@ +{{/* Define the ml container */}} +{{- define "immich.microservices" -}} +image: {{ .Values.image.repository }}:{{ .Values.image.tag }} +imagePullPolicy: {{ .Values.image.pullPolicy }} +securityContext: + runAsUser: {{ .Values.podSecurityContext.runAsUser }} + runAsGroup: {{ .Values.podSecurityContext.runAsGroup }} + readOnlyRootFilesystem: {{ .Values.securityContext.readOnlyRootFilesystem }} + runAsNonRoot: {{ .Values.securityContext.runAsNonRoot }} +command: + - /bin/sh + - -c + - ./start-microservices.sh +volumeMounts: + - name: uploads + mountPath: {{ .Values.persistence.uploads.mountPath }} +envFrom: + - secretRef: + name: '{{ include "tc.common.names.fullname" . }}-immich-secret' + - configMapRef: + name: '{{ include "tc.common.names.fullname" . }}-common-config' + - configMapRef: + name: '{{ include "tc.common.names.fullname" . }}-server-config' +#TODO: Add probes, probably checking if process is running? +# readinessProbe: +# httpGet: +# path: / +# port: {{ .Values.service.main.ports.main.port }} +# initialDelaySeconds: {{ .Values.probes.readiness.spec.initialDelaySeconds }} +# timeoutSeconds: {{ .Values.probes.readiness.spec.timeoutSeconds }} +# periodSeconds: {{ .Values.probes.readiness.spec.periodSeconds }} +# failureThreshold: {{ .Values.probes.readiness.spec.failureThreshold }} +# livenessProbe: +# httpGet: +# path: / +# port: {{ .Values.service.main.ports.main.port }} +# initialDelaySeconds: {{ .Values.probes.liveness.spec.initialDelaySeconds }} +# timeoutSeconds: {{ .Values.probes.liveness.spec.timeoutSeconds }} +# periodSeconds: {{ .Values.probes.liveness.spec.periodSeconds }} +# failureThreshold: {{ .Values.probes.liveness.spec.failureThreshold }} +# startupProbe: +# httpGet: +# path: / +# port: {{ .Values.service.main.ports.main.port }} +# initialDelaySeconds: {{ .Values.probes.startup.spec.initialDelaySeconds }} +# timeoutSeconds: {{ .Values.probes.startup.spec.timeoutSeconds }} +# periodSeconds: {{ .Values.probes.startup.spec.periodSeconds }} +# failureThreshold: {{ .Values.probes.startup.spec.failureThreshold }} +{{- end -}} diff --git a/charts/incubator/immich/templates/_ml.tpl b/charts/incubator/immich/templates/_ml.tpl new file mode 100644 index 00000000000..7ebe7dd10f8 --- /dev/null +++ b/charts/incubator/immich/templates/_ml.tpl @@ -0,0 +1,49 @@ +{{/* Define the ml container */}} +{{- define "immich.ml" -}} +image: {{ .Values.imageML.repository }}:{{ .Values.imageML.tag }} +imagePullPolicy: {{ .Values.imageML.pullPolicy }} +securityContext: + runAsUser: {{ .Values.podSecurityContext.runAsUser }} + runAsGroup: {{ .Values.podSecurityContext.runAsGroup }} + readOnlyRootFilesystem: {{ .Values.securityContext.readOnlyRootFilesystem }} + runAsNonRoot: {{ .Values.securityContext.runAsNonRoot }} +command: + - /bin/sh + - -c + - chmod +x ./entrypoint.sh && ./entrypoint.sh +volumeMounts: + - name: uploads + mountPath: {{ .Values.persistence.uploads.mountPath }} +envFrom: + - configMapRef: + name: '{{ include "tc.common.names.fullname" . }}-common-config' + - configMapRef: + name: '{{ include "tc.common.names.fullname" . }}-server-config' + - secretRef: + name: '{{ include "tc.common.names.fullname" . }}-immich-secret' +#TODO: Add probes, probably checking if process is running? +# readinessProbe: +# httpGet: +# path: / +# port: {{ .Values.service.main.ports.main.port }} +# initialDelaySeconds: {{ .Values.probes.readiness.spec.initialDelaySeconds }} +# timeoutSeconds: {{ .Values.probes.readiness.spec.timeoutSeconds }} +# periodSeconds: {{ .Values.probes.readiness.spec.periodSeconds }} +# failureThreshold: {{ .Values.probes.readiness.spec.failureThreshold }} +# livenessProbe: +# httpGet: +# path: / +# port: {{ .Values.service.main.ports.main.port }} +# initialDelaySeconds: {{ .Values.probes.liveness.spec.initialDelaySeconds }} +# timeoutSeconds: {{ .Values.probes.liveness.spec.timeoutSeconds }} +# periodSeconds: {{ .Values.probes.liveness.spec.periodSeconds }} +# failureThreshold: {{ .Values.probes.liveness.spec.failureThreshold }} +# startupProbe: +# httpGet: +# path: / +# port: {{ .Values.service.main.ports.main.port }} +# initialDelaySeconds: {{ .Values.probes.startup.spec.initialDelaySeconds }} +# timeoutSeconds: {{ .Values.probes.startup.spec.timeoutSeconds }} +# periodSeconds: {{ .Values.probes.startup.spec.periodSeconds }} +# failureThreshold: {{ .Values.probes.startup.spec.failureThreshold }} +{{- end -}} diff --git a/charts/incubator/immich/templates/_proxy.tpl b/charts/incubator/immich/templates/_proxy.tpl new file mode 100644 index 00000000000..dcad750fda9 --- /dev/null +++ b/charts/incubator/immich/templates/_proxy.tpl @@ -0,0 +1,44 @@ +{{/* Define the proxy container */}} +{{- define "immich.proxy" -}} +image: {{ .Values.imageProxy.repository }}:{{ .Values.imageProxy.tag }} +imagePullPolicy: {{ .Values.imageProxy.pullPolicy }} +securityContext: + runAsUser: {{ .Values.podSecurityContext.runAsUser }} + runAsGroup: {{ .Values.podSecurityContext.runAsGroup }} + readOnlyRootFilesystem: {{ .Values.securityContext.readOnlyRootFilesystem }} + runAsNonRoot: {{ .Values.securityContext.runAsNonRoot }} +envFrom: + - configMapRef: + name: '{{ include "tc.common.names.fullname" . }}-common-config' +volumeMounts: + - name: proxy-conf + mountPath: /etc/nginx + readOnly: true +ports: + - containerPort: {{ .Values.service.main.ports.main.port }} + name: main +readinessProbe: + httpGet: + path: /api/server-info/ping + port: {{ .Values.service.main.ports.main.port }} + initialDelaySeconds: {{ .Values.probes.readiness.spec.initialDelaySeconds }} + timeoutSeconds: {{ .Values.probes.readiness.spec.timeoutSeconds }} + periodSeconds: {{ .Values.probes.readiness.spec.periodSeconds }} + failureThreshold: {{ .Values.probes.readiness.spec.failureThreshold }} +livenessProbe: + httpGet: + path: /api/server-info/ping + port: {{ .Values.service.main.ports.main.port }} + initialDelaySeconds: {{ .Values.probes.liveness.spec.initialDelaySeconds }} + timeoutSeconds: {{ .Values.probes.liveness.spec.timeoutSeconds }} + periodSeconds: {{ .Values.probes.liveness.spec.periodSeconds }} + failureThreshold: {{ .Values.probes.liveness.spec.failureThreshold }} +startupProbe: + httpGet: + path: /api/server-info/ping + port: {{ .Values.service.main.ports.main.port }} + initialDelaySeconds: {{ .Values.probes.startup.spec.initialDelaySeconds }} + timeoutSeconds: {{ .Values.probes.startup.spec.timeoutSeconds }} + periodSeconds: {{ .Values.probes.startup.spec.periodSeconds }} + failureThreshold: {{ .Values.probes.startup.spec.failureThreshold }} +{{- end -}} diff --git a/charts/incubator/immich/templates/_secret.tpl b/charts/incubator/immich/templates/_secret.tpl new file mode 100644 index 00000000000..0e5752d22af --- /dev/null +++ b/charts/incubator/immich/templates/_secret.tpl @@ -0,0 +1,27 @@ +{{/* Define the secret */}} +{{- define "immich.secret" -}} + +{{- $secretName := printf "%s-immich-secret" (include "tc.common.names.fullname" .) }} + +--- + +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + name: {{ $secretName }} + labels: + {{- include "tc.common.labels" . | nindent 4 }} +data: + {{/* Secret Key */}} + {{- with (lookup "v1" "Secret" .Release.Namespace $secretName) }} + JWT_SECRET: {{ index .data "JWT_SECRET" }} + {{- else }} + JWT_SECRET: {{ randAlphaNum 32 | b64enc }} + {{- end }} + DB_PASSWORD: {{ .Values.postgresql.postgresqlPassword | trimAll "\"" | b64enc }} + REDIS_PASSWORD: {{ .Values.redis.redisPassword | trimAll "\"" | b64enc }} + {{- with .Values.immich.mapbox_key }} + MAPBOX_KEY: {{ . }} + {{- end }} +{{- end }} diff --git a/charts/incubator/immich/templates/_web.tpl b/charts/incubator/immich/templates/_web.tpl new file mode 100644 index 00000000000..1d5ec7d8140 --- /dev/null +++ b/charts/incubator/immich/templates/_web.tpl @@ -0,0 +1,41 @@ +{{/* Define the web container */}} +{{- define "immich.web" -}} +image: {{ .Values.imageWeb.repository }}:{{ .Values.imageWeb.tag }} +imagePullPolicy: {{ .Values.imageWeb.pullPolicy }} +securityContext: + runAsUser: {{ .Values.podSecurityContext.runAsUser }} + runAsGroup: {{ .Values.podSecurityContext.runAsGroup }} + readOnlyRootFilesystem: {{ .Values.securityContext.readOnlyRootFilesystem }} + runAsNonRoot: {{ .Values.securityContext.runAsNonRoot }} +command: + - /bin/sh + - -c + - chmod +x ./entrypoint.sh && ./entrypoint.sh +envFrom: + - configMapRef: + name: '{{ include "tc.common.names.fullname" . }}-common-config' +readinessProbe: + httpGet: + path: / + port: 3000 + initialDelaySeconds: {{ .Values.probes.readiness.spec.initialDelaySeconds }} + timeoutSeconds: {{ .Values.probes.readiness.spec.timeoutSeconds }} + periodSeconds: {{ .Values.probes.readiness.spec.periodSeconds }} + failureThreshold: {{ .Values.probes.readiness.spec.failureThreshold }} +livenessProbe: + httpGet: + path: / + port: 3000 + initialDelaySeconds: {{ .Values.probes.liveness.spec.initialDelaySeconds }} + timeoutSeconds: {{ .Values.probes.liveness.spec.timeoutSeconds }} + periodSeconds: {{ .Values.probes.liveness.spec.periodSeconds }} + failureThreshold: {{ .Values.probes.liveness.spec.failureThreshold }} +startupProbe: + httpGet: + path: / + port: 3000 + initialDelaySeconds: {{ .Values.probes.startup.spec.initialDelaySeconds }} + timeoutSeconds: {{ .Values.probes.startup.spec.timeoutSeconds }} + periodSeconds: {{ .Values.probes.startup.spec.periodSeconds }} + failureThreshold: {{ .Values.probes.startup.spec.failureThreshold }} +{{- end -}} diff --git a/charts/incubator/immich/templates/common.yaml b/charts/incubator/immich/templates/common.yaml new file mode 100644 index 00000000000..7dbad985a3c --- /dev/null +++ b/charts/incubator/immich/templates/common.yaml @@ -0,0 +1,15 @@ +{{/* Make sure all variables are set properly */}} +{{- include "tc.common.loader.init" . }} + +{{/* Render secret */}} +{{- include "immich.secret" . }} + +{{/* Render config */}} +{{- include "immich.config" . }} + +{{- $_ := set .Values.additionalContainers "proxy" (include "immich.proxy" . | fromYaml) -}} +{{- $_ := set .Values.additionalContainers "web" (include "immich.web" . | fromYaml) -}} +{{- $_ := set .Values.additionalContainers "ml" (include "immich.ml" . | fromYaml) -}} + +{{/* Render the templates */}} +{{ include "tc.common.loader.apply" . }} diff --git a/charts/incubator/immich/values.yaml b/charts/incubator/immich/values.yaml new file mode 100644 index 00000000000..8e1d3d555f1 --- /dev/null +++ b/charts/incubator/immich/values.yaml @@ -0,0 +1,99 @@ +image: + repository: tccr.io/truecharts/immich-server + tag: 1.29.5_44@sha256:8245bc309da22c436eb29a838d2292f504d77e24f4d098d6c0e65df877180ff3 + pullPolicy: IfNotPresent + +imageML: + repository: tccr.io/truecharts/immich-ml + tag: 1.29.5_44@sha256:2df7b6368beb52ff1ffd946aaacc4df21f278b97ee3c592e2021118b3dcb5fec + pullPolicy: IfNotPresent + +imageWeb: + repository: tccr.io/truecharts/immich-web + tag: 1.29.5_44@sha256:c17ec4c2a174bac8fc2c58ebaedc7db70600fa2480695cf0920d54127c8bb32e + pullPolicy: IfNotPresent + +imageProxy: + repository: tccr.io/truecharts/immich-proxy + tag: 1.29.5_44@sha256:a4c24a70cc1e1bbbdecc3df371af08528430846709ef22ca16e2a923aa8da509 + pullPolicy: IfNotPresent + +command: + - /bin/sh + - -c + - chmod +x ./start-server.sh && ./start-server.sh + +securityContext: + readOnlyRootFilesystem: false + runAsNonRoot: false + +podSecurityContext: + runAsUser: 0 + runAsGroup: 0 + +immich: + public_login_page_message: Immich + disable_reverse_geocoding: false + reverse_geocoding_precision: 3 + # simple | verbose + log_level: simple + mapbox_enable: false + mapbox_key: "" + +envFrom: + - configMapRef: + name: '{{ include "tc.common.names.fullname" . }}-server-config' + - configMapRef: + name: '{{ include "tc.common.names.fullname" . }}-common-config' + - secretRef: + name: '{{ include "tc.common.names.fullname" . }}-immich-secret' + +probes: + liveness: + path: /server-info/ping + type: HTTP + port: 3001 + readines: + path: /server-info/ping + type: HTTP + port: 3001 + startup: + path: /server-info/ping + type: HTTP + port: 3001 + +service: + main: + ports: + main: + port: 10323 + protocol: HTTP + +persistence: + uploads: + enabled: true + mountPath: /usr/src/app/upload + proxy-conf: + enabled: true + noMount: true + type: custom + mountPath: /etc/nginx/ + volumeSpec: + configMap: + name: '{{ include "tc.common.names.fullname" . }}-proxy-config' + items: + - key: nginx.conf + path: nginx.conf + +postgresql: + enabled: true + existingSecret: dbcreds + postgresqlUsername: immich + postgresqlDatabase: immich + +redis: + enabled: true + existingSecret: rediscreds + +portal: + enabled: true diff --git a/cspell.config.yaml b/cspell.config.yaml index 04c1f83f2fc..30ad50d9ad9 100644 --- a/cspell.config.yaml +++ b/cspell.config.yaml @@ -86,6 +86,7 @@ words: - hyperthread - iban - idtool + - immich - ingressclasses - ingressroutes - ingressroutetcps @@ -127,6 +128,7 @@ words: - loolwsd - mailenabled - mailgun + - mapbox - mariadbcreds - mattwebbio - maxmind