Helm chart to install PhotoPrism.
PhotoPrism is a server-based application for browsing, organizing, and sharing your personal photo collection.
helm repo add p80n https://p80n.github.io/photoprism-helm/
helm install photoprism p80n/photoprism --set persistence.enabled=false
This chart deploys PhotoPrism to your Kubernetes cluster. It's mostly based off the docker-compose file available at PhotoPrism's GitHub repository.
Kubernetes is great for running PhotoPrism since there are a lot of k8s tools available to enhance the experience:
- Cert Manager makes it easy to put PhotoPrism behind SSL
- Ingress makes it easy to expose PhotoPrism with actual URLs
- Running a database as a separate service helps with performance and maintenance.
To install the chart with the release name my-release
:
helm install photoprism p80n/photoprism --create-namespace --namespace photoprism -f values.yaml
The following table lists common configurable parameters of the Photoprism chart and their default values. See values.yaml for a more complete listing.
Parameter | Description | Default |
---|---|---|
adminPassword | Password for admin account | photoprism |
existingSecret | Use existing secret for admin account (key PHOTOPRISM_ADMIN_PASSWORD) | |
image.repository | Image repository | photoprism/photoprism |
image.tag | Image tag | 20210222 |
image.pullPolicy | Image pull policy | IfNotPresent |
config | Map of environment variables to configure PhotoPrism's runtime behavior | |
config.PHOTOPRISM_DEBUG | Enable verbose logging | |
config.PHOTOPRISM_PUBLIC | Allow passwordless access | |
sidecarContainers | List of container images to run as sidecars | |
persistence.enabled | Enable persistent storage | true |
persistence.importPath | Path to imported images | /assets/photos/import |
persistence.originalsPath | Path to pre-existing photos | /assets/photos/originals |
persistence.storagePath | Location for PhotoPrism to store generated content (e.g., thumbnails) | /assets/photos/originals |
persistence.volumeMounts | VolumeMounts for Photoprism | See values.yaml |
persistence.volumes | Volumes for Photoprism | nil |
persistence.volumeClaimTemplates | VolumeClaimTemplate for Photoprism | See values.yaml |
service.type | Photoprism service type | ClusterIP |
service.port | HTTP to expose service | 80 |
ingress.enabled | Enable ingress rules | false |
ingress.annotations | Annotations for ingress | {} |
ingress.hosts | Hosts and paths to respond | See values.yaml |
ingress.tls | Ingress TLS configuration | [] |
resources.requests.memory | Indexing photos requires a bit of memory | 2Gi |
database.driver | mysql or internal are supported | internal |
database.name | Remote database name | nil |
database.user | Remote database user | nil |
database.password | Remote database password | nil |
database.host | Remote database host | nil |
database.port | Remote database port | nil |
database.existingSecret | Use existing secret for database DSN (key PHOTOPRISM_DATABASE_DSN) |
For setting nested values, it's generally easiest to just specify a YAML file that with the correct values:
$ helm install photoprism p80n/photoprism-helm -f values.yaml
You can specify each parameter using the --set key=value[,key=value]
argument to helm install
, but for nested values, it's complicated. For example:
$ helm install photoprism p80n/photoprism-helm \
--set=image.tag=latest \
--set=volumes[0].name=originals --set=volumes[0].nfs.server=my.nfs.server --set=volumes[0].nfs.path=/path
PhotoPrism's configuration can be passed in through environment variables.
To see what is available, you can consult
https://github.com/photoprism/photoprism/blob/develop/docker-compose.yml
or run docker run photoprism/photoprism photoprism config
to see all possible values.
Note: storage and database configuration, as well as the admin password, should be set in their appropriate configuration sections. They should not be set here.
It's important to configure persistent storage (e.g., NFS) for any sort of real-world usage.
I've been running PhotoPrism using two NFS shares: one for PhotoPrism's storage cache, and one pointing to where I store my original images in Lightroom (read-only).
This has been working well for me; keeping PhotoPrism assets separate keeps my Lightroom workspace uncluttered less cluttered ;)
If you don't enable persistence, you can still take PhotoPrism for a spin; you'll just have to start from scratch if the pod dies and gets scheduled on a different node.
Note: You can utilize the subPath option of a volueMount
to only expose a portion of your photo collection. I personally do this, in conjuction with
custom ingress hosts and PHOTOPRISM_PUBLIC=true
, to share specific galleries with friends with a simple URL (e.g., my-wedding.mydomain.com)
PhotoPrism can be run without any external dependencies. If no remote database is provided, PhotoPrism will
run SQLite internally. If you enabled persitent storage and specify a value for persistence.storagePath
, this chart
will automatically configure the SQLite database file to be written to the persistent storage path.
Alternately, if you prefer to run the database separately, you can point PhotoPrism at a MySQL-compatible database instance (e.g., MySQL, MariaDB, Percona)
The default values will only expose PhotoPrism inside your cluster on port 80. Some options for accessing PhotoPrism from outside your cluster:
- Configure ingress rules for use with a reverse proxy
- Change the service type to
NodePort
and pick a free port to expose - Access it from your client with kubectl port-forward
If you have questions about this Helm chart, or have trouble getting it deployed to your cluster, feel free to open an issue.
If you have issues with PhotoPrism itself, you may want to head over to their issues page.