Nomploy Nomad Packs

← All packs

photoprism v0.1.0

Apps

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.

nomad-pack run photoprism --registry nomploy
1 task http 2342 2 volumes image photoprism/photoprism:latest
Variables 12
values.hcl

Save as values.hcl, edit, then run:

nomad-pack run photoprism -f values.hcl --registry nomploy
# 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
  }
NameTypeDefaultDescription
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.
Readme

photoprism

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.

Deploy

nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run photoprism --registry=nomploy

Configure

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.