Immich is a self-hosted photo and video backup solution. This setup supports reusable template-based deployments for multiple instances.
Required variables#
INSTANCE_NAME: Unique identifier for this instanceNAMESPACE: Kubernetes namespaceDOMAIN_NAME: Domain name for ingressNFS_SERVER_IP: IP address of the NFS serverNFS_BASE_PATH: Base path on NFS serverDB_NAME: PostgreSQL database name (typicallyimmich)DB_PASSWORD: PostgreSQL database passwordJWT_SECRET: JWT secret for authentication
Deploying a new instance#
Create required NFS directories under
${NFS_BASE_PATH}:library/ml-cache/photos/redis/
postgres/is not required when PostgreSQL uses local-path storage.Create instance configuration directory:
mkdir -p immich/instances/<instance-name>- Create
immich/instances/<instance-name>/instance.env:
INSTANCE_NAME=<instance-name>
NAMESPACE=immich-<instance-name>
DOMAIN_NAME=<your-domain>
NFS_SERVER_IP=<nfs-server-ip>
NFS_BASE_PATH=/volume2/immich/<nfs-path>
DB_NAME=immich
DB_PASSWORD=
JWT_SECRET=- Deploy:
cd immich
./deploy-instance.sh <instance-name>The deployment script validates variables, generates manifests, creates namespace and secrets, applies PVCs, deploys PostgreSQL, and deploys Immich via Helm.
Upgrading#
cd immich
./deploy-instance.sh <instance-name>Removal#
- Uninstall Helm release:
helm -n <namespace> uninstall <instance-name>- Remove PVCs:
kubectl -n <namespace> delete pvc --all- Optionally delete namespace:
kubectl delete namespace <namespace>Cloudflare Tunnel for Immich#
Setup#
- Create a Cloudflare tunnel in Zero Trust.
- Configure a public hostname:
- Subdomain:
immich - Domain: your domain
- Type:
HTTP - URL:
immich-server.immich.svc.cluster.local:2283
- Subdomain:
- Deploy tunnel in Kubernetes:
kubectl apply -f cloudflare/namespace.yaml
cp cloudflare/secret.yaml.template cloudflare/secret.yaml
kubectl apply -f cloudflare/secret.yaml
kubectl apply -f cloudflare/deployment.yaml- Verify:
kubectl -n cloudflare-tunnel get pods
kubectl -n cloudflare-tunnel logs -f deployment/cloudflared- Test DNS and endpoint:
dig immich.yourdomain.com
nslookup immich.yourdomain.com