This is a fork from the official immich-charts repo. The aim is to provide a better developer experience, more granular releases (including all immich versions), and a more comprehensive chart (including database, e.g.)
It was created based on the discussions in the following issue: immich-app/immich-charts#68 (comment)
THIS IS A WIP.
Do not use this in production. It's a true zero-ver, which means every other release might include breaking changes.
Feel free to play around with it. Please try and test it. Breaking changes will be marked in release notes, so please keep an eye out for them when updating version.
Installs Immich, a self-hosted photo and video backup solution, on Kubernetes.
This chart leverages the bjw-s common-library to make configuration as easy as possible while providing enterprise-grade flexibility.
helm install immich oci://ghcr.io/maybeanerd/immich-charts/immich \
--namespace immich --create-namespace \
-f your-values.yamlImportant: Do not copy the full values.yaml from this repository. Only set the values you want to override.
When upgrading between versions, please review the Upgrade Guide for breaking changes and migration instructions.
Before deploying Immich, you must configure:
Database Password - Set a secure password when using bundled PostgreSQL:
immich.database.password- Direct password value- Or use
immich.database.password.valueFrom.secretKeyReffor existing secrets
Note: If your cluster doesn't have a default StorageClass, you'll also need to set storage classes for all persistent volumes (see "Storage Configuration" below).
Common customizations based on your deployment needs:
- Storage Configuration:
- Storage Classes - Override default StorageClass if needed (
persistence.*.storageClass,postgresql.primary.persistence.storageClass) - Storage Sizes - Adjust volume sizes based on your needs (
persistence.*.size)
- Storage Classes - Override default StorageClass if needed (
- Database Storage Type - Optimize for SSD storage (
immich.database.storageType: ssd) - Ingress - Optionally enable ingress for web access (
ingress.server.enabled: true). Disabled by default - access via port-forward or LoadBalancer service
- Machine Learning - Disable to save resources (
immich.machineLearning.enabled: false) - Resource Limits - Set CPU/memory for workloads (
controllers.*.resources)
- External Database - Use managed PostgreSQL (
postgresql.enabled: false, configureimmich.database.*) - External Redis - Use managed Redis (
redis.enabled: false, configureimmich.redis.*)
- Application Configuration - Manage Immich settings via config file (
immich.configuration) - Monitoring - Enable Prometheus metrics (
immich.monitoring.enabled) - GPU Acceleration - Add GPU resources for ML (
controllers.machine-learning.resources.limits)
We provide tested examples for common deployment scenarios:
- minimal.yaml - Basic setup with bundled PostgreSQL and Redis (best for getting started)
- minimal-external.yaml - Minimal deployment using external services (PostgreSQL, Redis) with ML disabled
- full-features.yaml - Advanced configuration showcasing most optional features (SSD optimization, custom config, secrets, ingress, pod affinity, resource limits)
Deploy an example:
helm install immich oci://ghcr.io/maybeanerd/immich-charts/immich \
--namespace immich --create-namespace \
-f https://raw.githubusercontent.com/maybeanerd/immich-charts/main/charts/immich/examples/minimal.yamlControls how Immich application settings are managed:
{}(empty object, recommended) - Enables config file with Immich defaults. Best for GitOps/declarative deployments.null- No config file. All settings managed via Immich web GUI and stored in database.- Custom values - Provide specific settings that override Immich defaults. See custom-config.yaml.
For available settings, see the Immich configuration documentation.
Set to ssd or hdd to optimize PostgreSQL for your storage:
immich:
database:
storageType: ssd # or 'hdd' (default)This automatically configures PostgreSQL environment variables for optimal performance. See ssd-optimized.yaml for a complete example.
To use external/managed services instead of bundled ones:
- Disable the bundled service:
postgresql.enabled: falseand/orredis.enabled: false - Configure connection details under
immich.database.*orimmich.redis.*
See external-services.yaml for a complete example.
This chart is built on the bjw-s common library, which provides extensive Kubernetes configuration options:
- Pod annotations and labels
- Node affinity and tolerations
- Security contexts
- Init containers
- Sidecars
- And much more
For advanced configuration patterns, refer to the common library documentation.
The chart deploys two main controllers:
- server - Main Immich API and web interface
- machine-learning - ML service for face detection, object recognition, etc. (automatically disabled when
immich.machineLearning.enabled: false)
Configuration uses semantic objects (immich.database, immich.redis, etc.) that are automatically transformed into appropriate environment variables for all components.
After installation, access Immich using one of these methods:
Port Forward (for testing):
kubectl port-forward -n immich svc/immich-server 2283:2283
# Access at http://localhost:2283LoadBalancer Service (for production without ingress):
service:
server:
type: LoadBalancerIngress (for production with domain):
ingress:
server:
enabled: true
hosts:
- host: immich.yourdomain.com
paths:
- path: /View installed releases:
helm ls --namespace immichUninstall the chart:
helm delete --namespace immich immichThis removes all Kubernetes resources associated with the release. Persistent volumes may need to be manually deleted depending on your storage class retention policy.