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
於Linux系統安裝 Docker,如果需要GPU加速再安裝 Nvidia顯示卡驅動及Nvidia Container Toolkit。
下載PhotoPrism提供的docker-compose:
wget https://dl.photoprism.app/docker/docker-compose.yml
- 編輯
docker-compose.yml
:
vim docker-compose.yml
- 首先找到這一段,設定admin的密碼:
services:
photoprism:
environment:
PHOTOPRISM_ADMIN_USER: "admin"
PHOTOPRISM_ADMIN_PASSWORD: "八位數以上密碼"
- 然後設定要掛載到容器內部的目錄。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"
- 接著設定轉碼器。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]
- 在三個service下方加上
restart: 'unless-stopped'
設定開機自動啟動容器。
services:
photoprism:
restart: 'unless-stopped'
- 我完整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"
- 啟動容器,等待image下載完成。第一次啟動可能要等個幾分鐘才能開啟網頁端登入。
sudo docker compose up -d
用瀏覽器開啟
http://localhost:2342
,就會進到PhotoPrism網頁端介面。你也可以透過http://區域IP:2342
來存取。登入admin帳號,到左下角的系統設定調成中文
點選左側的收藏庫,開始掃描新相片影片建立資料庫。
初次索引的時候會狂吃系統資源,RAM不足4GB的電腦記得要給大一點SWAP。1000張相片大約需要幾個小時索引和分類,中間如果有移除目錄,建議也是讓PhotoPrism重新掃描變更。
如果要停止容器,執行此指令:
cd "docker-compose.yml所在目錄"
sudo docker compose down
- 現在本機能存取PhotoPrism了,那麼外部網路要怎麼連線到PhotoPrism呢?我採用內網穿透方式,看 這裡瞭解如何將電腦和手機加入至虛擬區域網路。記得防火牆要開啟2342 TCP通訊埠:
sudo ufw allow 2342/tcp
sudo ufw reload
3. 匯入Google相簿照片至PhotoPrism#
將Google相簿的相片搬家到PhotoPrism,在那之前要先用第三方程式整理一下。
使用 GooglePhotosTakeoutHelper整理照片。
照片整理完後,先將PhotoPrism容器停止
cd "docker-compose.yml所在目錄"
sudo docker compose down
- 編輯
docker-compose.yml
,加入Google相簿的目錄到PhotoPrism。目錄名稱隨意取,下面只是範例。
volumes:
- "/run/media/ivon/TOSHIBA1TB/DCIM:/photoprism/originals/DCIM"
- "/run/media/ivon/TOSHIBA1TB/GooglePhotos:/photoprism/originals/GooglePhotos"
- 再啟動容器。登入PhotoPrism網頁,開始掃描新相片。
sudo docker compose up -d
4. PhotoPrism相片管理機制#
PhotoPrism的主目錄是
originals
,但在Docker容器內部不好存取。硬碟有個目錄叫做Pictures
,你將它掛載到PhotoPrism,PhotoPrism就會將Pictures
當作originals
目錄使用。這樣一來PhotoPrism就會開始處理
originals
資料夾下的相片,轉檔成較小的格式並寫入到資料庫,也就是網頁端主畫面所看到的那樣。而originals
目錄下的相片檔案保持不變。因此你可以建立子目錄,像是originals/family
這樣,方便在PhotoPrism的主界面以「資料夾」模式檢視相片。而PhotoPrism的「相簿」功能並不會在硬碟上建立任何目錄,只有PhotoPrism網頁端能看到。未來要新增相片,有二種方法:一:把相片傳到硬碟
Pictures
目錄,再由PhotoPrism掃描新增。二:從PhotoPrism的網頁端上傳相片。從PhotoPrism網頁端上傳的相片會跑去哪?PhotoPrism會將其放到
originals
目錄,以拍攝日期建立目錄。例如foo.webp
是11/1
拍攝的,它就會在originals
目錄下建立「11」、「01」的目錄,再把相片檔案放進去。由此可見,習慣用「資料夾」分類相片的人,還是採用方法一新增相片到硬碟較好,你可以手動把檔案傳到電腦,或是用 Syncthing這類軟體無線同步。
在PhotoPrism網頁端刪除相片,硬碟目錄的相片也會刪除,反之亦然。不過PhotoPrism網頁端要刪除相片是選取相片,點選「封存」,進到左側選單的「封存」頁面才能將相片刪除。
用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掃描新相片。