All templates

PhotoPrism

v1.0.0

Private photo management with automatic indexing and search.

photosmedia by getarcaneapp
x-arcane:
  icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/photoprism.svg
  urls:
    - https://docs.photoprism.app/getting-started/docker-compose/

services:
  photoprism:
    image: photoprism/photoprism:latest
    restart: unless-stopped
    ports:
      - "${BIND_ADDRESS:-127.0.0.1}:${PORT:-2342}:2342"
    labels:
      com.getarcaneapp.arcane.icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/photoprism.svg
    environment:
      TZ: ${TZ:-Etc/UTC}
      PHOTOPRISM_ADMIN_PASSWORD: ${ADMIN_PASSWORD:?Set a strong PhotoPrism administrator password}
      PHOTOPRISM_SITE_URL: ${SITE_URL:-http://localhost:2342/}
      PHOTOPRISM_AUTH_MODE: password
      PHOTOPRISM_READONLY: "true"
      PHOTOPRISM_DATABASE_DRIVER: mysql
      PHOTOPRISM_DATABASE_SERVER: database:3306
      PHOTOPRISM_DATABASE_NAME: photoprism
      PHOTOPRISM_DATABASE_USER: photoprism
      PHOTOPRISM_DATABASE_PASSWORD: ${DB_PASSWORD:?Set a database password}
    depends_on:
      database:
        condition: service_healthy
    volumes:
      - storage:/photoprism/storage
      - ${ORIGINALS_PATH:-/srv/photos}:/photoprism/originals:ro
  database:
    image: mariadb:11
    restart: unless-stopped
    environment:
      MARIADB_DATABASE: photoprism
      MARIADB_USER: photoprism
      MARIADB_PASSWORD: ${DB_PASSWORD:?Set a database password}
      MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:?Set a database root password}
    healthcheck:
      test: [CMD, healthcheck.sh, --connect, --innodb_initialized]
      interval: 10s
      timeout: 5s
      retries: 10
    volumes:
      - database:/var/lib/mysql
    labels:
      com.getarcaneapp.arcane.icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/mariadb.svg

volumes:
  storage:
  database:

README

Private photo management with automatic indexing and search.

Copy .env.example to .env, replace every example secret with a unique generated value, adjust the settings, then deploy with docker compose up -d or import this template in Arcane. Open http://localhost:2342 on the Docker host. Ports bind to localhost by default; set BIND_ADDRESS to a trusted interface for LAN access, or use a reverse proxy with HTTPS.

Set all three passwords, SITE_URL, and ORIGINALS_PATH. Login as admin. Originals are mounted read-only; this template supports indexing existing photos rather than uploads. Internal storage and MariaDB data use named volumes. Password changes after first boot must be made through PhotoPrism/database administration.

Named volumes retain internal application state across container upgrades. Keep a backup before updating images; docker compose down -v deletes named volume data.

Upstream: installation and configuration.