快轉到主要內容

Immich 部署、設定與反向代理 - Google 相簿的最佳開源替代方案

··2091 字·5 分鐘
容器化平台 Docker Immich Nginx Proxy Manager
目錄

這篇文章介紹如何使用 Docker Compose 和 Portainer 部署 Immich,並提供優化臺灣繁體中文地名反向地理編碼、設定影片轉碼與機器學習硬體加速 (以 NVIDIA 為例),以及更換機器學習模型的詳細步驟。

前言
#

這個筆記中,我參考 Immich 官方文件 中 docker compose 的做法,使用 Portainer 來部署 Immich (包含 immich-server, immich-machining-learning, redis 和 postgres)。因此在開始之前,請確認已經安裝 Docker, Docker Compose ,並部署 Portainer 容器。

部署 Immich
#

  1. 在 Portainer 中增新一個新的 stack,名稱為 immich

  2. stack 的內容為:

    services:
      immich-server:
        container_name: immich_server
        image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
        volumes:
          - ${UPLOAD_LOCATION}:/usr/src/app/upload
          - /etc/localtime:/etc/localtime:ro
        env_file:
          - stack.env
        ports:
          - "2283:2283"
        depends_on:
          - redis
          - database
        restart: always
        healthcheck:
          disable: false
    
      immich-machine-learning:
        container_name: immich_machine_learning
        image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
        volumes:
          - model-cache:/cache
        env_file:
          - stack.env
        restart: always
        healthcheck:
          disable: false
    
      redis:
        container_name: immich_redis
        image: docker.io/redis:6.2-alpine@sha256:905c4ee67b8e0aa955331960d2aa745781e6bd89afc44a8584bfd13bc890f0ae
        healthcheck:
          test: redis-cli ping || exit 1
        restart: always
    
      database:
        container_name: immich_postgres
        image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
        environment:
          POSTGRES_PASSWORD: ${DB_PASSWORD}
          POSTGRES_USER: ${DB_USERNAME}
          POSTGRES_DB: ${DB_DATABASE_NAME}
          POSTGRES_INITDB_ARGS: '--data-checksums'
        volumes:
          - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
        healthcheck:
          test: >-
            pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1;
            Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align
            --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')";
            echo "checksum failure count is $$Chksum";
            [ "$$Chksum" = '0' ] || exit 1
          interval: 5m
          start_interval: 30s
          start_period: 5m
        command: >-
          postgres
          -c shared_preload_libraries=vectors.so
          -c 'search_path="$$user", public, vectors'
          -c logging_collector=on
          -c max_wal_size=2GB
          -c shared_buffers=512MB
          -c wal_compression=on
        restart: always
    
    volumes:
      model-cache:
    
  3. 編輯 Environment variables:

    1. 點擊 Environment variables 並切換至 Advanced mode。隨後,貼上下面的內容:

      UPLOAD_LOCATION=/IMMICH_DATA_LOCATION
      DB_DATA_LOCATION=/IMMICH_DB_LOCATION
      IMMICH_VERSION=release
      DB_PASSWORD=postgres
      DB_USERNAME=postgres
      DB_DATABASE_NAME=immich
      
    2. 根據個人偏好,設定以下參數:

      1. UPLOAD_LOCATION: 相片庫與資料的存放位置 (如 /mnt/smb/immich)。我個人是設定在通過 SMB 掛載 NAS 的位置。
      2. DB_DATA_LOCATION: postgres database 的位置 (如 /appdata/immich/postgres)。這個我是直接放在本機硬碟中。
      3. TZ: 時區 (Asia/Taipei)。

      NOTE: 其餘參數不需要修改。

  4. 啟動 stack,即可完成 Immich 的基本部署。

    進階的調整,可以參考後續章節。

優化反向地理編碼資料(中文化+臺灣地名顯示優化)
#

參考我的臺灣繁體中文化專案 RxChi1d/immich-geodata-zh-tw 設定 Immich 的 docker compose file。

在這個專案中,將地名翻譯為臺灣大眾習慣之繁體中文名稱之外,也優化了臺灣的行政區表示,使其可以準確地顯示出縣市以及鄉鎮市區。除此之外,也使用 中華民國國土測繪中心 的開放資料取代 geodata 的開放資料,藉此更精準的反解臺灣的地名。

  1. 停止 stack。

  2. 在 stack 設定中添加 entrypoint

    services:
      immich_server:
       container_name: immich_server
    
       # 其他配置省略
    
       entrypoint: [ "tini", "--", "/bin/bash", "-c", "bash <(curl -sSL https://raw.githubusercontent.com/RxChi1d/immich-geodata-zh-tw/refs/heads/main/update_data.sh) --install && exec /bin/bash start.sh" ]
    
       # 其他配置省略
       ```
    
  3. 啟動 stack。

    通過添加 entrypoint 設定,未來每次重啟 stack,在 immich_server 容器啟動時,會自動下載並安裝最新版本的臺灣中文化地理資料。

提示

如果是簡體中文或中國的用戶可以參考 ZingLix/immich-geodata-cn ,該專案除了簡體中文翻譯之外,亦有針對中國地區之地名進行優化。

影片轉碼硬體加速
#

警告

安裝之前需要先安裝顯示卡的驅動程式與容器驅動。 以 NVIDIA 顯示卡為例: 需安裝 NVIDIA Driver 以及 NVIDIA Container Toolkit

  1. 停止stack。

  2. 下載設定檔:

    從官網下載 hwaccel.transcoding.yml ,並將其放置到指定位置 (如 /appdata/immich/hwaccel.transcoding.yml)。

  3. 編輯 stack:

    添加 extends,並根據自己的硬體修改 service 的值。(Intel iGPU: quicksync, NVIDIA GPU: nvenc)。

    immich-server:
        container_name: immich_server
        image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
        extends:
          file: /mnt/user/appdata/immich/hwaccel.transcoding.yml
          service: nvenc # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
    
        # 其他配置省略
    
    如果是 NVDIA 的顯示卡還需要加上:
    immich-server:
    
        # 其他配置省略
    
        runtime: nvidia
        environment:
            - NVIDIA_VISIBLE_DEVICES=all
        	  
        # 其他配置省略
    
  4. 啟動 stack。

  5. 設定硬體加速的設備:

    設定影片轉碼硬體加速對應的選項

機器學習硬體加速
#

本篇使用 NVIDIA 的顯示卡實作。

如果是使用其他的硬體,或需要更詳細的參考文件,可以參考官方的 Hardware-Accelerated Machine Learning

  1. 停止 stack。

  2. 下載設定檔:

    從官網下載 hwaccel.ml.yml ,並將其放置到指定位置 (如 /mnt/user/appdata/immich/hwaccel.ml.yml)。

  3. 編輯 stack:

    1. image:

      映像名稱字尾根據硬體加上後綴 -cuda

      # For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
      # Example tag: ${IMMICH_VERSION:-release}-cuda
      
      image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-cuda
      
    2. extends:

      加入 extends,並根據硬體更改 service 的值。(NVDIA GPU: cuda, Intel GPU: openvino)。

      immich-machine-learning:
        # 其他配置省略
      
        extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
          file: /mnt/user/appdata/immich/hwaccel.ml.yml
          service: cuda # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
      
        # 其他配置省略
      
    注意

    immich-machine-learning 容器「不需要」加上 runtime=nvidiaNVIDIA_VISIBLE_DEVICES=all 變數。

  4. 啟動 stack。

    注意

    機器學習硬體加速設定後,「不需要」在 WebUI 中做額外的設定。

更換機器學習模型
#

詳細內容可以參考 Immich 官方文件的 Searching

CLIP
#

  1. 選擇模型:

    由於預設的 ViT-B-32__openai 模型對於中文的適配性不足,因此需要選擇支援多語言的 CLIP 模型。

    官方文件 中,有提供各語言中,不同模型的準確度比較表格,其中也有詳細報告顯存需求以及推理時間,用戶可以根據需求選擇。(所有模型可以參考 Immich Hugging Face 的 CLIPMultilingual CLIP

    這邊我們可以參考「簡體中文」的表格來進行選擇。如果顯存足夠的話,可以直接選表現最好的模型 nllb-clip-large-siglip__v1

    模型的簡體中文性能比較表
    模型的簡體中文性能比較表

  2. 設定模型:

    在設定頁面中,機器學習設定智慧搜尋CLIP 模型,填入所需模型的名稱即可。

    提示
    • 無需自行下載模型,immich-machine-learning 容器會在 Immich 需要調用模型時自動下載對應的模型。
    • 剛設定完後,可以在手動執行一次 智慧搜尋 作業,並在 immich-machine-learning 容器的 log 中查看是否有自動下載模型,並載入。

人臉辨識模型
#

詳細模型清單可以參考 Immich Hugging Face 的 Facial Recognition

目前根據網路上的消息稱 antelopev2 的效果最佳。

由於官方沒有提供顯存開銷,這邊我提供我自己測試的結果供大家參考:

資訊
  • 測試顯卡為 NVIDIA Tesla P4。
  • 由於並非特別將環境設定至顯卡空佔用,因此需要將表格的值扣除初始顯存開銷 (約 0.416 GiB) 才比較接近模型本身的顯存佔用。
  • 「儲存開銷欄位」表示模型的檔案大小。
  • Facial Recognition (按大小降序排序)
    Name顯存開銷 (GiB) (要減0.416)儲存開銷 (M)
    antelopev21.955265
    buffalo_l1.680183
    buffalo_m1.428170
    buffalo_s0.99616

Nginx Proxy Manager 反向代理
#

未完待續…

相關文章

Nginx Proxy Manager Monitor (NPM Monitor) - 通過 Grafana 監控 NPM 的代理狀態

··1239 字·3 分鐘
容器化平台 Docker Nginx Proxy Manager 監控
這篇文章介紹如何使用 Promtail、Loki 和 Grafana 建立 Nginx Proxy Manager 的監控系統,透過解析 Nginx 日誌並將數據視覺化,以便追蹤流量、狀態等資訊。內容包含部署 Grafana、Loki、Promtail,配置 Nginx Proxy Manager 的 geoip2 和 json log,以及在 Grafana 中設定資料來源和匯入 Dashboard。

Docker Container Monitor - 通過 Grafana 監視 Docker 容器的狀態

··838 字·2 分鐘
容器化平台 Docker Grafana 監控
這篇文章詳細介紹如何利用 Prometheus、Node Exporter、cAdvisor 和 Grafana 搭建一套完整的 Docker 容器監控系統。內容涵蓋建立 Docker 網路、準備 Prometheus 設定檔、使用 Docker Compose 部署監控服務,以及在 Grafana 中設定資料來源與匯入儀表板,幫助使用者有效監控 Docker 容器的效能與狀態。

Grafana 基本部署

··127 字·1 分鐘
容器化平台 Docker Grafana
本文介紹如何使用 Docker 部署 Grafana,包含創建資料夾、設定 docker compose 以及登入初始化步驟。