架設 Immich 網路相簿系統

因為需求,需要保存活動相片。

Immich 相片影片管理系統是個很不錯的解決方案。軟體介面與操作習慣都和 Google 相簿相差不遠。目前被許多人視為 Google Photos 的最佳替代選擇。而且使用者除了使用網頁管理相片外,也可透過下載行動裝置的 APP 來管理相片影片。

Immich 系統架設目前支援多種方式,我選擇使用 Docker。

建置步驟如下:

  1. 建立 docker目標資料夾,並切換到該資料夾
  2. mkdir /usr/local/www/docker-site/immich-app;
    cd /usr/local/www/docker-site/immich-app

  3. 下載官方 docker-compose.yml
  4. wget https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml

  5. 下載範例環境變數檔
  6. wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env

  7. 編輯 .env 檔案
  8. # 照片與影片儲存位置(建議用絕對路徑,並確保有足夠空間)
    UPLOAD_LOCATION=/mnt/your-drive/immich/library

    # 資料庫儲存位置(⚠️ 必須是本地 SSD,不可放在 NAS)
    DB_DATA_LOCATION=/mnt/your-ssd/immich/postgres

    # 設定時區(台灣請設 Asia/Taipei)
    TZ=Asia/Taipei

    # Immich 版本,建議固定為 v3 或指定版本號
    IMMICH_VERSION=v3

    # 資料庫密碼(請改成隨機強密碼,只能用 A-Z、a-z、0-9,不能有特殊符號或空格)
    DB_PASSWORD=YourStrongPassword123

    # 以下通常不用改
    DB_USERNAME=postgres
    DB_DATABASE_NAME=immich

    # 讓 Immich 知道它運行在反向代理後面
    #IMMICH_TRUSTED_PROXIES=192.168.1.0/24,10.0.0.0/8
    IMMICH_TRUSTED_PROXIES=127.0.0.1

    ##沒設 TRUSTED_PROXIES:任何人說「我是幫別人傳話的」,警衛都相信,容易被騙(IP 偽造)
    ##設了 TRUSTED_PROXIES:警衛只相信「這幾個人」傳來的話,而且會去讀他們附帶的「真正訪客名單」

  9. 編輯 docker.compose.yaml 檔案
  10. 
    name: immich
    
    services:
      immich-server:
        container_name: immich_server
        image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    
        ## 取消註解可啟用硬體加速影片轉碼,支援 nvenc(NVIDIA)、quicksync(Intel)、rkmpp(Rockchip)、vaapi(AMD/Intel)等。
        # extends:
        #   file: hwaccel.transcoding.yml
        #   service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
    
        volumes:
          # Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
          - ${UPLOAD_LOCATION}:/data
          - /etc/localtime:/etc/localtime:ro
        env_file:
          - .env
    
        ## 對內對外皆是跑 2283 埠
        ports:
          - '2283:2283'
    
        depends_on:
          - redis
          - database
        restart: always
        healthcheck:
          disable: false
    
    ## AI 模型服務,這是負責人臉辨識、CLIP 圖片搜尋、OCR 文字辨識的獨立服務。
      immich-machine-learning:
        container_name: immich_machine_learning
    
        # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
        # Example tag: ${IMMICH_VERSION:-release}-cuda
        image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    
        # extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/features/ml-hardware-acceleration
        #   file: hwaccel.ml.yml
        #   service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the -wsl version for WSL2 where applicable
        volumes:
          - model-cache:/cache
        env_file:
          - .env
        restart: always
        healthcheck:
          disable: false
    
    ## — 快取資料庫
      redis:
        container_name: immich_redis
        image: docker.io/valkey/valkey:9@sha256:8e8d64b405ce18f41b8e5ee20aa4687a8ed0022d1298f2ce31cdcf3a76e09411
        healthcheck:
          test: redis-cli ping || exit 1
        restart: always
    
    ## PostgresSQL 資料庫
      database:
        container_name: immich_postgres
        image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
        environment:
          POSTGRES_PASSWORD: ${DB_PASSWORD}
          POSTGRES_USER: ${DB_USERNAME}
          POSTGRES_DB: ${DB_DATABASE_NAME}
          POSTGRES_INITDB_ARGS: '--data-checksums'
          # Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs
          # DB_STORAGE_TYPE: 'HDD'
        volumes:
          # Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
          - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
        shm_size: 128mb
        restart: always
        healthcheck:
          disable: false
    
    volumes:
      model-cache:
    

     

  11. 啟動 docker
  12. docker compose up -d

    若想要停止此服務:
    docker compose down

  13. 完成初始化
  14. 開啟瀏覽器,訪問 http://<你的伺服器IP>:2283
    首次登入,第一個建立的便是 管理員帳號
    登入後即可開始使用

 

網站轉址設置

雖然網頁相簿服務已設置完成,但由於提供Immich網路相簿系統的 Web Server (Apache2) 對外僅提供 443 埠通道,所以此服務必須要透過轉址,才能正常提供服務。

  1. 先啟用必須模組
  2. sudo a2enmod proxy
    sudo a2enmod proxy_http

    # WebSocket 支援(即時通知需要)
    sudo a2enmod proxy_wstunnel

    # 若使用 HTTPS
    sudo a2enmod ssl

    # 標頭處理
    sudo a2enmod headers

    sudo systemctl restart apache2

  3. 建立 VirtualHost 設定檔
  4. 建立與編修 /etc/apache2/sites-available/immich.conf

    
    
        ServerName photos.yourdomain.com
        
        # 強制轉 HTTPS(建議)
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
    
    
    
        ServerName photos.yourdomain.com
        
        # SSL 憑證(Let's Encrypt 或自簽)
        SSLEngine on
        SSLCertificateFile     /etc/letsencrypt/live/photos.yourdomain.com/fullchain.pem
        SSLCertificateKeyFile  /etc/letsencrypt/live/photos.yourdomain.com/privkey.pem
        
        # 安全標頭
        Header always set X-Frame-Options "SAMEORIGIN"
        Header always set X-Content-Type-Options "nosniff"
        Header always set Referrer-Policy "strict-origin-when-cross-origin"
        
        # 反向代理到 Immich
        ProxyPreserveHost On
        ProxyPass         / http://localhost:2283/
        ProxyPassReverse  / http://localhost:2283/
        
        # WebSocket 支援(即時上傳進度、通知等)
        RewriteEngine On
        RewriteCond %{HTTP:Upgrade} websocket [NC]
        RewriteCond %{HTTP:Connection} upgrade [NC]
        RewriteRule ^/?(.*) "ws://localhost:2283/$1" [P,L]
        
        # 日誌
        ErrorLog  ${APACHE_LOG_DIR}/immich-error.log
        CustomLog ${APACHE_LOG_DIR}/immich-access.log combined
    
    
    

     

  5. 啟用與測試
  6. # 其實只是 sudo ln -s /etc/apache2/sites-available/immich.conf /etc/apache2/sites-enabled/immich.conf
    sudo a2ensite immich.conf

    # 確認語法正確
    sudo apache2ctl configtest
    sudo systemctl reload apache2

 

匯入 Goole Drive 和 Google 相簿相片

若想將已存放在 Google 相簿 或 Google Drive 的相片匯入 Immich 網路相簿裡,不管是何者,整個歷程來說,會分成「匯出舊相片」與「匯入新相片」兩個動作。

  1. 匯出舊相片
  2. 若是 Google 相簿,可以利用Google takeout工具來匯出,可參看這一篇紀錄:利用 Google takeout 打包備份資料

    若是 Google Drive 的相片,就以相片資料夾為單位進行下載,這些資料夾內相片會先進行壓縮,然後才會被下載。

    以上兩種方式,下載回來的資料皆是 zip 壓縮檔,不必解開。

  3. 下載相片批次上傳工具:immich-go
  4. # 下載最新版(以 Linux amd64 為例)
    wget https://github.com/simulot/immich-go/releases/latest/download/immich-go_Linux_x86_64.tar.gz

    #解壓縮
    tar -xzf immich-go_Linux_x86_64.tar.gz

    #賦予檔案可執行屬性
    chmod +x immich-go

  5. 取得 immich 的 api-key
  6. 登入Immich 網頁版後,點選右上角頭像 –> Account Settings –>左側選 API Keys → New API Key

    複製產生的金鑰,然後存起來。

  7. 匯入 Google 相簿
  8. 
    ./immich-go upload from-google-photos \
      --server=http://localhost:2283 \
      --api-key=你的API金鑰 \
      --manage-raw-jpeg=StackCoverRaw \
      --manage-burst=Stack \
      /path/to/takeout-001.zip \
      /path/to/takeout-002.zip \
      /path/to/takeout-003.zip
      /path/to/takeout-*.zip
    
    

     

    這個方法會完整保留:
    ✅ Google Photos 相簿名稱
    ✅ 收藏(Favorites)
    ✅ 拍攝日期與時間
    ✅ GPS 地理位置
    ✅ 照片描述

  9. 匯入 Google Drive 的相片
  10. 
    ./immich-go upload from-folder \
      --server=http://localhost:2283 \
      --api-key=你的API金鑰 \
      --folder-as-album=FOLDER  ##會把每個子資料夾變成 Immich 的相簿 \
      /path/to/下載的照片資料夾-001.zip \
      /path/to/下載的照片資料夾-002.zip \
      /path/to/下載的照片資料夾-003.zip \
      /path/to/下載的照片資料夾-004.zip \
    
    

     

    檔案上傳中:

    完成圖:

  11. 如果照片很多(幾萬張以上),建議加上這些參數避免伺服器過載:
  12. code>
    ./immich-go upload from-google-photos \
      --server=http://localhost:2283 \
      --api-key=你的API金鑰 \
      --concurrent-tasks=4 \
      --client-timeout=60m \
      --pause-immich-jobs=true \
      --on-errors=continue \
      --session-tag \
      /path/to/takeout-*.zip
    
    

     

    參數說明:

    • –concurrent-tasks=4,同時上傳 4 個檔案,降低伺服器負擔
    • –pause-immich-jobs=true,暫停 Immich 背景工作(縮圖、人臉辨識),匯入完再自動恢復
    • –on-errors=continue,遇到錯誤繼續,不中斷整批匯入
    • –session-tag,為這次匯入加上標籤,方便日後管理

備份與復原

資料庫備份,有兩種方法:

  1. 進入資料庫容器執行 pg_dump
  2. docker exec -t immich_postgres pg_dumpall -c -U postgres > immich_db_$(date +%Y%m%d).sql

  3. 直接執行 pg_dump
  4. docker exec immich_postgres pg_dumpall -c -U postgres > /backup/immich/db/immich_$(date +\%Y\%m\%d).sql

資料庫復原,兩種作法

  1. 直接復原
  2. cat /backup/immich/db/immich_20260830.sql | docker exec -i immich_postgres psql -U postgres

  3. 匯入容器復原
  4. # 把備份檔複製進容器
    docker cp /backup/immich/db/immich_20260830.sql immich_postgres:/tmp/backup.sql

    # 進入容器執行復原
    docker exec -i immich_postgres psql -U postgres -f /tmp/backup.sql

postgresql 資料庫觀念小技巧:
1. 備份 = pg_dumpall 匯出 SQL
2. 復原 = psql 讀入 SQL

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*