Self-hosted photo backup (Google Photos replacement) - raw manifests, no Helm chart, self-contained under k8s/apps/immich including its own CNPG Postgres. Media PVC shares the cp-3 HDD 2TB/2TB with paperless-media. Postgres is pg18, not this repo's usual 16.2: CNPG's official pgvector extension image (ghcr.io/cloudnative-pg/pgvector) is only published for pg18, loaded via CNPG's ImageVolume extension mechanism (operator 1.30.0 / k8s 1.36.1 both support it). Immich auto-manages CREATE EXTENSION itself at startup. OIDC via a new "immich_role" Authentik scope mapping (homelab-admins/ immich-admins -> "admin" claim, else "user"), consumed by Immich's OAuth roleClaim setting which re-syncs isAdmin on every login - more reliable than Immich's racy first-user-is-admin fallback. Config composed into an immich-oidc Secret and mounted as IMMICH_CONFIG_FILE, matching the paperless-oidc pattern. k8s RBAC (immich-operator Role + oidc:immich-admins binding) mirrors paperless/rbac.yaml. immich namespace pre-created in k8s/infra/databases/namespaces.yaml (not just immich's own CreateNamespace=true) since the iam PostSync job's RoleBinding needs it to exist before wave 8.
263 lines
7.4 KiB
YAML
263 lines
7.4 KiB
YAML
# Wave 8 — end-user workloads: Temporal, Portainer, and the cloudflared tunnel.
|
|
# Experimental dirs (llm, forge, dev-tools, shadowsocks) are intentionally
|
|
# NOT included yet — add them here once they're production-ready.
|
|
# temporal using unified CNPG pattern (app user, temporal-db-app secret)
|
|
# Secret copied by bootstrap.sh (like cicd/iam namespaces)
|
|
apiVersion: argoproj.io/v1alpha1
|
|
kind: Application
|
|
metadata:
|
|
name: temporal
|
|
namespace: argocd
|
|
annotations:
|
|
argocd.argoproj.io/sync-wave: "8"
|
|
spec:
|
|
project: homelab
|
|
sources:
|
|
- repoURL: https://go.temporal.io/helm-charts
|
|
chart: temporal
|
|
targetRevision: "0.74.0"
|
|
helm:
|
|
valueFiles:
|
|
- $values/k8s/apps/temporal/temporal-values.yaml
|
|
- repoURL: https://forgejo.riotpiao.com/rock/homelab.git
|
|
targetRevision: main
|
|
ref: values
|
|
- repoURL: https://forgejo.riotpiao.com/rock/homelab.git
|
|
targetRevision: main
|
|
path: k8s/apps/temporal
|
|
destination:
|
|
server: https://kubernetes.default.svc
|
|
namespace: temporal
|
|
syncPolicy:
|
|
automated:
|
|
prune: true
|
|
selfHeal: true
|
|
syncOptions:
|
|
- CreateNamespace=true
|
|
---
|
|
apiVersion: argoproj.io/v1alpha1
|
|
kind: Application
|
|
metadata:
|
|
name: portainer
|
|
namespace: argocd
|
|
annotations:
|
|
argocd.argoproj.io/sync-wave: "8"
|
|
spec:
|
|
project: homelab
|
|
sources:
|
|
- repoURL: https://portainer.github.io/k8s/
|
|
chart: portainer
|
|
targetRevision: "*"
|
|
helm:
|
|
valueFiles:
|
|
- $values/k8s/apps/portainer/portainer-values.yaml
|
|
- repoURL: https://forgejo.riotpiao.com/rock/homelab.git
|
|
targetRevision: main
|
|
ref: values
|
|
destination:
|
|
server: https://kubernetes.default.svc
|
|
namespace: dashboard
|
|
syncPolicy:
|
|
automated:
|
|
prune: true
|
|
selfHeal: true
|
|
syncOptions:
|
|
- CreateNamespace=true
|
|
---
|
|
apiVersion: argoproj.io/v1alpha1
|
|
kind: Application
|
|
metadata:
|
|
name: cloudflared
|
|
namespace: argocd
|
|
annotations:
|
|
argocd.argoproj.io/sync-wave: "8"
|
|
spec:
|
|
project: homelab
|
|
source:
|
|
repoURL: https://forgejo.riotpiao.com/rock/homelab.git
|
|
targetRevision: main
|
|
path: k8s/apps/cloudflared
|
|
destination:
|
|
server: https://kubernetes.default.svc
|
|
namespace: cloudflared
|
|
syncPolicy:
|
|
automated:
|
|
prune: true
|
|
selfHeal: true
|
|
syncOptions:
|
|
- CreateNamespace=true
|
|
---
|
|
apiVersion: argoproj.io/v1alpha1
|
|
kind: Application
|
|
metadata:
|
|
name: agent-pod
|
|
namespace: argocd
|
|
annotations:
|
|
argocd.argoproj.io/sync-wave: "8"
|
|
spec:
|
|
project: homelab
|
|
source:
|
|
repoURL: https://forgejo.riotpiao.com/rock/homelab.git
|
|
targetRevision: main
|
|
path: k8s/apps/agent-pod
|
|
destination:
|
|
server: https://kubernetes.default.svc
|
|
namespace: agent-pod
|
|
syncPolicy:
|
|
automated:
|
|
prune: true
|
|
selfHeal: true
|
|
syncOptions:
|
|
- CreateNamespace=true
|
|
---
|
|
# iMessage/SMS delivery. Raw manifests: a privileged macOS VM (Docker-OSX)
|
|
# running the BlueBubbles server, plus its dedicated local StorageClass.
|
|
#
|
|
# Pinned to worker-2 via nodeSelector `workload: imessage` + a matching
|
|
# toleration for that node's taint. Until worker-2 is provisioned this app
|
|
# syncs everything except the pod, which stays Pending — that is expected.
|
|
#
|
|
# No CreateNamespace: namespace.yaml carries `pod-security: privileged`, which
|
|
# the VM needs (/dev/kvm, privileged), and an ArgoCD-created namespace would
|
|
# not have those labels.
|
|
apiVersion: argoproj.io/v1alpha1
|
|
kind: Application
|
|
metadata:
|
|
name: sms
|
|
namespace: argocd
|
|
annotations:
|
|
argocd.argoproj.io/sync-wave: "8"
|
|
spec:
|
|
project: homelab
|
|
source:
|
|
repoURL: https://forgejo.riotpiao.com/rock/homelab.git
|
|
targetRevision: main
|
|
path: k8s/apps/sms
|
|
destination:
|
|
server: https://kubernetes.default.svc
|
|
namespace: sms
|
|
syncPolicy:
|
|
automated:
|
|
prune: true
|
|
selfHeal: true
|
|
---
|
|
# Document management. Raw manifests (no Helm): postgres is the dedicated
|
|
# paperless-db CNPG cluster in k8s/infra/databases (wave 2), redis is
|
|
# in-cluster only (no PVC), media lives on the cp-3 USB HDD (see
|
|
# k8s/infra/longhorn/longhorn-paperless-storageclass.yaml). OIDC via
|
|
# Authentik provisioned by k8s/infra/iam's PostSync job; MinIO backup bucket
|
|
# creds provisioned by k8s/infra/minio's PostSync job.
|
|
apiVersion: argoproj.io/v1alpha1
|
|
kind: Application
|
|
metadata:
|
|
name: paperless
|
|
namespace: argocd
|
|
annotations:
|
|
argocd.argoproj.io/sync-wave: "8"
|
|
spec:
|
|
project: homelab
|
|
source:
|
|
repoURL: https://forgejo.riotpiao.com/rock/homelab.git
|
|
targetRevision: main
|
|
path: k8s/apps/paperless
|
|
destination:
|
|
server: https://kubernetes.default.svc
|
|
namespace: paperless
|
|
syncPolicy:
|
|
automated:
|
|
prune: true
|
|
selfHeal: true
|
|
syncOptions:
|
|
- CreateNamespace=true
|
|
---
|
|
# Photo/video backup. Self-contained (unlike paperless, its CNPG Postgres
|
|
# lives here too, not in k8s/infra/databases) - CreateNamespace=true creates
|
|
# the namespace before any manifest in this Application applies, including
|
|
# the Cluster CR, so no separate wave-2 pre-creation step is needed. Postgres
|
|
# is pg18 (not this repo's usual 16.2) because CNPG's official pgvector
|
|
# extension image only publishes pg18 builds - see k8s/apps/immich/db.yaml.
|
|
# media PVC shares the cp-3 HDD 2TB/2TB with paperless-media. OIDC via
|
|
# Authentik provisioned by k8s/infra/iam's PostSync job (immich entry in
|
|
# SERVICES + immich_role scope mapping for admin-via-claim).
|
|
apiVersion: argoproj.io/v1alpha1
|
|
kind: Application
|
|
metadata:
|
|
name: immich
|
|
namespace: argocd
|
|
annotations:
|
|
argocd.argoproj.io/sync-wave: "8"
|
|
spec:
|
|
project: homelab
|
|
source:
|
|
repoURL: https://forgejo.riotpiao.com/rock/homelab.git
|
|
targetRevision: main
|
|
path: k8s/apps/immich
|
|
destination:
|
|
server: https://kubernetes.default.svc
|
|
namespace: immich
|
|
syncPolicy:
|
|
automated:
|
|
prune: true
|
|
selfHeal: true
|
|
syncOptions:
|
|
- CreateNamespace=true
|
|
---
|
|
# Consolidated: homarr + homarr-patches → homarr
|
|
# Helm chart + values + PostSync hook patch (fix-probes-job.yaml)
|
|
apiVersion: argoproj.io/v1alpha1
|
|
kind: Application
|
|
metadata:
|
|
name: homarr
|
|
namespace: argocd
|
|
annotations:
|
|
argocd.argoproj.io/sync-wave: "8"
|
|
spec:
|
|
project: homelab
|
|
sources:
|
|
- repoURL: https://homarr-labs.github.io/charts
|
|
chart: homarr
|
|
targetRevision: "*"
|
|
helm:
|
|
valueFiles:
|
|
- $values/k8s/apps/homarr/homarr-values.yaml
|
|
- repoURL: https://forgejo.riotpiao.com/rock/homelab.git
|
|
targetRevision: main
|
|
ref: values
|
|
- repoURL: https://forgejo.riotpiao.com/rock/homelab.git
|
|
targetRevision: main
|
|
path: k8s/apps/homarr # PostSync hook: fix-probes-job.yaml
|
|
destination:
|
|
server: https://kubernetes.default.svc
|
|
namespace: dashboard
|
|
syncPolicy:
|
|
automated:
|
|
prune: true
|
|
selfHeal: true
|
|
syncOptions:
|
|
- CreateNamespace=true
|
|
---
|
|
# Wave 9 - per-service scoped RBAC (Role/RoleBinding), deliberately last so
|
|
# every target namespace above already exists. Inert until kube-apiserver
|
|
# gets --oidc-groups-claim=groups wired up (separate, not-yet-applied
|
|
# terraform/talosctl change) - these grant nothing until then.
|
|
apiVersion: argoproj.io/v1alpha1
|
|
kind: Application
|
|
metadata:
|
|
name: rbac
|
|
namespace: argocd
|
|
annotations:
|
|
argocd.argoproj.io/sync-wave: "9"
|
|
spec:
|
|
project: homelab
|
|
source:
|
|
repoURL: https://forgejo.riotpiao.com/rock/homelab.git
|
|
targetRevision: main
|
|
path: k8s/infra/rbac
|
|
destination:
|
|
server: https://kubernetes.default.svc
|
|
namespace: default
|
|
syncPolicy:
|
|
automated:
|
|
prune: true
|
|
selfHeal: true
|