为何选择自托管相册服务?

在数字时代,我们的照片和视频正从数量和体积两个方向以前所未有的速度增长。以前16G的手机存储空间,现在这个数只够计算RAM的容量。主流厂商的手机存储起步均达到128G,面对如此庞大的数据,传统的存储方式不仅面临隐私风险,同时费用也相当可观,还不做到随时随地访问、同步。基于这些问题,我开始寻找一款能在NAS上自托管的相册服务。

经过多轮筛选比较,我最终选择了Immich作为我的主力相册管理解决方案。在本文中,我将全方位分享Immich的独特优势、部署实践以及使用体验,希望能为同样寻求隐私保护和自主控制的你提供有价值的参考。

相册服务横向对比

下面表格,是我使用过的几款可以用于管理相册的服务,表格中列举了几项服务之间的功能对比。

特性维度

Immich

PhotoPrism

Nextcloud Photos

AList

Kodbox (可道云)

核心定位

专业的智能相册管理

专业的智能相册管理

综合云平台中的相册组件

多网盘/存储聚合与文件列表

企业网盘与协同办公平台

AI识别能力

,人脸/物体/场景,支持自定义模型

,内置人脸/物体识别

⚠️ 基础标签识别

❌ 无此功能

⚠️ 可能有限,官方资料未强调AI识图

移动端体验

,原生应用,后台自动同步

⚠️ ,主要依赖PWA网页

⚠️ ,依赖Nextcloud应用

⚠️ 基础,主要为文件访问

支持,有官方移动端应用

视频支持

,原生播放,支持硬解转码

⚠️ ,基础播放

,通常依赖外部播放器

基础,支持在线播放

基础,支持在线播放

多用户与共享

完善,精细的权限与共享相册

⚠️ 基础

完善,继承Nextcloud权限体系

基础,支持用户管理和文件分享

强大,侧重企业团队协作与权限管理

照片备份与管理

核心功能,自动整理、时间线、地图视图

核心功能

核心功能

非核心,仅作为普通文件管理

⚠️ 附带功能,有相册备份但非核心

独特优势

Google Photos式体验,AI高度可定制,活跃开发

开箱即用,AI功能集成度高

与日历、邮件等办公套件无缝集成

聚合管理数十种网盘/存储服务,WebDAV输出

类Windows操作体验,丰富的在线Office预览,强大的企业级权限

NextCloudKodbox属于私有云盘+企业协同办公工具,只是其中包含相册备份管理服务。虽然此类工具能提供类似云网盘、团队协作等功能,但是在相册智能化、专用AI识别、时间线浏览、地理视图等专业功能上,要弱于专业的相册服务,但如果只使用相册服务,又会显得整个服务过于臃肿,因此pass此类工具。

AList重点功能是网盘聚合,可以读取和管理主流网盘的内容,通过精细的路径配置可以做到像使用本地资源管理器一样方便,但如果背后的存储支持还是基于网盘,则有悖于我们搭建自托管相册服务的初衷。

其实从严格意义上来说,只有ImmichPhotoPrism属于相册服务。

重点对比:Immich vs PhotoPrism

1. AI识别能力深度

  • Immich:采用可插拔的机器学习架构,支持接入TensorFlow、PyTorch等框架的自定义模型。用户可以针对特定需求(如识别特定宠物品种、特殊场景)训练和部署专属模型。

  • PhotoPrism:内置识别引擎,功能完整但扩展性有限,无法灵活定制识别模型。

2. 硬件加速支持

  • Immich:对硬件解码有深度优化,支持Intel QSV、NVIDIA NVENC、VA-API等多种方案,视频处理效率极高。

  • PhotoPrism:视频处理能力相对基础,缺少细粒度的硬件加速配置。

3. 移动端体验

  • Immich:提供接近Google Photos的移动端体验,支持后台自动同步、智能相册、离线查看等功能。

  • PhotoPrism:主要依赖PWA(渐进式Web应用),在后台同步和原生体验上有差距。

4. 存储管理

  • Immich:支持存储模板和规则引擎,可按日期、地点、设备等维度自动整理照片。

  • PhotoPrism:采用单一时间线视图,组织方式相对固定。

Immich核心优势详解(来源于DeepSeek总结)

1. 可扩展的机器学习框架

Immich最大的亮点是其模块化的机器学习架构。与封闭的AI系统不同,它允许用户:

  • 自定义人脸识别模型:可以针对家庭成员训练专属识别模型,特别适合识别幼儿(婴儿面部特征变化快,通用模型识别率低)

  • 文本识别(OCR)定制:支持多语言OCR模型,甚至可以训练识别特定手写体的模型

  • 场景识别优化:针对家庭场景优化识别算法,能更准确识别“家庭聚会”、“后院烧烤”等个性化场景

2. 全面的硬件加速支持

我的NAS配置为Intel N100处理器,利用Immich的硬件加速能力:

# 硬件加速配置示例
devices:
  - /dev/dri:/dev/dri  # 共享GPU设备给容器

Immich支持:

  • Intel Quick Sync Video (QSV):高效H.264/H.265编解码

  • NVIDIA CUDA:机器学习推理加速

  • VA-API:开源视频加速接口

  • AMD AMF:AMD显卡加速

实测中,4K视频的缩略图生成速度提升3-5倍,大幅降低CPU负载。

3. 智能存储管理模板

Immich的存储模板系统让文件组织变得优雅:

# 支持的模板变量示例
{year}/{month}/{day}/{filename}          # 按日期组织
{device}/{year}/{month}/{filename}       # 按设备+日期组织
{location}/{year}/{month}/{filename}     # 按地点组织

更强大的是规则引擎:

  • 自动将“截图”移动到专用文件夹

  • 根据GPS信息将旅行照片归类

  • 识别重复照片并标记处理

4. 其他值得关注的优点

原生应用体验

  • iOS/Android应用功能完整,支持后台同步

  • 原生的分享和协作功能

  • 智能相册自动更新

强大的搜索功能

  • 自然语言搜索:“上个月在公园拍的小孩照片”

  • 多条件筛选:人物+地点+时间组合搜索

  • EXIF元数据深度检索

完善的API体系

  • 完整的REST API文档

  • Webhook支持自动化流程

  • 第三方应用集成能力

服务部署详解

这里放下官方的环境建议与要求:

immich支持在任意环境部署,常见的Nas系统如:unRaid、TrueNAS、群晖系统等,如果你的NAS是纯linux,也可以使用docker compose直接进行部署,官方也提供了开箱即用的脚本,方便初学者快速使用。当然在Windows中也可以进行部署,但它是以WSL的形似部署在docker中运行的,大家都不建议这么玩

官方推荐使用docker compose进行部署,后期容器升级管理都相对方便简单,此外官方提供了十分全面的部署脚本。你可以直接使用官方的部署脚本进行部署,如果你的设备配置较高且内存充足,建议使用我的docker-compose.yml脚本,我的脚本中包含了immichweb服务(必须)+redis库(必须)+数据库(必须,immich使用pgSQL,有版本要求,建议使用官方的版本)+immich机器学习服务(非必须)+备份服务(非必须)。

1. 环境准备

首先创建部署目录(如./immich-app),用于存储docker-compose.yml和.env文件:

mkdir -p ./immich-app
cd immich

创建环境配置文件 .env,这里可以下载官方的example.env文件,可以使用下面的命令进行下载,需要注意的是,下载后需要手动修改为.env。

wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env

我的.env:

# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables

# 图片存储目录
UPLOAD_LOCATION=/DataCenter/photo_center/immich/library
# 数据库存储目录(由于immich是以数据为主导,而不是图片为主导,所以要定期备份该目录)
DB_DATA_LOCATION=/DataCenter/photo_center/immich/postgres

# 所使用的软件版本,不修改
IMMICH_VERSION=release

# 数据库链接密码
DB_PASSWORD=****

# 无需修改下面内容
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

TZ=Asia/Shanghai

官方.env:

# You can find documentation for all the supported env variables at https://docs.immich.app/install/environment-variables

# The location where your uploaded files are stored
UPLOAD_LOCATION=./library

# The location where your database files are stored. Network shares are not supported for the database
DB_DATA_LOCATION=./postgres

# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
# TZ=Etc/UTC

# The Immich version to use. You can pin this to a specific version like "v2.1.0"
IMMICH_VERSION=v2

# Connection secret for postgres. You should change it to a random password
# Please use only the characters `A-Za-z0-9`, without special characters or spaces
DB_PASSWORD=postgres

# The values below this line do not need to be changed
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

创建docker compose脚本文件,这里是官方的docker-compose.yml,可以使用下面的命令进行下载,下载后保持名字不变。

wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml

官方docker-compose.yml内容:

#
# WARNING: To install Immich, follow our guide: https://docs.immich.app/install/docker-compose
#
# Make sure to use the docker-compose.yml of the current release:
#
# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
#
# The compose file on main may not be compatible with the latest release.

name: immich

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    # 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
    ports:
      - '2283:2283'
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false

  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:fb8d272e529ea567b9bf1302245796f21a2672b8368ca3fcb938ac334e613c8f
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always

  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

volumes:
  model-cache:

我的docker-compose.yml内容:

name: immich

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:
      - .env
    devices:
      # 容器共享宿主GPU,用于硬解
      - /dev/dri:/dev/dri
    ports:
      - 2283:2283
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false

  immich-machine-learning:
    container_name: immich_machine_learning
    # For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
    # 如果你使用cuda、arm,记得修改这里
    # 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://immich.app/docs/features/ml-hardware-acceleration
    #   file: hwaccel.ml.yml
    #   service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] 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: library/redis:6.2-alpine@sha256:84882e87b54734154586e5f8abd4dce69fe7311315e2fc6d67c29614c8de2672
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always

  database:
    container_name: immich_postgres
    image: 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
    restart: always    
    healthcheck:
      test: pg_isready --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' || exit 1; Chksum="$$(psql --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' --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"]

  backup:
    container_name: immich_db_dumper
    image: prodrigestivill/postgres-backup-local:14
    env_file:
      - .env
    environment:
      POSTGRES_HOST: database
      POSTGRES_CLUSTER: 'TRUE'
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      SCHEDULE: "@daily"
      POSTGRES_EXTRA_OPTS: '--clean --if-exists'
      BACKUP_DIR: /db_dumps
    volumes:
      - /DataCenter/backup_center/immich_db_dumps:/db_dumps
    restart: always
    depends_on:
      - database
    deploy:  
      resources:
        limits:  
          cpus: '1'  
          memory: 256M
volumes:
  model-cache:

2.容器部署

启动容器

docker compose up -d

访问应用

  • 浏览器打开(记得防火墙放行端口):http://你的NAS_IP:2283

  • 首次访问创建管理员账户

  • 创建相册、上传照片

APP下载

登录你的immich后台,可以从这个地方找到下载链接,

当然你也可从下面的链接直接下载

更新容器

需要切换到docker-compose.yml脚本所在目录,请确认更新前服务未在使用。

d

进阶配置与优化建议

硬件加速深度配置

immich支持多种硬件平台:

对于不同硬件平台,Immich提供针对性的优化,请将下面对应平台的内容,内联到docker-compose.yml中的immich-machine-learning上去,如下实例:

immich-machine-learning:
  container_name: immich_machine_learning
  # Note the `-cuda` at the end
  image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-cuda
  # Note the lack of an `extends` section
  deploy:
    resources:
      reservations:
        devices:
          - driver: nvidia
            count: 1
            capabilities:
              - gpu
  volumes:
    - model-cache:/cache
  env_file:
    - .env
  restart: always

ARM NN

先决条件:

  1. 仅支持Mali GPU

  2. 已安装相应的Linux内核驱动

  3. /dev/mali0 可访问。

配置:

services:
  armnn:
    devices:
      - /dev/mali0:/dev/mali0
    volumes:
      - /lib/firmware/mali_csffw.bin:/lib/firmware/mali_csffw.bin:ro # Mali firmware for your chipset (not always required depending on the driver)
      - /usr/lib/libmali.so:/usr/lib/libmali.so:ro # Mali driver for your chipset (always required)
 

NVIDIA GPU配置

先决条件:

  1. GPU算力需≥5.2

  2. 安装nvidia驱动,且版本≥545(支持CUDA 12.3)

配置:

  cuda:
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities:
                - gpu

RK NN配置:

先决条件:

  1. 目前仅支持RK3566、RK3568、RK3576和RK3588.

  2. 需要安装相应内核驱动

  3. RKNPU 驱动 V0.9.8 或更高版本必须在主机服务器中提供

    • 可以通过查看版本来确认查看cat /sys/kernel/debug/rknpu/version

配置:

  rknn:
    security_opt:
      - systempaths=unconfined
      - apparmor=unconfined
    devices:
      - /dev/dri:/dev/dri

  cpu: {}

硬解

支持的平台如下图:

同上,将对应平台的内容内联到docker-compose.yml中的immich-server去,然后执行重启操作:

NVENC配置:

先决条件:

  1. 安装官方驱动

配置:

  nvenc:
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities:
                - gpu
                - compute
                - video

QuickSync(QSV)配置:

先决条件:

  1. 9th以上的CPU

  2. 11th以前的CPU,需要参考该该链接启用低功耗模式。

  3. 11thCPU搭配5.15内核,需要升级内核(摘自Jellyfin文档)

配置:

  quicksync:
    devices:
      - /dev/dri:/dev/dri

RKMPP配置:

配置:

  rkmpp:
    security_opt: # enables full access to /sys and /proc, still far better than privileged: true
      - systempaths=unconfined
      - apparmor=unconfined
    group_add:
      - video
    devices:
      - /dev/rga:/dev/rga
      - /dev/dri:/dev/dri
      - /dev/dma_heap:/dev/dma_heap
      - /dev/mpp_service:/dev/mpp_service
      #- /dev/mali0:/dev/mali0 # only required to enable OpenCL-accelerated HDR -> SDR tonemapping
    volumes:
      #- /etc/OpenCL:/etc/OpenCL:ro # only required to enable OpenCL-accelerated HDR -> SDR tonemapping
      #- /usr/lib/aarch64-linux-gnu/libmali.so.1:/usr/lib/aarch64-linux-gnu/libmali.so.1:ro # only required to enable OpenCL-accelerated HDR -> SDR tonemapping

自定义模型部署

参考自这篇文章:Immich 智能搜索 - 支持中文的 CLIP 大模型 | 一起玩 NAS!

这个链接中,有Immich目前支持的模型列表:immich-app (Immich)

新版immich支持直接修改模型名称,然后自动拉取模型,只要模型名称和网络都没问题即可。

操作步骤:

在immich后台 管理 -> 设置 -> 机器学习设置 -> 智能搜索 -> CLIP 模型中粘贴模型名称(XLM-Roberta-Large-Vit-B-16Plus),点击保存。之后在 任务 中重新运行 智能搜索 任务。

下图是我immich服务的相关配置截图,仅供参考:

六、总结与展望

经过一年多的深度使用

Immich不仅满足了我对私有相册的所有期待,其灵活的架构还为未来的扩展提供了无限可能。相比商业云服务,Immich在保护隐私的同时,通过开源社区的力量不断进化。

值得称赞的特性

  1. 真正尊重用户数据主权

  2. 模块化设计便于功能扩展

  3. 活跃的社区和持续的更新

  4. 接近商业产品的用户体验

待改进的方面

  1. 初始设置对新手有一定门槛

  2. 移动端某些高级功能仍需完善

  3. 文档虽然完整,但中文支持可以加强

对于正在考虑自托管相册服务的你,我建议:

  • 如果重视AI识别和移动体验 → 选择Immich

  • 如果偏好简单部署和稳定 → 考虑PhotoPrism

  • 如果已有Nextcloud生态 → 使用Nextcloud Photos

在数据隐私日益重要的今天,掌握自己数字记忆的控制权不仅是一种技术选择,更是一种生活态度。Immich为我们提供了这样一条路径:既不牺牲便利性,又能守护珍贵记忆。


部署资源

希望这篇详尽的指南能帮助你顺利部署属于自己的智能相册系统。如果有任何问题或心得,欢迎在评论区交流分享!