快轉到主要內容

PhotoPrism,用Docker架設Google相簿替代品

Linux系統 Self-hosting自架 Photo Gallery Google Photo
🗓️ 民國112年 癸卯年
✍ 切換正體/簡體字
目錄

PhotoPrism是開源免費的相簿服務軟體,介面跟Google相簿類似,用於瀏覽電腦上的相片影片。在搜尋時會使用臉孔偵測、AI辨識、地點給圖片分類和上標籤,就像Google相簿自動整理的功能。

PhotoPrism主要特點是自架雲端相簿服務,照片資料都是在本機處理,不會給第三方偷看。如果說自架的 NextCloud專精文件, Jellyfin專精影片的話,PhotoPrism就是專精在相片處理這一塊。

經過幾年開發,PhotoPrism現在已經很好上手了,Docker設定後是開箱即用。應用程式介面靠網頁端存取,手機會自動變換UI,且載入速度接近Google相簿。

這篇文章將會介紹PhotoPrism的特色功能,再簡介如何用Docker在自己電腦部署,取代Google相簿。

1. PhotoPrism功能特色
#

PhotoPrsim可以讀取硬碟現有資料夾,分類後直接顯示在網頁界面的,無需重新「上傳」照片。

使用PhotoPrsim可以同時保有資料夾分類相片與雲端上傳的操作習慣。

PhotoPrism主介面是相片影片總覽,按照圖片拍攝時間排序。可用 搜尋語法過濾圖片。

為方便網頁檢視,PhotoPrism會自動將圖片影片轉碼成快速載入的格式,並會隨螢幕大小自動變化版面。另有非官方開發的手機APP。

點選相片查看/編輯詳細資料,自訂關鍵字。

相片會按照AI辨識的結果打上標籤,我個人覺得辨識最準的就是相片中的小動物了吧。

有標示地點的相片,PhotoPrism會將其彙整並繪製成地圖。

相片搜尋支援用地點和圖片種類過濾,也可以用「顏色」當關鍵字。

最後是我個人最喜歡的功能。除了一次看全部照片外,PhotoPrism能混合硬碟目錄結構管理相片,所以檔案目錄一有變更,PhotoPrism就會重新掃描。當然從PhotoPrism的界面刪除相片,硬碟上的檔案也會跟著刪除。

PhotoPrism支援另一部裝置從網頁端「上傳」到相簿中,還可以使用WebDAV上傳相片。

不過,PhotoPrism有些進階功能是隱藏的,要 付費成為贊助者他們才會開放給您使用。

如果你已經準備好,那就在你的電腦上安裝PhotoPrism吧。

2. 開始安裝PhotoPrism
#

以下內容參考自 PhotoPrism官方說明文件,PhotoPrism支援x86和ARM架構的機器。


  • CPU:Intel i5-7400
  • GPU: Nvidia GTX1050Ti
  • RAM:16GB
  • HDD: 1TB

  1. 於Linux系統安裝 Docker,如果需要GPU加速再安裝 Nvidia顯示卡驅動及Nvidia Container Toolkit

  2. 下載PhotoPrism提供的docker-compose:

wget https://dl.photoprism.app/docker/docker-compose.yml
  1. 編輯docker-compose.yml
vim docker-compose.yml
  1. 首先找到這一段,設定admin的密碼:
services:
  photoprism:
    environment:
      PHOTOPRISM_ADMIN_USER: "admin"
      PHOTOPRISM_ADMIN_PASSWORD: "八位數以上密碼"
  1. 然後設定要掛載到容器內部的目錄。PhotoPrism會從自身originals目錄匯入相片,格式為硬碟相片目錄:容器內部originals目錄,如下所示,將硬碟目錄掛載後PhotoPrism就會直接取用硬碟的相片。
services:
  photoprism:
 ## 冒號左邊是硬碟路徑,右邊是容器內部的路徑。例如將硬碟目錄"TOSHIBA1TB"掛載作為PhotoPrism的"originals"目錄,等同二邊檔案同步
    volumes:
      - "/run/media/ivon/TOSHIBA1TB:/photoprism/originals"
      - "/run/media/ivon/TOSHIBA1TB/DCIM:/photoprism/originals/DCIM"
      - "/run/media/ivon/TOSHIBA1TB/Pictures:/photoprism/originals/Pictures"

 ## storage是存放縮圖資料的路徑,不改的話預設就是存在docker-compose.yml所在的目錄
      - "./storage:/photoprism/storage"

  mariadb:
 ## database是存放資料庫的路徑,不改的話預設就是存在docker-compose.yml所在的目錄
    volumes:
      - "./database:/var/lib/mysql"
  1. 接著設定轉碼器。PhotoPrism會把影片用ffmpeg轉碼以提昇播放效率,這裡不設定的話預設就是軟解。按照 官方文件說明,將docker-compose修改成使用Nvidia顯示卡加速轉碼:
services:
  photoprism:
    environment:
      PHOTOPRISM_FFMPEG_ENCODER: "nvidia"
      PHOTOPRISM_INIT: "gpu tensorflow"
      NVIDIA_VISIBLE_DEVICES: "all"
      NVIDIA_DRIVER_CAPABILITIES: "compute,video,utility"
      ...
    volumes:
      - ...
    deploy:
      resources:
        reservations:
          devices:
            - driver: "nvidia"
              count: 1
              capabilities: [gpu]
  1. 在三個service下方加上restart: 'unless-stopped'設定開機自動啟動容器。
services:
  photoprism:
    restart: 'unless-stopped'
  1. 我完整PhotoPrism的docker-compose.yml如下:
version: '3.5'

services:
  photoprism:
    restart: 'unless-stopped'
    image: photoprism/photoprism:latest
    depends_on:
      - mariadb
    security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
    ports:
      - "2342:2342" # HTTP port (host:container)
    environment:
      PHOTOPRISM_ADMIN_USER: "admin"                 # admin username
      PHOTOPRISM_ADMIN_PASSWORD: "自訂密碼"          # initial admin password (minimum 8 characters)
      PHOTOPRISM_AUTH_MODE: "password"               # authentication mode (public, password)
      PHOTOPRISM_SITE_URL: "http://photoprism.me:2342/"  # server URL in the format "http(s)://domain.name(:port)/(path)"
      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, error, fatal, or panic
      PHOTOPRISM_READONLY: "false"                   # 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_RAW: "false"                # disables indexing and conversion of RAW files
      PHOTOPRISM_RAW_PRESETS: "false"                # enables applying user presets when converting RAW files (reduces performance)
      PHOTOPRISM_JPEG_QUALITY: 85                    # a higher value increases the quality and file size of JPEG images and thumbnails (25-100)
      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_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: "photoprism"         # MariaDB or MySQL database user name
      PHOTOPRISM_DATABASE_PASSWORD: "insecure"       # MariaDB or MySQL database user password
      PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
      PHOTOPRISM_SITE_DESCRIPTION: ""                # meta site description
      PHOTOPRISM_SITE_AUTHOR: ""                     # meta site author
      PHOTOPRISM_INIT: "https gpu tensorflow"
      NVIDIA_VISIBLE_DEVICES: "all"
      NVIDIA_DRIVER_CAPABILITIES: "compute,video,utility"
      PHOTOPRISM_FFMPEG_ENCODER: "nvidia"
    working_dir: "/photoprism"
    volumes:
      - "/run/media/ivon/TOSHIBA1TB:/photoprism/originals"
      - "/run/media/ivon/TOSHIBA1TB/DCIM:/photoprism/originals/DCIM"
      - "/run/media/ivon/TOSHIBA1TB/Pictures:/photoprism/originals/Pictures"
      - "./storage:/photoprism/storage"
    deploy:
      resources:
        reservations:
          devices:
            - driver: "nvidia"
              count: 1
              capabilities: [gpu]

  mariadb:
    restart: 'unless-stopped'
    image: mariadb:10.9
    security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
    command: mysqld --innodb-buffer-pool-size=512M --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"
    environment:
      MARIADB_AUTO_UPGRADE: "1"
      MARIADB_INITDB_SKIP_TZINFO: "1"
      MARIADB_DATABASE: "photoprism"
      MARIADB_USER: "photoprism"
      MARIADB_PASSWORD: "insecure"
      MARIADB_ROOT_PASSWORD: "insecure"

  watchtower:
    restart: 'unless-stopped'
    image: containrrr/watchtower
    profiles: ["update"]
    environment:
      WATCHTOWER_CLEANUP: "true"
      WATCHTOWER_POLL_INTERVAL: 7200
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "~/.docker/config.json:/config.json"
  1. 啟動容器,等待image下載完成。第一次啟動可能要等個幾分鐘才能開啟網頁端登入。
sudo docker compose up -d
  1. 用瀏覽器開啟http://localhost:2342,就會進到PhotoPrism網頁端介面。你也可以透過http://區域IP:2342來存取。

  2. 登入admin帳號,到左下角的系統設定調成中文

  3. 點選左側的收藏庫,開始掃描新相片影片建立資料庫。

  4. 初次索引的時候會狂吃系統資源,RAM不足4GB的電腦記得要給大一點SWAP。1000張相片大約需要幾個小時索引和分類,中間如果有移除目錄,建議也是讓PhotoPrism重新掃描變更。

  5. 如果要停止容器,執行此指令:

cd "docker-compose.yml所在目錄"
sudo docker compose down
  1. 現在本機能存取PhotoPrism了,那麼外部網路要怎麼連線到PhotoPrism呢?我採用內網穿透方式,看 這裡瞭解如何將電腦和手機加入至虛擬區域網路。記得防火牆要開啟2342 TCP通訊埠:
sudo ufw allow 2342/tcp
sudo ufw reload

3. 匯入Google相簿照片至PhotoPrism
#

將Google相簿的相片搬家到PhotoPrism,在那之前要先用第三方程式整理一下。

  1. 使用 GooglePhotosTakeoutHelper整理照片。

  2. 照片整理完後,先將PhotoPrism容器停止

cd "docker-compose.yml所在目錄"
sudo docker compose down
  1. 編輯docker-compose.yml,加入Google相簿的目錄到PhotoPrism。目錄名稱隨意取,下面只是範例。
  volumes:
      - "/run/media/ivon/TOSHIBA1TB/DCIM:/photoprism/originals/DCIM"
      - "/run/media/ivon/TOSHIBA1TB/GooglePhotos:/photoprism/originals/GooglePhotos"
  1. 再啟動容器。登入PhotoPrism網頁,開始掃描新相片。
sudo docker compose up -d

4. PhotoPrism相片管理機制
#

  1. PhotoPrism的主目錄是originals,但在Docker容器內部不好存取。硬碟有個目錄叫做Pictures,你將它掛載到PhotoPrism,PhotoPrism就會將Pictures當作originals目錄使用。

  2. 這樣一來PhotoPrism就會開始處理originals資料夾下的相片,轉檔成較小的格式並寫入到資料庫,也就是網頁端主畫面所看到的那樣。而originals目錄下的相片檔案保持不變。因此你可以建立子目錄,像是originals/family這樣,方便在PhotoPrism的主界面以「資料夾」模式檢視相片。而PhotoPrism的「相簿」功能並不會在硬碟上建立任何目錄,只有PhotoPrism網頁端能看到。

  3. 未來要新增相片,有二種方法:一:把相片傳到硬碟Pictures目錄,再由PhotoPrism掃描新增。二:從PhotoPrism的網頁端上傳相片。

  4. 從PhotoPrism網頁端上傳的相片會跑去哪?PhotoPrism會將其放到originals目錄,以拍攝日期建立目錄。例如foo.webp11/1拍攝的,它就會在originals目錄下建立「11」、「01」的目錄,再把相片檔案放進去。

  5. 由此可見,習慣用「資料夾」分類相片的人,還是採用方法一新增相片到硬碟較好,你可以手動把檔案傳到電腦,或是用 Syncthing這類軟體無線同步。

  6. 在PhotoPrism網頁端刪除相片,硬碟目錄的相片也會刪除,反之亦然。不過PhotoPrism網頁端要刪除相片是選取相片,點選「封存」,進到左側選單的「封存」頁面才能將相片刪除。

  7. 用WebDAV放相片到PhotoPrism的originals目錄後,PhotoPrism每15分鐘會自動索引新相片。

5. 分享PhotoPrism相片 & 用WebDAV上傳相片
#

如果PhotoPrism是架在有網域的伺服器上,選取「相簿」點選分享,別人就可以透過該連結查看相簿。

你可以從網頁端直接下載多張相片。

分享「單張相片」是分享原始畫質的檔案,會得到一個WebDAV連結。

PhotoPrism內建WebDAV伺服器功能,點選分享相片後,用GNOME的Nautilus這類軟體掛載WebDAV,就能存取originals目錄下的檔案。

6. PhotoPrism手機APP
#

手機遠端存取PhotoPrism請記得使用內網穿透軟體,看 這裡

PhotoPrism官方沒有開發APP,僅提供PWA網頁程式,也就是在手機開網頁版,網址為http://電腦虛擬區域IP:2443

不過手機還是有APP用起來比較爽吧,這裡有第三方開發的 PhotoPrism Gallery,界面清爽許多,支援搜尋相簿和標籤。

可惜的是PhotoPrism並沒有直覺的手機備份方案,如果要自動將手機相片備份到電腦目錄,建議使用開源的 Syncthing同步到硬碟目錄,這樣就能給PhotoPrism掃描新相片。

相關文章

好用的開源內網穿透軟體比較,ZeroTier與Tailscale
Linux系統 Self-hosting自架 VPN ZeroTier Tailscale
Tailscale設定教學,免費內網穿透VPN
Linux系統 Self-hosting自架 VPN Tailscale
Docker跑calibre-web,架設閱讀電子書伺服器
Linux系統 Self-hosting自架 calibre Docker

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。