blumeops/argocd/manifests/immich
Erich Blume 5f9bc20345 Fix mirror org refs in ArgoCD apps and widen credential template (#266)
## Summary

- Widen `repo-creds-forge` URL prefix from `/eblume/` to host-wide `/` so it matches repos in all forge orgs (fixes `mirrors/` repos not getting SSH credentials)
- Update 8 ArgoCD app definitions from `eblume/<mirror>` → `mirrors/<mirror>` (immich-charts, cloudnative-pg-charts, external-secrets, connect-helm-charts)
- Fix stale alloy clone comment in Ansible defaults
- Bump immich v2.5.2 → v2.5.6 (bug-fix patches only)
- Update ArgoCD README bootstrap command and credential docs

## Context

Mirrors were migrated from `forge.ops.eblu.me/eblume/` to `forge.ops.eblu.me/mirrors/` in commit `cd57814`. Container Dockerfiles and image tags were updated, but ArgoCD app definitions and the repo credential template were missed, causing `ComparisonError` on apps that source Helm charts from mirrored repos.

## Deployment

1. Sync the ArgoCD `argocd` app first (picks up the widened credential template)
2. Sync the `apps` app (picks up new repo URLs for all 8 apps)
3. Verify immich resolves its ComparisonError: `argocd app get immich`
4. Sync immich to deploy v2.5.6: `argocd app sync immich`
5. Spot-check: `argocd app get external-secrets`, `argocd app get cloudnative-pg`, `argocd app get 1password-connect`

Reviewed-on: https://forge.ops.eblu.me/eblume/blumeops/pulls/266
2026-02-25 06:55:53 -08:00
..
ingress-tailscale.yaml Recategorize homepage into Content and Misc groups (#179) 2026-02-13 09:09:22 -08:00
kustomization.yaml Add Immich photo management + migrate forge URLs (#62) 2026-01-26 11:20:11 -08:00
pv-nfs.yaml Add Immich photo management + migrate forge URLs (#62) 2026-01-26 11:20:11 -08:00
pvc.yaml Add Immich photo management + migrate forge URLs (#62) 2026-01-26 11:20:11 -08:00
README.md Remove obsolete secret templates 2026-01-28 20:26:37 -08:00
values.yaml Fix mirror org refs in ArgoCD apps and widen credential template (#266) 2026-02-25 06:55:53 -08:00

Immich

Self-hosted photo and video management solution with AI-powered search and face recognition.

Prerequisites

  1. NFS Share: Create /volume1/photos on sifaka with NFS permissions for indri
  2. PostgreSQL: The immich-pg cluster (with pgvecto.rs) must be healthy
  3. Secrets: Create the database password secret

Deployment Order

  1. Sync blumeops-pg (to get CloudNativePG operator if not already running)
  2. Sync immich-storage (creates PV, PVC, and Tailscale Ingress)
  3. Wait for immich-pg cluster to be healthy
  4. Create secrets (see below)
  5. Sync immich (deploys the Helm chart)
  6. Run mise run provision-indri -- --tags caddy to update Caddy config

Secret Setup

The immich-db secret contains the database password, which is auto-generated by CloudNativePG in the immich-pg-app secret. To create or regenerate the secret:

# Create namespace if needed
kubectl --context=minikube-indri create namespace immich

# Copy password from CNPG secret to immich namespace
kubectl --context=minikube-indri create secret generic immich-db -n immich \
  --from-literal=password="$(kubectl --context=minikube-indri -n databases get secret immich-pg-app -o jsonpath='{.data.password}' | base64 -d)"

Note: This secret is not managed by ExternalSecrets since the source of truth is the CNPG-generated secret.

Access

First-Time Setup

  1. Navigate to https://photos.ops.eblu.me
  2. Create an admin account
  3. Configure external library (optional - for importing existing photos)

External Library (iCloud Photos)

To import existing photos from iCloud sync on indri:

  1. In Immich Admin > External Libraries, create a new library
  2. Set the import path to the location where iCloud photos sync
  3. Configure scan schedule or trigger manual scan

Architecture

┌─────────────────┐     ┌─────────────────┐
│  immich-server  │────▶│  immich-pg      │
│  (web/api)      │     │  (PostgreSQL    │
└────────┬────────┘     │   + pgvecto.rs) │
         │              └─────────────────┘
         │
┌────────▼────────┐     ┌─────────────────┐
│  immich-ml      │     │  valkey         │
│  (ML inference) │     │  (Redis cache)  │
└─────────────────┘     └─────────────────┘
         │
┌────────▼────────┐
│  sifaka NFS     │
│  /volume1/photos│
└─────────────────┘

Helm Values

The Helm chart is configured via values.yaml. Key settings:

  • image.tag: Immich version (update manually)
  • immich.persistence.library.existingClaim: Points to immich-library PVC
  • machine-learning.enabled: AI features for face/object recognition
  • valkey.enabled: Redis cache included in chart

Troubleshooting

# Check pods
kubectl -n immich get pods

# Check immich-pg cluster
kubectl -n databases get cluster immich-pg

# View server logs
kubectl -n immich logs -l app.kubernetes.io/name=immich-server

# View ML logs
kubectl -n immich logs -l app.kubernetes.io/name=immich-machine-learning

# Check PVC binding
kubectl -n immich get pvc