Selfhost PhotoPrism

Scene

  • Better to manage a large number of pictures with photoprism
  • Demo => demo.photoprism

Solution

  • If host on windows must install docker at frist. 👉 Docker Desktop

    Host with local disk

  1. Make the docker-compose.yml and Modify configuration.

    • where I sign “(^.^)”,it mean should be change.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      version: '3.5'

      # Example Docker Compose config file for PhotoPrism (Linux / AMD64)
      #
      # Documentation : https://docs.photoprism.org/getting-started/docker-compose/
      # Docker Hub URL: https://hub.docker.com/r/photoprism/photoprism/
      #
      # 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.
      #
      # ------------------------------------------------------------------
      # DOCKER COMPOSE COMMAND REFERENCE
      # ------------------------------------------------------------------
      # 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 -f
      # Import | docker-compose exec photoprism photoprism import
      #
      # To search originals for faces without a complete rescan:
      # docker-compose exec photoprism photoprism faces index
      # -------------------------------------------------------------------
      # 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.

      services:
      photoprism:
      restart: always
      # Use photoprism/photoprism:preview instead for testing preview builds:
      image: photoprism/photoprism:latest
      depends_on:
      - mariadb
      # Only enable automatic restarts once your installation is properly
      # configured as it otherwise may get stuck in a restart loop:
      # https://docs.photoprism.org/getting-started/faq/#why-is-photoprism-getting-stuck-in-a-restart-loop
      # restart: unless-stopped
      security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
      # Run as a specific, non-root user (see https://docs.docker.com/engine/reference/run/#user):
      # user: "1000:1000"
      ports:
      - "2342:2342" # [server]:[container]
      environment:
      PHOTOPRISM_ADMIN_PASSWORD: "(^.^)" # PLEASE CHANGE: Your initial admin password (min 4 characters)
      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_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_CHOWN: "false" # Disables storage permission updates on startup
      PHOTOPRISM_DISABLE_WEBDAV: "false" # Disables built-in WebDAV server
      PHOTOPRISM_DISABLE_SETTINGS: "false" # Disables Settings in Web UI
      PHOTOPRISM_DISABLE_TENSORFLOW: "false" # Disables all features depending on TensorFlow
      PHOTOPRISM_DISABLE_FACES: "false" # Disables facial recognition
      PHOTOPRISM_DISABLE_CLASSIFICATION: "false" # Disables image classification
      PHOTOPRISM_DARKTABLE_PRESETS: "false" # Enables Darktable presets and disables concurrent RAW conversion
      PHOTOPRISM_DETECT_NSFW: "false" # Flag photos as private that MAY be offensive (requires TensorFlow)
      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: "(^.^)" # MariaDB database user name
      PHOTOPRISM_DATABASE_PASSWORD: "(^.^)" # MariaDB database user password
      PHOTOPRISM_SITE_URL: "http://localhost:2342/" # Public PhotoPrism URL
      PHOTOPRISM_SITE_TITLE: "PhotoPrism"
      PHOTOPRISM_SITE_CAPTION: "Browse Your Life"
      PHOTOPRISM_SITE_DESCRIPTION: ""
      PHOTOPRISM_SITE_AUTHOR: ""
      # Set a non-root user, group, or custom umask if your Docker environment doesn't support this natively:
      # PHOTOPRISM_UID: 1000
      # PHOTOPRISM_GID: 1000
      # PHOTOPRISM_UMASK: 0000
      # Enable TensorFlow AVX2 support for modern Intel CPUs (requires starting the container as root):
      # PHOTOPRISM_INIT: "tensorflow-amd64-avx2"
      # Hardware video transcoding options:
      # PHOTOPRISM_FFMPEG_BUFFERS: "64" # FFmpeg capture buffers (default: 32)
      # PHOTOPRISM_FFMPEG_BITRATE: "32" # FFmpeg encoding bitrate limit in Mbit/s (default: 50)
      # PHOTOPRISM_FFMPEG_ENCODER: "h264_v4l2m2m" # Use Video4Linux for AVC transcoding (default: libx264)
      # PHOTOPRISM_FFMPEG_ENCODER: "h264_qsv" # Use Intel Quick Sync Video for AVC transcoding (default: libx264)
      # PHOTOPRISM_INIT: "intel-graphics tensorflow-amd64-avx2" # Enable TensorFlow AVX2 & Intel Graphics support
      HOME: "/photoprism"
      # Optional hardware devices for video transcoding and machine learning:
      # devices:
      # - "/dev/video11:/dev/video11" # Video4Linux (h264_v4l2m2m)
      # - "/dev/dri/renderD128:/dev/dri/renderD128" # Intel GPU
      # - "/dev/dri/card0:/dev/dri/card0"
      working_dir: "/photoprism"
      volumes:
      # Your photo and video files ([local path]:[container path]):
      - "C:/AcerC/Pic:/photoprism/originals/Pic" #(^.^)
      - "D:/Bic:/photoprism/originals/Bic" #(^.^)
      # 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"

      mariadb:
      restart: unless-stopped
      image: mariadb:10.5
      security_opt:
      - 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=120
      volumes: # Don't remove permanent storage for index database files!
      - "./database:/var/lib/mysql"
      environment:
      MYSQL_ROOT_PASSWORD: (^.^)
      MYSQL_DATABASE: photoprism
      MYSQL_USER: (^.^)
      MYSQL_PASSWORD: (^.^)

      # Uncomment the following lines to upgrade automatically, whenever there is a new Docker image available:
      #
      # watchtower:
      # restart: unless-stopped
      # image: containrrr/watchtower
      # environment:
      # WATCHTOWER_CLEANUP: "true"
      # 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
  2. Move the “docker-compose.yml” , where you will install the PhotoPrism.

    • E.g : “C:\PhotoPrism”(Win) or “/app/PhotoPrism”(Linux)
  3. Then, to the “docker-compose.yml” directory , execute docker-compose up -d

  4. Final,Open http://localhost:2342/ in a Web browser.

Host with network disk

  • The key is volumes config.
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    services:
    photoprism:
    # ...
    volumes:
    # Map originals folder to NFS:
    - "photoprism-originals:/photoprism/originals" # The photoprism-originals

    #...
    # For Windows / CIFS shares:
    # Write at the end
    volumes:
    photoprism-originals:
    driver: local
    driver_opts:
    type: cifs
    o: "username=user,password=secret,rw"
    device: "//host/folder"
  • Full config such as bottom.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    version: '3.5'

    # Example Docker Compose config file for PhotoPrism (Linux / AMD64)
    #
    # Documentation : https://docs.photoprism.org/getting-started/docker-compose/
    # Docker Hub URL: https://hub.docker.com/r/photoprism/photoprism/
    #
    # IMPORTANT: When installing PhotoPrism on a public server outside your home network, please
    # always run it behind a secure HTTPS reverse proxy like Traefik, Caddy, or NGINX.
    # Your files and passwords will be transmitted in clear text otherwise.
    #
    # DOCKER COMPOSE COMMAND REFERENCE
    # --------------------------------------------------------------------------
    # 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 -f
    # Import | docker-compose exec photoprism photoprism import
    #
    # See https://docs.photoprism.org/getting-started/docker-compose/#command-line-interface for more examples.
    #
    # To search originals for faces without a complete rescan:
    # docker-compose exec photoprism photoprism faces index
    #
    # NOTE: All commands may have to be prefixed with "sudo" when not running as root.
    # This will point the home directory placeholder ~ to /root in volume mounts.

    services:
    # REQUIRED: PhotoPrism Application Server
    photoprism:
    restart: always
    # Use photoprism/photoprism:preview for testing preview builds:
    image: photoprism/photoprism:latest
    depends_on:
    - mariadb
    # Only enable automatic restarts once your installation is properly
    # configured as it otherwise may get stuck in a restart loop:
    # https://docs.photoprism.org/getting-started/faq/#why-is-photoprism-getting-stuck-in-a-restart-loop
    # restart: unless-stopped
    security_opt:
    - seccomp:unconfined
    - apparmor:unconfined
    # Run as a specific, non-root user (see https://docs.docker.com/engine/reference/run/#user):
    # user: "1000:1000"
    ports:
    - "2342:2342" # [server]:[container]
    environment:
    PHOTOPRISM_ADMIN_PASSWORD: "123" # PLEASE CHANGE: Your initial admin password (min 4 characters)
    PHOTOPRISM_SITE_URL: "http://localhost:2342/" # Public URL incl http:// or https:// and /path, :port is optional
    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_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_CHOWN: "false" # Disables storage permission updates on startup
    PHOTOPRISM_DISABLE_WEBDAV: "false" # Disables built-in WebDAV server
    PHOTOPRISM_DISABLE_SETTINGS: "false" # Disables Settings in Web UI
    PHOTOPRISM_DISABLE_TENSORFLOW: "false" # Disables all features depending on TensorFlow
    PHOTOPRISM_DISABLE_FACES: "false" # Disables facial recognition
    PHOTOPRISM_DISABLE_CLASSIFICATION: "false" # Disables image classification
    PHOTOPRISM_DARKTABLE_PRESETS: "false" # Enables Darktable presets and disables concurrent RAW conversion
    PHOTOPRISM_DETECT_NSFW: "false" # Flag photos as private that MAY be offensive (requires TensorFlow)
    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 10.5+ or MySQL 8+ instead of SQLite for improved performance
    PHOTOPRISM_DATABASE_SERVER: "mariadb:3306" # MariaDB or MySQL database server (hostname:port)
    PHOTOPRISM_DATABASE_NAME: "photoprism" # MariaDB or MySQL database schema name
    PHOTOPRISM_DATABASE_USER: "elias" # MariaDB or MySQL database user name
    PHOTOPRISM_DATABASE_PASSWORD: "123" # MariaDB or MySQL database user password
    PHOTOPRISM_SITE_TITLE: "M4PIXI"
    PHOTOPRISM_SITE_CAPTION: "Collection"
    PHOTOPRISM_SITE_DESCRIPTION: ""
    PHOTOPRISM_SITE_AUTHOR: ""
    # Set a non-root user, group, or custom umask if your Docker environment doesn't support this natively:
    # PHOTOPRISM_UID: 1000
    # PHOTOPRISM_GID: 1000
    # PHOTOPRISM_UMASK: 0000
    # Enable TensorFlow AVX2 support for modern Intel CPUs (requires starting the container as root):
    # PHOTOPRISM_INIT: "tensorflow-amd64-avx2"
    # Hardware video transcoding options:
    # PHOTOPRISM_FFMPEG_BUFFERS: "64" # FFmpeg capture buffers (default: 32)
    # PHOTOPRISM_FFMPEG_BITRATE: "32" # FFmpeg encoding bitrate limit in Mbit/s (default: 50)
    # PHOTOPRISM_FFMPEG_ENCODER: "h264_v4l2m2m" # Use Video4Linux for AVC transcoding (default: libx264)
    # PHOTOPRISM_FFMPEG_ENCODER: "h264_qsv" # Use Intel Quick Sync Video for AVC transcoding (default: libx264)
    # PHOTOPRISM_INIT: "intel-graphics tensorflow-amd64-avx2" # Enable TensorFlow AVX2 & Intel Graphics support
    HOME: "/photoprism"
    # Optional hardware devices for video transcoding and machine learning:
    # devices:
    # - "/dev/video11:/dev/video11" # Video4Linux (h264_v4l2m2m)
    # - "/dev/dri/renderD128:/dev/dri/renderD128" # Intel GPU
    # - "/dev/dri/card0:/dev/dri/card0"
    working_dir: "/photoprism"
    volumes:
    # The *originals* folder contains your original photo and video files (- "[host folder]:/photoprism/originals"):
    - "photoprism-originals:/photoprism/originals"
    # Multiple folders can be made accessible by mounting them as subfolders 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]
    # You may mount an *import* folder from which files can be transferred to *originals* (optional):
    # - "~/Import:/photoprism/import"
    # Cache, session, thumbnail, and sidecar files will be created in the *storage* folder (never remove):
    - "./storage:/photoprism/storage"
    # RECOMMENDED: MariaDB Server, see https://docs.photoprism.org/getting-started/faq/#should-i-use-sqlite-mariadb-or-mysql
    mariadb:
    restart: unless-stopped
    image: mariadb:10.6
    security_opt:
    - 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=120
    volumes:
    - "./database:/var/lib/mysql" # Never remove
    environment:
    MYSQL_ROOT_PASSWORD: 123
    MYSQL_DATABASE: photoprism
    MYSQL_USER: elias
    MYSQL_PASSWORD: 123

    # OPTIONAL: Upgrades services automatically, see https://docs.photoprism.org/getting-started/updates/#watchtower
    #
    # watchtower:
    # restart: unless-stopped
    # image: containrrr/watchtower
    # environment:
    # WATCHTOWER_CLEANUP: "true"
    # 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
    volumes:
    photoprism-originals:
    driver: local
    driver_opts:
    type: cifs
    # The IP of your NAS:
    o: "username=elias,password=123,rw"
    # Share path on your NAS:
    device: "//192.168.1.1/pic"

Other

< - 僕らは知らない - >