Add Immich Stack

This commit is contained in:
Daniel Cosme
2026-04-30 18:05:24 -04:00
parent f945695b61
commit d3cea1aecd
14 changed files with 128 additions and 43 deletions
+7
View File
@@ -0,0 +1,7 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
metadata:
name: immich
namespace: immich
resources:
- namespace.yaml
+6
View File
@@ -0,0 +1,6 @@
apiVersion: v1
kind: Namespace
metadata:
name: immich
spec: {}
status: {}
+5 -5
View File
@@ -2,18 +2,18 @@ apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
labels: labels:
app: linking app: linkding
name: linking name: linkding
namespace: linkding namespace: linkding
spec: spec:
selector: selector:
matchLabels: matchLabels:
app: linking app: linkding
strategy: {} strategy: {}
template: template:
metadata: metadata:
labels: labels:
app: linking app: linkding
spec: spec:
containers: containers:
- env: - env:
@@ -46,5 +46,5 @@ spec:
volumes: volumes:
- name: data - name: data
persistentVolumeClaim: persistentVolumeClaim:
claimName: linking-pvc claimName: linkding-pvc
status: {} status: {}
+1 -1
View File
@@ -1,7 +1,7 @@
apiVersion: kustomize.config.k8s.io/v1beta1 apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization kind: Kustomization
metadata: metadata:
name: linking name: linkding
namespace: linkding namespace: linkding
resources: resources:
- namespace.yaml - namespace.yaml
+1 -1
View File
@@ -1,7 +1,7 @@
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: linking-pvc name: linkding-pvc
namespace: linkding namespace: linkding
spec: spec:
accessModes: accessModes:
+3 -3
View File
@@ -2,8 +2,8 @@ apiVersion: v1
kind: Service kind: Service
metadata: metadata:
labels: labels:
app: linking app: linkding
name: linking name: linkding
namespace: linkding namespace: linkding
spec: spec:
ports: ports:
@@ -11,7 +11,7 @@ spec:
port: 9090 port: 9090
targetPort: 0 targetPort: 0
selector: selector:
app: linking app: linkding
type: NodePort type: NodePort
status: status:
loadBalancer: {} loadBalancer: {}
+2
View File
@@ -7,6 +7,7 @@ import (
"danicos.dev/daniel/go-kube/pkg/stack" "danicos.dev/daniel/go-kube/pkg/stack"
"danicos.dev/daniel/homelab/pkg/cnpg" "danicos.dev/daniel/homelab/pkg/cnpg"
"danicos.dev/daniel/homelab/pkg/flux" "danicos.dev/daniel/homelab/pkg/flux"
"danicos.dev/daniel/homelab/pkg/immich"
"danicos.dev/daniel/homelab/pkg/linkding" "danicos.dev/daniel/homelab/pkg/linkding"
"danicos.dev/daniel/homelab/pkg/longhorn" "danicos.dev/daniel/homelab/pkg/longhorn"
"danicos.dev/daniel/homelab/pkg/monitoring" "danicos.dev/daniel/homelab/pkg/monitoring"
@@ -37,6 +38,7 @@ func main() {
hydra_apps := map[string]stack.Stack{ hydra_apps := map[string]stack.Stack{
"linkding": linkding.Stack(), "linkding": linkding.Stack(),
"immich": immich.Stack(),
} }
for name, s := range hydra_apps { for name, s := range hydra_apps {
fmt.Printf("STACK: %s\n", name) fmt.Printf("STACK: %s\n", name)
@@ -6,6 +6,7 @@ metadata:
spec: spec:
affinity: {} affinity: {}
instances: 3 instances: 3
managed: {}
postgresql: postgresql:
syncReplicaElectionConstraint: syncReplicaElectionConstraint:
enabled: false enabled: false
@@ -4,16 +4,16 @@ metadata:
name: truenas-csi name: truenas-csi
namespace: truenas-csi namespace: truenas-csi
resources: resources:
- namespace.yaml
- controller-service-account.yaml
- controller-cluster-role.yaml - controller-cluster-role.yaml
- controller-binding.yaml - controller-binding.yaml
- node-cluster-role.yaml
- CSIDriver.yaml
- nfs-storage-class.yaml
- node-service-account.yaml - node-service-account.yaml
- node-binding.yaml
- node-deamonset.yaml - node-deamonset.yaml
- CSIDriver.yaml
- config.yaml - config.yaml
- iscsi-storage-class.yaml
- namespace.yaml
- controller-deployment.yaml - controller-deployment.yaml
- controller-service-account.yaml - node-cluster-role.yaml
- node-binding.yaml
- nfs-storage-class.yaml
- iscsi-storage-class.yaml
+35
View File
@@ -0,0 +1,35 @@
package cnpg
import (
"danicos.dev/daniel/go-kube/pkg/kube"
"danicos.dev/daniel/homelab/pkg/root"
kube_cnpg "danicos.dev/daniel/go-kube/pkg/cnpg"
pg "github.com/cloudnative-pg/api/pkg/api/v1"
core "k8s.io/api/core/v1"
)
func Cluster() pg.Cluster {
meta := kube.NewMetadata(root.CloudNativePG+"-cluster", PGClusterNamespace)
spec := pg.ClusterSpec{
Instances: 3,
StorageConfiguration: pg.StorageConfiguration{
StorageClass: new(root.KUBE_LOCAL_STORAGE_CLASS),
Size: "10Gi",
ResizeInUseVolumes: new(true),
PersistentVolumeClaimTemplate: &core.PersistentVolumeClaimSpec{
StorageClassName: new(root.KUBE_LOCAL_STORAGE_CLASS),
},
},
Managed: &pg.ManagedConfiguration{
Roles: []pg.RoleConfiguration{},
},
}
return kube_cnpg.NewCluster(meta, spec)
}
/*
Need a role and secret
- Username
- Password
*/
-20
View File
@@ -4,10 +4,6 @@ import (
"danicos.dev/daniel/go-kube/pkg/kube" "danicos.dev/daniel/go-kube/pkg/kube"
"danicos.dev/daniel/go-kube/pkg/stack" "danicos.dev/daniel/go-kube/pkg/stack"
"danicos.dev/daniel/homelab/pkg/root" "danicos.dev/daniel/homelab/pkg/root"
v1 "k8s.io/api/core/v1"
kube_cnpg "danicos.dev/daniel/go-kube/pkg/cnpg"
pg "github.com/cloudnative-pg/api/pkg/api/v1"
) )
var meta kube.Metadata var meta kube.Metadata
@@ -28,19 +24,3 @@ func Stack() stack.Stack {
}) })
return s return s
} }
func Cluster() pg.Cluster {
meta := kube.NewMetadata(root.CloudNativePG+"-cluster", PGClusterNamespace)
spec := pg.ClusterSpec{
Instances: 3,
StorageConfiguration: pg.StorageConfiguration{
StorageClass: new(root.KUBE_LOCAL_STORAGE_CLASS),
Size: "10Gi",
ResizeInUseVolumes: new(true),
PersistentVolumeClaimTemplate: &v1.PersistentVolumeClaimSpec{
StorageClassName: new(root.KUBE_LOCAL_STORAGE_CLASS),
},
},
}
return kube_cnpg.NewCluster(meta, spec)
}
+37
View File
@@ -0,0 +1,37 @@
package immich
import (
"danicos.dev/daniel/go-kube/pkg/kube"
"danicos.dev/daniel/go-kube/pkg/stack"
"danicos.dev/daniel/homelab/pkg/root"
core "k8s.io/api/core/v1"
)
var Secret = struct {
Name string
DB_UserKey string
DB_PasswordKey string
}{
Name: root.Immich.Name,
DB_UserKey: "db_username",
DB_PasswordKey: "db_password",
}
var meta kube.Metadata
var Namespace = kube.Namespace(root.Immich.Name)
var srv core.Service
var pvc core.PersistentVolumeClaim
func init() {
meta = kube.NewMetadata(root.Immich.Name, Namespace)
}
func Stack() stack.Stack {
kz := kube.NewKuztomizedStack(
meta,
map[string]any{
"namespace": Namespace,
},
)
return kz.Stack("immich")
}
+4 -4
View File
@@ -19,15 +19,15 @@ var Secret = struct {
} }
var meta kube.Metadata var meta kube.Metadata
var Namespace = kube.Namespace("linkding") var Namespace = kube.Namespace(root.Linkding.Name)
var srv core.Service var srv core.Service
var pvc core.PersistentVolumeClaim var pvc core.PersistentVolumeClaim
func init() { func init() {
meta = kube.NewMetadata("linking", Namespace) meta = kube.NewMetadata(root.Linkding.Name, Namespace)
srv = meta.Service(root.Linkding.Port) srv = meta.Service(root.Linkding.Port)
srv.Spec.Type = core.ServiceTypeNodePort srv.Spec.Type = core.ServiceTypeNodePort
srv.Spec.Ports[0].NodePort = 30010 srv.Spec.Ports[0].NodePort = int32(root.Linkding.Public.NodePort)
pvc = meta.PVC() pvc = meta.PVC()
} }
@@ -47,7 +47,7 @@ func Stack() stack.Stack {
func deployment() apps.Deployment { func deployment() apps.Deployment {
storage := kube.NewVolumeFrom(kube.VolumeSourcePVC, "data", pvc.Name) storage := kube.NewVolumeFrom(kube.VolumeSourcePVC, "data", pvc.Name)
envMapping := map[string]string{ envMapping := map[string]string{
"LD_CSRF_TRUSTED_ORIGINS": root.Linkding.PublicURL, "LD_CSRF_TRUSTED_ORIGINS": root.Linkding.Public.URL,
} }
secretMapping := map[string]string{ secretMapping := map[string]string{
"LD_SUPERUSER_NAME": Secret.SuperUserKey, "LD_SUPERUSER_NAME": Secret.SuperUserKey,
+19 -2
View File
@@ -3,17 +3,34 @@ package root
type Service struct { type Service struct {
Name string Name string
Image string Image string
PublicURL string
Port int32 Port int32
SecurityContextID int64 SecurityContextID int64
Public *Public
Postgres *Postgres
} }
type Public struct {
URL string
NodePort int32
}
type Postgres struct{}
var Linkding = Service{ var Linkding = Service{
Name: "linkding", Name: "linkding",
Image: "sissbruecker/linkding:1.45.0", Image: "sissbruecker/linkding:1.45.0",
PublicURL: "https://link.danicos.me",
Port: 9090, Port: 9090,
SecurityContextID: 33, // www-data user, group and FS ID SecurityContextID: 33, // www-data user, group and FS ID
Public: &Public{
URL: "https://link.danicos.me",
NodePort: 30010,
},
}
var Immich = Service{
Name: "immich",
Image: "",
// PublicURL: "https://photos.danicos.me",
} }
var ( var (