Ich habe eine Synology DS220+, welche mit "Synology Photos" an sich schon eine Möglichkeit bietet, seine eigenen Fotos zu verwalten.
Allerdings verwende ich "Synology Photos" nicht, da es (aktuell) keine Möglichkeit bietet, meine bereits auf dem NAS in einem freigegebenen Ordner vorhandene Foto-Sammlung zu übernehmen.
Ich müsste alle Bilder in ein persönliches Verzeichnis schieben, auf welches dann nachher nur noch ich Zugriff habe oder neu importieren...das halte ich für etwas umständlich. Eine Möglichkeit zu sagen "auf diesem Pfad liegen meine Bilder" hatte ich nicht gefunden.

Letztens bin ich über Photoprism gestolpert, was sich als Docker-Container auf der Synology betreiben lässt und genau den Funktionsumfang bietet, den ich mir erwünscht hatte: Ein bereits vorhandenes Verzeichnis voller Fotos in der Config angeben und...schwupps...sind alle Bilder in der Fotoverwaltung.

Außerdem bietet Photoprism eine Gesichtserkennung, dass man seine Fotosammlung auch nach Personen durchsuchen kann, eine Maps-Ansicht, wo die Fotos nach Ort der Aufnahme geordnet sind, zeigt die Ordner an, in denen ich die Fotos bisher im Filesystem sortiert hatte und vieles mehr.

Wer mal reinschauen möchte, kann sich hier ein Live-Demo von Photoprism anschauen.

Installation

Auf der DS220+ hatte ich zu Testzwecken schonmal über das Synology Softwarecenter die Docker-Umgebung installiert.

Mit folgender Konfiguration würde Photoprism unter der Adresse http://192.168.178.20:8001 mit Benutzername apfelz und myUserPassword erreichbar sein.
Außerdem wird in der Konfiguration davon ausgegangen, dass mein bereits vorhandenes Fotoarchiv unter /volume1/Fotoalbum/ liegt.

docker-compose.yaml
services:
  photoprism:
    image: photoprism/photoprism:latest
    container_name: photoprism
    stop_grace_period: 10s
    depends_on:
      - photoprism-mariadb
    security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
    ports:
      - "8001:2342"
    environment:
      PHOTOPRISM_ADMIN_USER: "apfelz"
      PHOTOPRISM_ADMIN_PASSWORD: "myUserPassword"
      PHOTOPRISM_AUTH_MODE: "password"               # authentication mode (public, password)
      PHOTOPRISM_SITE_URL: "http://192.168.178.20:8001/"
      PHOTOPRISM_DISABLE_TLS: "false"                # disables HTTPS/TLS even if the site URL starts with https:// and a certificate is available
      PHOTOPRISM_DEFAULT_TLS: "true"                 # defaults to a self-signed HTTPS/TLS certificate if no other certificate is available
      PHOTOPRISM_ORIGINALS_LIMIT: 5000               # file size limit for originals in MB (increase for high-res video)
      PHOTOPRISM_HTTP_COMPRESSION: "gzip"            # improves transfer speed and bandwidth utilization (none or gzip)
      PHOTOPRISM_LOG_LEVEL: "info"                   # log level: trace, debug, info, warning, or error
      PHOTOPRISM_READONLY: "true"                    # do not modify originals directory (reduced functionality)
      PHOTOPRISM_EXPERIMENTAL: "false"               # enables experimental features
      PHOTOPRISM_DISABLE_CHOWN: "false"              # disables updating storage permissions via chmod and chown on startup
      PHOTOPRISM_DISABLE_WEBDAV: "false"             # disables built-in WebDAV server
      PHOTOPRISM_DISABLE_SETTINGS: "false"           # disables settings UI and API
      PHOTOPRISM_DISABLE_TENSORFLOW: "false"         # disables all features depending on TensorFlow
      PHOTOPRISM_DISABLE_FACES: "false"              # disables face detection and recognition (requires TensorFlow)
      PHOTOPRISM_DISABLE_CLASSIFICATION: "false"     # disables image classification (requires TensorFlow)
      PHOTOPRISM_DISABLE_VECTORS: "false"            # disables vector graphics support
      PHOTOPRISM_DISABLE_RAW: "false"                # disables indexing and conversion of RAW images
      PHOTOPRISM_RAW_PRESETS: "false"                # enables applying user presets when converting RAW images (reduces performance)
      PHOTOPRISM_SIDECAR_YAML: "true"                # creates YAML sidecar files to back up picture metadata
      PHOTOPRISM_BACKUP_ALBUMS: "true"               # creates YAML files to back up album metadata
      PHOTOPRISM_BACKUP_DATABASE: "true"             # creates regular backups based on the configured schedule
      PHOTOPRISM_BACKUP_SCHEDULE: "daily"            # backup SCHEDULE in cron format (e.g. "0 12 * * *" for daily at noon) or at a random time (daily, weekly)
      PHOTOPRISM_INDEX_SCHEDULE: ""                  # indexing SCHEDULE in cron format (e.g. "@every 3h" for every 3 hours; "" to disable)
      PHOTOPRISM_AUTO_INDEX: 300                     # delay before automatically indexing files in SECONDS when uploading via WebDAV (-1 to disable)
      PHOTOPRISM_AUTO_IMPORT: -1                     # delay before automatically importing files in SECONDS when uploading via WebDAV (-1 to disable)
      PHOTOPRISM_DETECT_NSFW: "false"                # automatically flags photos as private that MAY be offensive (requires TensorFlow)
      PHOTOPRISM_UPLOAD_NSFW: "true"                 # allows uploads that MAY be offensive (no effect without TensorFlow)
      PHOTOPRISM_UPLOAD_ALLOW: ""                    # restricts uploads to these file types (comma-separated list of EXTENSIONS; leave blank to allow all)
      PHOTOPRISM_UPLOAD_ARCHIVES: "true"             # allows upload of zip archives (will be extracted before import)
      PHOTOPRISM_DATABASE_DRIVER: "mysql"            # MariaDB 10.5.12+ (MySQL successor) offers significantly better performance compared to SQLite
      PHOTOPRISM_DATABASE_SERVER: "photoprism-mariadb:3306"     # MariaDB database server (hostname:port)
      PHOTOPRISM_DATABASE_NAME: "photoprism"         # MariaDB database, see MARIADB_DATABASE in the mariadb service
      PHOTOPRISM_DATABASE_USER: "photoprism"         # MariaDB database username, must be the same as MARIADB_USER
      PHOTOPRISM_DATABASE_PASSWORD: "myDBpassword"   # MariaDB database password, must be the same as MARIADB_PASSWORD
      PHOTOPRISM_SITE_CAPTION: "Photoprism"
      PHOTOPRISM_SITE_DESCRIPTION: ""                # meta site description
      PHOTOPRISM_SITE_AUTHOR: ""                     # meta site author
      PHOTOPRISM_INIT: "https tensorflow"            # common options: update tensorflow https intel gpu davfs
    working_dir: "/photoprism"                       # do not change or remove
    volumes:
      - "/volume1/Fotoalbum/:/photoprism/originals"  # Original media files (DO NOT REMOVE)
      - "./storage:/photoprism/storage"              # *Writable* storage folder for cache, database, and sidecar files (DO NOT REMOVE)
  photoprism-mariadb:
    image: mariadb:10.6.8
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    container_name: photoprism-mariadb
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: myDBpassword
      MYSQL_USER: photoprism
      MYSQL_PASSWORD: myDBpassword
      MYSQL_DATABASE: photoprism
    volumes:
      - ./db:/var/lib/mysql
    restart: unless-stopped

Da es für mich nicht so ganz offensichtlich war, wie ich diese Konfiguration über Synologys Web-UI starten kann, habe ich mich per ssh mit der DS220+ verbunden und den Container von dort gestartet.

Ich habe eine Freigabe "docker" auf der NAS, in welchem ich die ganzen Konfigurations- und Daten-Ordner der verschiedenen Docker-Container liegen habe. Für Photoprism habe ich einen Ordner "photoPrism" angelegt, in welchem die oben gelistete docker-compose.yaml befindet.
Außerdem muss ein Ordner für die Datenbank und photoprisms Cache-Dateien angelegt werden (in der docker-compose.yaml unter volumes: mit ./storage und ./db definiert).

cd /volume1/docker/photoPrism/
mkdir storage
mkdir db
sudo docker-compose up      # Zu testzwecken. Auf der Kommandozeile wird das Log ausgegeben
#sudo docker-compose up -d  # Produktiv - läuft im Deamon-Modus

Mit cd /volume1/docker/photoPrism/; sudo docker-compose down lässt sich PhotoPrism wieder herunterfahren...oder über das Docker-Programm in der Synology Web-UI.

Einrichtung

Nach einer kleinen Wartezeit sollte alles funktionieren (mal das Log im Auge behalten, wenn man PhotoPrism das erste Mal ohne die -d-Option startet) und sich das Webinterface in diesem Beispiel unter http://192.168.178.20:8001 aufrufen lassen.
Benutzername und Passwort hat man in der docker-compose.yaml definiert und können hier nun in die Login-Maske eingegeben werden.

Zunächst sieht alles recht leer aus.
In der Navigation unter Dateien > Originale findet man alle Bilder in der bereits vorhandenen Ordnerstruktur.

Um den Funktionsumfang von PhotoPrism komplett nutzen zu können, kann man nun an dieser Stelle die Indizierung aller Ordner starten.

Bei mir hat das mit 60'000 Bild-Dateien etwa eine Woche (!) gedauert. Das Indizieren eines einzigen Bildes hat etwa 11-12 Sekunden in Anspruch genommen.
In der Woche, in der die Indizierung lief, haben die Festplatten der Synology gerödelt wie ab und das NAS war nicht gerade sehr responsiv, wenn es darum ging, einen Ordner auf einer Freigabe zu öffnen, geschweige denn einen Film abzuspielen, der auf der NAS liegt.

Da die Synology neben meinem Schlafzimmer steht, habe ich den Docker Container in der einen oder anderen Nacht mal pausiert:

sudo docker pause photoprism
sudo docker unpause photoprism # <-- fortsetzen

Aber das war ja nur eine einmalige Geschichte und ich hatte es nicht eilig.