From cd806b76782b50776a6df8fbb2734889c66a5a9c Mon Sep 17 00:00:00 2001 From: Daniel Cosme Date: Fri, 1 May 2026 14:11:41 -0400 Subject: [PATCH] Add Immich deployment --- apps/hydra/immich/deployment.yaml | 54 +++++++++++++++++++ apps/hydra/immich/kuztomization.yaml | 3 +- apps/hydra/linkding/kuztomization.yaml | 2 +- .../hydra/truenas-csi/kuztomization.yaml | 10 ++-- pkg/immich/immich.go | 37 +++++++++++++ pkg/root/services.go | 3 +- 6 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 apps/hydra/immich/deployment.yaml diff --git a/apps/hydra/immich/deployment.yaml b/apps/hydra/immich/deployment.yaml new file mode 100644 index 0000000..d82c59f --- /dev/null +++ b/apps/hydra/immich/deployment.yaml @@ -0,0 +1,54 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: immich + name: immich + namespace: immich +spec: + selector: + matchLabels: + app: immich + strategy: {} + template: + metadata: + labels: + app: immich + spec: + containers: + - env: + - name: DB_DATABASE_NAME + valueFrom: + secretKeyRef: + key: db_username + name: immich-secret + - name: DB_HOSTNAME + valueFrom: + secretKeyRef: + key: db_host + name: immich-secret + - name: DB_PASSWORD + valueFrom: + secretKeyRef: + key: db_password + name: immich-secret + - name: DB_PORT + valueFrom: + secretKeyRef: + key: db_port + name: immich-secret + - name: DB_USERNAME + valueFrom: + secretKeyRef: + key: db_username + name: immich-secret + image: ghcr.io/immich-app/immich-server:v2.6.0:-release} + name: immich-server + ports: + - containerPort: 2283 + resources: {} + volumes: + - name: upload + persistentVolumeClaim: + claimName: immich-pvc +status: {} diff --git a/apps/hydra/immich/kuztomization.yaml b/apps/hydra/immich/kuztomization.yaml index db9459f..e34cda2 100644 --- a/apps/hydra/immich/kuztomization.yaml +++ b/apps/hydra/immich/kuztomization.yaml @@ -4,5 +4,6 @@ metadata: name: immich namespace: immich resources: -- uploads-pvc.yaml - namespace.yaml +- uploads-pvc.yaml +- deployment.yaml diff --git a/apps/hydra/linkding/kuztomization.yaml b/apps/hydra/linkding/kuztomization.yaml index c922b44..96e2f9e 100644 --- a/apps/hydra/linkding/kuztomization.yaml +++ b/apps/hydra/linkding/kuztomization.yaml @@ -4,7 +4,7 @@ metadata: name: linking namespace: linkding resources: -- namespace.yaml - srv.yaml - pvc.yaml - deployment.yaml +- namespace.yaml diff --git a/infrastructure/hydra/truenas-csi/kuztomization.yaml b/infrastructure/hydra/truenas-csi/kuztomization.yaml index 46286d3..be16b06 100644 --- a/infrastructure/hydra/truenas-csi/kuztomization.yaml +++ b/infrastructure/hydra/truenas-csi/kuztomization.yaml @@ -4,16 +4,16 @@ metadata: name: truenas-csi namespace: truenas-csi resources: -- config.yaml +- CSIDriver.yaml - nfs-storage-class.yaml - controller-deployment.yaml - controller-binding.yaml -- node-cluster-role.yaml -- node-deamonset.yaml -- CSIDriver.yaml +- node-binding.yaml +- config.yaml - iscsi-storage-class.yaml - namespace.yaml - controller-service-account.yaml - controller-cluster-role.yaml - node-service-account.yaml -- node-binding.yaml +- node-cluster-role.yaml +- node-deamonset.yaml diff --git a/pkg/immich/immich.go b/pkg/immich/immich.go index f04baaa..4602767 100644 --- a/pkg/immich/immich.go +++ b/pkg/immich/immich.go @@ -4,6 +4,7 @@ import ( "danicos.dev/daniel/go-kube/pkg/kube" "danicos.dev/daniel/go-kube/pkg/stack" "danicos.dev/daniel/homelab/pkg/root" + apps "k8s.io/api/apps/v1" core "k8s.io/api/core/v1" ) @@ -30,6 +31,7 @@ var uploads_pvc core.PersistentVolumeClaim func init() { meta = kube.NewMetadata(root.Immich.Name, Namespace) + srv = meta.Service(root.Immich.Port) uploads_pvc = meta.PVC() uploads_pvc.Spec.StorageClassName = new(root.TrueNASSTorageClassNFS) uploads_pvc.Spec.AccessModes = []core.PersistentVolumeAccessMode{core.ReadWriteMany} @@ -41,7 +43,42 @@ func Stack() stack.Stack { map[string]any{ "namespace": Namespace, "uploads-pvc": uploads_pvc, + // "redis": Redis(), + "deployment": Deployment(), }, ) return kz.Stack("immich") } + +func Deployment() apps.Deployment { + uploadVol := kube.NewVolumeFrom(kube.VolumeSourcePVC, "upload", uploads_pvc.Name) + envMapping := map[string]string{} + secretMapping := map[string]string{ + "DB_HOSTNAME": Secret.DBHostKey, + "DB_PORT": Secret.DBPortKey, + "DB_USERNAME": Secret.DBUsernameKey, + "DB_PASSWORD": Secret.DBPasswordKey, + "DB_DATABASE_NAME": Secret.DBUsernameKey, + } + podSpec := core.PodSpec{ + Containers: []core.Container{ + { + Name: root.Immich.Name + "-server", + Image: root.Immich.Image, + Env: kube.NewEnvVarWithSecret(envMapping, secretMapping, Secret.Name), + Ports: []core.ContainerPort{{ContainerPort: root.Immich.Port}}, + }, + }, + Volumes: []core.Volume{ + // /etc/localtime + uploadVol, + }, + } + return kube.NewDeployment(meta, podSpec) +} + +func Redis() apps.Deployment { + meta := kube.NewMetadata(root.Immich.Name+"-redis", Namespace) + podSpec := core.PodSpec{} + return kube.NewDeployment(meta, podSpec) +} diff --git a/pkg/root/services.go b/pkg/root/services.go index 23cea7c..d0cd042 100644 --- a/pkg/root/services.go +++ b/pkg/root/services.go @@ -35,7 +35,8 @@ var Linkding = Service{ var Immich = Service{ Name: "immich", - Image: "", + Image: "ghcr.io/immich-app/immich-server:v2.6.0:-release}", + Port: 2283, // PublicURL: "https://photos.danicos.me", }