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:
BIND_ADDRESS=127.0.0.1
PORT=2342
TZ=Etc/UTC
# Replace this example value before deployment; never use it in production.
ADMIN_PASSWORD=change-me-use-a-long-random-secret-admin_password
SITE_URL=http://localhost:2342/
ORIGINALS_PATH=/srv/photos
# Replace this example value before deployment; never use it in production.
DB_PASSWORD=change-me-use-a-long-random-secret-db_password
# Replace this example value before deployment; never use it in production.
DB_ROOT_PASSWORD=change-me-use-a-long-random-secret-db_root_password
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.