PhotoPrism — a privacy-first, AI-powered photo app for browsing, organizing, and sharing your photo and video library, with automatic tagging and face recognition running fully on your own hardware. Deployed as a single host-networked Nomad service using SQLite, with storage and originals volumes.
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "photoprism"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The PhotoPrism container image. Pin a tag in production.
image = "photoprism/photoprism:latest"
# Host port for the PhotoPrism web UI.
port = 2342
# Initial admin username (PHOTOPRISM_ADMIN_USER).
admin_user = "admin"
# Initial admin password (PHOTOPRISM_ADMIN_PASSWORD, min 8 chars). CHANGE THIS.
admin_password = "changeme-please"
# Public site URL (PHOTOPRISM_SITE_URL). Empty = derive from the request.
site_url = ""
# Named volume for the SQLite database, config, cache, and thumbnails (/photoprism/storage). Critical — back it up.
storage_volume = "photoprism_storage"
# Named volume for your original photos and videos (/photoprism/originals).
originals_volume = "photoprism_originals"
# Placement constraints. Pin to the node holding the volumes. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# The task resources. Indexing/face recognition is memory-hungry; 4GB+ recommended.
resources = {
cpu = 2000
memory = 3072
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "photoprism" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "photoprism/photoprism:latest" | The PhotoPrism container image. Pin a tag in production. |
| port | number | 2342 | Host port for the PhotoPrism web UI. |
| admin_user | string | "admin" | Initial admin username (PHOTOPRISM_ADMIN_USER). |
| admin_password set me | string | "changeme-please" | Initial admin password (PHOTOPRISM_ADMIN_PASSWORD, min 8 chars). CHANGE THIS. |
| site_url | string | "" | Public site URL (PHOTOPRISM_SITE_URL). Empty = derive from the request. |
| storage_volume | string | "photoprism_storage" | Named volume for the SQLite database, config, cache, and thumbnails (/photoprism/storage). Critical — back it up. |
| originals_volume | string | "photoprism_originals" | Named volume for your original photos and videos (/photoprism/originals). |
| constraints | list | [] | Placement constraints. Pin to the node holding the volumes. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
| resources | object | {
cpu = 2000
memory = 3072
} | The task resources. Indexing/face recognition is memory-hungry; 4GB+ recommended. |
No variables match.
PhotoPrism — a privacy-first, AI-powered app for browsing, organizing, and sharing your photos and videos, with automatic tagging and face recognition that runs entirely on your own hardware.
Single host-networked Nomad service using SQLite (no separate database to run). Runs as root so the fresh volumes are writable.
nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run photoprism --registry=nomploy
| Variable | Default | Description |
|---|---|---|
port |
2342 |
Web UI port (PHOTOPRISM_HTTP_PORT). |
admin_user |
admin |
Initial admin username. |
admin_password |
changeme-please |
Initial admin password (min 8 chars). Change it. |
site_url |
"" |
Public URL (PHOTOPRISM_SITE_URL); empty = derive from request. |
storage_volume |
photoprism_storage |
/photoprism/storage — SQLite DB, cache, thumbnails. |
originals_volume |
photoprism_originals |
/photoprism/originals — your photos/videos. |
image |
photoprism/photoprism:latest |
Container image. Pin a tag in production. |
resources |
{ cpu = 2000, memory = 3072 } |
Task resources; 4GB+ RAM recommended. |
Add photos to the originals volume, then Library → Index to import them. SQLite is fine for
personal libraries; use MariaDB for very large ones. Pin the job to the node holding the volumes
with constraints.