photoprism image gallery στο raspberry


  • To
    photoprism είναι μια selfhosted photo managment εφαρμογή.

  • Είναι docker ready με πολύ πλούσιο config

  • Raspberry pi ready

  • προσφέρει πλήθος κατηγοριοποιήσεων πχ infinite timeline αλά google photos , original folder structure , year-month-date , map , αλλά και tensorflow object categorisation

  • Progressive web app δομή

  • Comunity android app που λύνει κάποια caching & reloading θέματα του web app καθώς προσφέρει και πειραματικό auto upload

  • Είναι webdav ready και μπορείς τόσο να προσαρτήσεις την συλλογή σου σε οποιοδήποτε file manager το υποστηρίζει αλλά και στο nextcloud αλλα το πιο σημαντικό όμως είναι ότι με αυτό μπορείς να ανεβάσεις αυτόματα τις φωτογραφίες σου με χρήση κάποιου webdav client απο το τηλέφωνο σου και να συγχρονιστούν επίσης αυτόματα στην library σου

  • Επιλογές indexing τόσο manual με εντολή και από το web ui αλλά και με χρήση import folder


main site

demo site



Ακολουθούμε τις οδηγίες εγκατάστασης για rpi απο εδω

Δημιουργούμε ένα φάκελο εργασίας

mkdir photoprism

και μπαίνουμε στο φάκελο

cd photoprism

κατεβάζουμε το αρχείο doker-compose.yml με βάση το οποίο θα δημιουργήσουμε το docker container


και το ανοίγουμε για επεξεργασία

nano docker-compose.yml

  • αντιγράφω εδώ το περιεχόμενο του
version: '3.5'

# Example Docker Compose config file for PhotoPrism (Raspberry Pi / ARM64)
# Documentation :
# Docker Hub URL:
# Please run behind a reverse proxy like Caddy, Traefik or Nginx if you need HTTPS / SSL support
# e.g. when running PhotoPrism on a public server outside your home network.
# -------------------------------------------------------------------
# -------------------------------------------------------------------
# Start    | docker-compose up -d
# Stop     | docker-compose stop
# Update   | docker-compose pull
# Logs     | docker-compose logs --tail=25 -f
# Terminal | docker-compose exec photoprism bash
# Help     | docker-compose exec photoprism photoprism help
# Config   | docker-compose exec photoprism photoprism config
# Reset    | docker-compose exec photoprism photoprism reset
# Backup   | docker-compose exec photoprism photoprism backup -a -i
# Restore  | docker-compose exec photoprism photoprism restore -a -i
# Index    | docker-compose exec photoprism photoprism index
# Reindex  | docker-compose exec photoprism photoprism index -a
# Import   | docker-compose exec photoprism photoprism import
# -------------------------------------------------------------------
# Note: All commands may have to be prefixed with "sudo" when not running as root.
#       This will change the home directory "~" to "/root" in your configuration.

    # Use photoprism/photoprism-arm64:preview instead for testing preview builds:
    image: photoprism/photoprism-arm64:latest
    container_name: photoprism
    # Only enable automatic restarts once your installation is properly
    # configured as it otherwise may get stuck in a restart loop:
    # restart: unless-stopped
      - seccomp:unconfined
      - apparmor:unconfined
      - 2342:2342 # [local port]:[container port]
      PHOTOPRISM_ADMIN_PASSWORD: "insecure"          # PLEASE CHANGE: Your initial admin password (min 4 characters)
      PHOTOPRISM_ORIGINALS_LIMIT: 1000               # File size limit for originals in MB (increase for high-res video)
      PHOTOPRISM_HTTP_COMPRESSION: "none"            # Improves transfer speed and bandwidth utilization (none or gzip)
      PHOTOPRISM_WORKERS: 2                          # Limits the number of indexing workers to reduce system load
      PHOTOPRISM_DEBUG: "false"                      # Run in debug mode (shows additional log messages)
      PHOTOPRISM_PUBLIC: "false"                     # No authentication required (disables password protection)
      PHOTOPRISM_READONLY: "false"                   # Don't modify originals directory (reduced functionality)
      PHOTOPRISM_EXPERIMENTAL: "false"               # Enables experimental features
      PHOTOPRISM_DISABLE_WEBDAV: "false"             # Disables built-in WebDAV server
      PHOTOPRISM_DISABLE_SETTINGS: "false"           # Disables Settings in Web UI
      PHOTOPRISM_DISABLE_TENSORFLOW: "false"         # Disables using TensorFlow for image classification
      PHOTOPRISM_DARKTABLE_PRESETS: "true"           # Enables Darktable presets and disables concurrent RAW conversion
      # PHOTOPRISM_FFMPEG_ENCODER: "h264_v4l2m2m"    # FFmpeg AVC encoder for video transcoding (default: libx264)
      # PHOTOPRISM_FFMPEG_BUFFERS: "64"              # FFmpeg capture buffers (default: 32)
      PHOTOPRISM_DETECT_NSFW: "false"                # Flag photos as private that MAY be offensive
      PHOTOPRISM_UPLOAD_NSFW: "true"                 # Allow uploads that MAY be offensive
      # PHOTOPRISM_DATABASE_DRIVER: "sqlite"         # SQLite is an embedded database that doesn't require a server
      PHOTOPRISM_DATABASE_DRIVER: "mysql"            # Use MariaDB (or MySQL) instead of SQLite for improved performance
      PHOTOPRISM_DATABASE_SERVER: "mariadb:3306"     # MariaDB database server (hostname:port)
      PHOTOPRISM_DATABASE_NAME: "photoprism"         # MariaDB database schema name
      PHOTOPRISM_DATABASE_USER: "photoprism"         # MariaDB database user name
      PHOTOPRISM_DATABASE_PASSWORD: "insecure"       # MariaDB database user password
      PHOTOPRISM_SITE_URL: "http://localhost:2342/"  # Public PhotoPrism URL
      PHOTOPRISM_SITE_CAPTION: "Browse Your Life"
      # You may optionally set a user / group id using environment variables if your Docker version or NAS does not
      # support this natively (see next example):
      # UID: 1000
      # GID: 1000
      # UMASK: 0000
    # Uncomment and edit the following line to set a specific user / group id (native):
    # user: "1000:1000"
    # For hardware AVC transcoding using the h264_v4l2m2m encoder:
    # devices:
    #  - "/dev/video11:/dev/video11"
      # Your photo and video files ([local path]:[container path]):
      - "~/Pictures:/photoprism/originals"
      # Multiple folders can be indexed by mounting them as sub-folders of /photoprism/originals:
      # - "/mnt/Family:/photoprism/originals/Family"    # [folder_1]:/photoprism/originals/[folder_1]
      # - "/mnt/Friends:/photoprism/originals/Friends"  # [folder_2]:/photoprism/originals/[folder_2]
      # Mounting an import folder is optional (see docs):
      # - "~/Import:/photoprism/import"
      # Permanent storage for settings, index & sidecar files (DON'T REMOVE):
      - "./storage:/photoprism/storage"

    image: arm64v8/mariadb:10.5
    container_name: mariadb
    restart: unless-stopped
      - seccomp:unconfined
      - apparmor:unconfined
    command: mysqld --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=50
    volumes: # Don't remove permanent storage for index database files!
      - "./database:/var/lib/mysql"
      MYSQL_ROOT_PASSWORD: please_change
      MYSQL_DATABASE: photoprism
      MYSQL_USER: photoprism
      MYSQL_PASSWORD: insecure

# Uncomment the following lines to upgrade automatically, whenever there is a new Docker image available:
#  watchtower:
#    image: containrrr/watchtower
#    container_name: watchtower
#    restart: unless-stopped
#    environment:
#      WATCHTOWER_POLL_INTERVAL: 7200 # Checks for updates every two hours
#    volumes:
#      - "/var/run/docker.sock:/var/run/docker.sock"
#      - "~/.docker/config.json:/config.json" # Optional, for authentication if you have a Docker Hub account

Βεβαιώνουμε ότι

  • το image είναι το photoprism-arm64:latest

  • ότι το restart είναι unless-stoped (μπορούμε να το γυρίσουμε σε always αφού βεβαιωθούμε ότι το config μας δουλεύει)

  • η στο port η default port που κάνει expose είναι η 2342 μπορούμε να την αλλάξουμε φροντίζουμε όμως να αλλάξουμε και το PHOTOPRISM_HTTP_PORT στο enviromet

  • επίσης στο enviroment από το πλήθος των config που περιέχει , αλλάζουμε τουλάχιστον τα:



  • οι workers όχι πάνω από 2

  • Πέραν των όσων περιέχει το .yml προσωπικά έχω προσθέσει to
    PHOTOPRISM_AUTO_INDEX στα 60 sec που είναι ο χρόνος μετά τον οποίο ξεκινάει ο αυτόματος συγχρονισμός των originals (της βιβλιοθήκης μας) μετά το ανέβασμα από webdav

  • πλήρης λιστα με τα διαθέσιμα enviromental variables και το τι κανει το κάθε ένα εδω

  • στο volumes κανουμε map το filepath του φακελου που περιεχει τις φωτογραφιες μας


  • μπορουμε να προσθεσουμε πολους φακελους ως υποφακελους των originals


  • και να κανουμε map εναν import folder


  • αλλα και τον storage folder με τα index & sidecar files αρχεια


  • το τελευταίο θα γίνει αρκετά μεγάλο σε μέγεθος και καλό είναι το επιλέξουμε έναν εξωτερικό σκληρό . Προσωπικά έχω όλα τα filepath σε εξωτερικό σκληρό

  • στο mariadb enviroment αλλάζουμε το MYSQL_ROOT_PASSWORD:


Στο officilal documenttation υπάρχουν παραδείγματα με όλους τους δημοφιλείς reverse proxies ώστε να προστατέψεις την θύρα που κάνει expose το photoprism σου πίσω του καθώς και να προσθέσεις ενα ssl certificate και να κάνεις την σύνδεσή κρυπτογραφημένη

Προσωπικά χρησιμοποιώ caddy μιάς και ειναι πολύ απλο προσθέτωντας στο /etc/caddy/Caddyfile το {

reverse_proxy localhost:2342


οπου το ddns domain μου και μια port forworded πορτα στο ρουτερ αφιερομενη στο photoprism πχ 8888

To caddy προσθέτει αυτόματα ssl cert δε χρρειαζετε να παρεις μονος σου απο certbot ουττε να κανεις αυτοματες ενημερωσεις τα ανααμβανει ολα αυτο

Το συγκεκριμένο config domain:port ισως μοιάζει περίεργο μιας και το πιο λογικο θα ηταν ενα ddns domain αφιερομενο στο photoprism και γενικα ενα domain name ανα υπηρεσια που τρεχεει στον server (raspberry) πχ στην 443 και το caddy να ανακατευθηνει στην localhost
ο λογος ειναι οτι τοσο το ρουτερ του οτε οσο και της wind ειναι κλειδωμενα και μπορεις να χρησιμοποιησεις μονο ενα ddns adrress
το αναφερω γιατι μαλλον ενδιαφερει

To photoprism εχει το lerning curve του μεχρι να εξοικειωθεις με τις επιλογες του
το official documentation ειναι κατατοπιστηκο εδω)
τα βασικα σημεια που θελω να σταθω
(διαφορές import και originals εδω)
Στο originals εσωτερικα στο container εχουν γινει maped ολοι οι φακελοι με τις φωτογραφιες σου
Το import (optional) είναι ένας φάκελος που πάνε τα uploads και το webdav sync αν το επιλέξεις . Είναι ένας προσωρινός φάκελος από τον οποίο αντιγράφονται οι φωτογραφίες στο φάκελο του originals αφού γίνουν (αυτόματα) index . Επίσης, αντιγράφονται και στον φάκελό φωτογραφιών στο file system

partner apps

Καλοφτιαγμένη δωρεάν εφαρμογη που εμφανίζει της φωτογραφίες μας στο χάρτη Το photoprism υπαρχει στις διαθέσιμες πυγές Το επιλεγουμε απο το πανω αριστερο μενου , στις υηρεσιες (conect to photoprism) και ειναι της μορφης https:ddns.domain:port , username , password

απο το πάνω δεξια μενου


configure targets


add new


port: port



δεν βαζω ssl αφου αναλαμβανει το caddy

  • εναλακτο δωρεαν το foldersync περιεχει διαφημήσεις(πολλές) δεν εχω βρει καποιο foss app με webdav sync

Από την καρτέλα λογαριασμοί επιλέγουμε webdav

Στο πως θα συγχρονίζονται επιλέγω αποστολή

Βάζουμε το username και password μας

Διεύθυνση το ddns domain μας

Port η public port

Στη διαδρομή έχω βάλει import/ καθώς χρησιμοποιώ τον import φάκελο για αυτόματο indexing

Και ενεργοποίηω το toggle για τον αυτόματο συγχρονισμό

Καλό είναι να εξαιρεσουμε την εφαρμογή από την βελτιστοποίηση μπαταρίας από τις ρυθμίσεις του τηλεφώνου

barebones app

μονο το timeline δουλευει και ο αυτοματο upload το οποιο δε ξερω ποσο αξιοπιστο ειναι

τουλαχιστον ομως δεν χρηαζετε να φορτώνουν καθε φορα οι φωτογραφιες απο την αρχή

Το παρών είναι αναδημοσιεύση του blog post μου από εδω

4 «Μου αρέσει»